新聞中心
本篇內(nèi)容主要講解“以太坊Dapp開發(fā)方法是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“以太坊Dapp開發(fā)方法是什么”吧!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了金鳳免費(fèi)建站歡迎大家使用!
一、區(qū)塊鏈
1. 分布式去中心化
比特幣設(shè)計(jì)的初衷就是要避免依賴中心化的機(jī)構(gòu),沒有發(fā)行機(jī)構(gòu),也不可能操縱發(fā)行數(shù)量。既然沒有中心化的信用機(jī)構(gòu),在電子貨幣運(yùn)行的過程中,也勢(shì)必需要一種機(jī)制來(lái)認(rèn)可運(yùn)行在區(qū)塊鏈上的行為(包括比特幣的運(yùn)營(yíng),亦或是運(yùn)行在區(qū)塊鏈上的其他業(yè)務(wù)),這種機(jī)制就是共識(shí)機(jī)制。在完全去中心化的區(qū)塊鏈上運(yùn)行的比特幣,采用的是PoW(Proof of Work,工作量證明),該機(jī)制完美的解決了拜占庭將軍問題(存在異常的情況下仍能達(dá)成一致)。因?yàn)榛A(chǔ)網(wǎng)絡(luò)架構(gòu)為分布式,對(duì)單獨(dú)一個(gè)節(jié)點(diǎn)是無(wú)法控制或破壞整個(gè)網(wǎng)絡(luò),掌握網(wǎng)內(nèi)51%的運(yùn)算能力(非節(jié)點(diǎn)數(shù))才有可能操作交易,而這個(gè)代價(jià)大概要超過270億美元。
2. 無(wú)須信任
整個(gè)區(qū)塊鏈網(wǎng)絡(luò)中的數(shù)據(jù)是公開透明的,每個(gè)節(jié)點(diǎn)(參與者)都可自由加入該網(wǎng)絡(luò)中,下載到所有的數(shù)據(jù)。任意兩個(gè)節(jié)點(diǎn)間的數(shù)據(jù)交換無(wú)需互相信任,完全依靠區(qū)塊鏈中的交易歷史和數(shù)據(jù)的可追溯,以及共識(shí)機(jī)制來(lái)保證數(shù)據(jù)交換的正確且不可逆的執(zhí)行。
3. 不可篡改和加密安全性
跟當(dāng)前銀行網(wǎng)銀系統(tǒng)(特別是公司網(wǎng)銀系統(tǒng))的加密機(jī)制類似,區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)和交易流程中大量的使用了公私鑰來(lái)加解密,保證數(shù)據(jù)的安全性?;谠摷夹g(shù)基礎(chǔ),甚至可以應(yīng)用群組簽名來(lái)保證共有數(shù)據(jù)的安全性。任何事物既然有優(yōu)點(diǎn),也同時(shí)會(huì)存在不足之處。根源于分布式網(wǎng)絡(luò)架構(gòu)和共識(shí)機(jī)制,在區(qū)塊鏈上運(yùn)行的交易確認(rèn)時(shí)間會(huì)比較長(zhǎng)(比特幣的確認(rèn)時(shí)間大概是15分鐘),交易并發(fā)數(shù)受限(比特幣的每秒交易數(shù)為7筆,而淘寶的每秒并發(fā)數(shù)能達(dá)到10萬(wàn)左右),區(qū)塊的容量限制(當(dāng)前為1M,區(qū)塊鏈的擴(kuò)容一直在討論中),監(jiān)管難以介入,基于工作量證明的共識(shí)機(jī)制存在浪費(fèi)系統(tǒng)資源和帶寬的問題。
4. 區(qū)塊鏈技術(shù)
a. 區(qū)塊
區(qū)塊是一個(gè)包含在區(qū)塊鏈(公開賬簿)里的聚合了交易信息的容器。它由一個(gè)包含元數(shù)據(jù)的區(qū)塊頭和緊跟其后的構(gòu)成區(qū)塊主體的一長(zhǎng)串交易組成。區(qū)塊頭是80字節(jié),而平均每個(gè)交易至少是250字節(jié),而且平均每個(gè)區(qū)塊至少包含超過500個(gè)交易。 區(qū)塊結(jié)構(gòu)如下圖
交易(Tx)詳情中的結(jié)構(gòu)如下圖
b. 區(qū)塊鏈
當(dāng)一個(gè)節(jié)點(diǎn)從網(wǎng)絡(luò)接受到傳入的區(qū)塊時(shí),它會(huì)驗(yàn)證這些區(qū)塊,然后鏈接到現(xiàn)有的區(qū)塊鏈上,鏈接的形態(tài)如下圖:
由于每個(gè)區(qū)塊包含前一個(gè)區(qū)塊的HASH值,這就使得從創(chuàng)世塊到當(dāng)前塊形成了一條塊鏈,每個(gè)區(qū)塊必定按時(shí)間順序跟隨在前一個(gè)區(qū)塊之后,因?yàn)槿绻恢狼耙粔K區(qū)塊的HASH值就沒法生成當(dāng)前區(qū)塊。要改變一個(gè)已經(jīng)在塊鏈中存在一段時(shí)間的區(qū)塊,從計(jì)算上來(lái)說(shuō)是不可行的,因?yàn)槿绻桓淖?,它之后的每個(gè)區(qū)塊必須隨之改變。這些特性使得雙花比特幣非常困難,區(qū)塊鏈?zhǔn)潜忍貛诺淖畲髣?chuàng)新。
5. 比特幣錢包
a. 比特幣錢包的生成
首先使用隨機(jī)數(shù)發(fā)生器生成一個(gè) 私鑰 。一般來(lái)說(shuō)這是一個(gè)256bits的數(shù),擁有了這串?dāng)?shù)字就可以對(duì)相應(yīng) 錢包地址 中的比特幣進(jìn)行操作,所以必須被安全地保存起來(lái)。
私鑰經(jīng)過SECP256K1算法處理生成了公鑰。SECP256K1是一種橢圓曲線算法,通過一個(gè)已知私鑰時(shí)可以算得公鑰,而公鑰已知時(shí)卻無(wú)法反向計(jì)算出私鑰。這是保障比特幣安全的算法基礎(chǔ)。
同SHA256一樣,RIPEMD160也是一種Hash算法,由公鑰可以計(jì)算得到公鑰哈希,而反過來(lái)是行不通的。
將一個(gè)字節(jié)的地址版本號(hào)連接到公鑰哈希頭部(對(duì)于比特幣網(wǎng)絡(luò)的pubkey地址,這一字節(jié)為“0”),然后對(duì)其進(jìn)行兩次SHA256運(yùn)算,將結(jié)果的前4字節(jié)作為公鑰哈希的校驗(yàn)值,連接在其尾部。
將上一步結(jié)果使用BASE58進(jìn)行編碼(比特幣定制版本),就得到了錢包地址。
流程圖如下
b .轉(zhuǎn)賬
比特幣錢包間的轉(zhuǎn)賬是通過交易(Transaction)實(shí)現(xiàn)的。交易數(shù)據(jù)是由轉(zhuǎn)出錢包私鑰的所有者生成,也就是說(shuō)有了私鑰就可以花費(fèi)該錢包的比特幣余額。生成交易的過程如下:
交易的原始數(shù)據(jù)包括“轉(zhuǎn)賬數(shù)額”和“轉(zhuǎn)入錢包地址”,但是僅有這些是不夠的,因?yàn)闊o(wú)法證明交易的生成者對(duì)“轉(zhuǎn)出錢包地址”余額有動(dòng)用的權(quán)利。所以需要用私鑰對(duì)原始數(shù)據(jù)進(jìn)行簽名。
生成“轉(zhuǎn)出錢包公鑰”,這一過程與生成錢包地址的第2步是一樣的。
將“轉(zhuǎn)出簽名”和“轉(zhuǎn)出公鑰”添加到原始交易數(shù)據(jù)中,生成了正式的交易數(shù)據(jù),這樣它就可以被廣播到比特幣網(wǎng)絡(luò)進(jìn)行轉(zhuǎn)賬了。
二、以太坊Ethereum
1. 概念
a. 什么是以太坊
簡(jiǎn)單來(lái)說(shuō),以太坊是一種新的法律形式?,F(xiàn)行法律的本質(zhì)是一種合約。它是由(生活于某一社群的)人和他們的領(lǐng)導(dǎo)者之間所締結(jié)的,一種關(guān)于彼此該如何行動(dòng)的共識(shí)。個(gè)體之間也存在著一些合約,這些合約可以理解為一種私法,相應(yīng)的,這種私法僅對(duì)合約的參與者生效。
例如,你和一個(gè)人訂立合約,借給他一筆錢,但他最后毀約了,不打算還這筆錢。此時(shí)你多半會(huì)將對(duì)方告上法庭。在現(xiàn)實(shí)生活中,打官司這種事情常?;靵y不堪并且充滿了不確定性。將對(duì)方告上法庭,也通常意味著你需要支付高昂的費(fèi)用聘請(qǐng)律師,來(lái)幫你在法庭上針對(duì)法律條文展開辯論,而且這一過程一般都曠日持久。而且,即使你最終贏了官司,你依然可能會(huì)遇到問題(比如,對(duì)方拒不執(zhí)行法庭判決)。 令人欣慰的是,當(dāng)初你和借款人把條款寫了下來(lái),訂立了合約。但法律的制定者和合約的起草者們都必須面對(duì)一個(gè)不容忽視的挑戰(zhàn):那就是,理想情況下,法律或者合約的內(nèi)容應(yīng)該是明確而沒有歧義的,但現(xiàn)行的法律和合約都是由語(yǔ)句構(gòu)成的,而語(yǔ)句,則是出了名的充滿歧義。 因此,一直以來(lái),現(xiàn)行的法律體系都存在著兩個(gè)巨大的問題:首先,合約或法律是由充滿歧義的語(yǔ)句定義的,第二,強(qiáng)制執(zhí)行合約或法律的代價(jià)非常大。 而以太坊,通過數(shù)字貨幣和編程語(yǔ)言的結(jié)合,解決了現(xiàn)行法律體系的這兩大問題。 以太坊系統(tǒng)自身帶有一種叫做以太幣(Ether)的數(shù)字貨幣。以太幣和著名的數(shù)字貨幣比特幣(Bitcoin)有著非常多的相似之處。兩者均為數(shù)字儲(chǔ)值貨幣,且無(wú)法偽造,都以去中心化的方式運(yùn)行來(lái)保證貨幣供應(yīng)不被某一方所控制。兩者都可以像電子郵件一樣,作為貨幣自由地在全世界流通。而且,由于它們可以做到傳統(tǒng)貨幣做不到的事情,因此用戶對(duì)它們未來(lái)的價(jià)值充滿期待 。
另外: 1.詳情請(qǐng)閱讀以太坊白皮書 (中文, 英文)。 2.以太坊教程
b. 基本知識(shí)
公鑰加密系統(tǒng)。 Alice有一把公鑰和一把私鑰。她可以用她的私鑰創(chuàng)建數(shù)字簽名,而Bob可以用她的公鑰來(lái)驗(yàn)證這個(gè)簽名確實(shí)是用Alice的私鑰創(chuàng)建的,也就是說(shuō),確實(shí)是Alice的簽名。當(dāng)你創(chuàng)建一個(gè)以太坊或者比特幣錢包的時(shí)候,那長(zhǎng)長(zhǎng)的0xdf...5f地址實(shí)質(zhì)上是個(gè)公鑰,對(duì)應(yīng)的私鑰保存某處。類似于Coinbase的在線錢包可以幫你保管私鑰,你也可以自己保管。如果你弄丟了存有資金的錢包的私鑰,你就等于永遠(yuǎn)失去了那筆資金,因此你最好對(duì)私鑰做好備份。
點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)。 就像BitTorrent, 以太坊分布式網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都地位平等,沒有中心服務(wù)器。
區(qū)塊鏈。 區(qū)塊鏈就像是一個(gè)全球唯一的帳簿,或者說(shuō)是數(shù)據(jù)庫(kù),記錄了網(wǎng)絡(luò)中所有交易歷史。
以太坊虛擬機(jī)(EVM)。 它讓你能在以太坊上寫出更強(qiáng)大的程序(比特幣上也可以寫腳本程序)。它有時(shí)也用來(lái)指以太坊區(qū)塊鏈,負(fù)責(zé)執(zhí)行智能合約以及一切。
節(jié)點(diǎn)。 你可以運(yùn)行節(jié)點(diǎn),通過它讀寫以太坊區(qū)塊鏈,也即使用以太坊虛擬機(jī)。完全節(jié)點(diǎn)需要下載整個(gè)區(qū)塊鏈。輕節(jié)點(diǎn)仍在開發(fā)中。
礦工。 挖礦,也就是處理區(qū)塊鏈上的區(qū)塊的節(jié)點(diǎn)。這個(gè)網(wǎng)頁(yè)可以看到當(dāng)前活躍的一部分以太坊礦工:stats.ethdev.com。
工作量證明。 礦工們總是在競(jìng)爭(zhēng)解決一些數(shù)學(xué)問題。第一個(gè)解出答案的(算出下一個(gè)區(qū)塊)將獲得以太幣作為獎(jiǎng)勵(lì)。然后所有節(jié)點(diǎn)都更新自己的區(qū)塊鏈。所有想要算出下一個(gè)區(qū)塊的礦工都有與其他節(jié)點(diǎn)保持同步,并且維護(hù)同一個(gè)區(qū)塊鏈的動(dòng)力,因此整個(gè)網(wǎng)絡(luò)總是能達(dá)成共識(shí)。(注意:以太坊正計(jì)劃轉(zhuǎn)向沒有礦工的權(quán)益證明系統(tǒng)(POS),不過那不在本文討論范圍之內(nèi)。)
以太幣。 縮寫ETH。一種你可以購(gòu)買和使用的真正的數(shù)字貨幣。這里是可以交易以太幣的其中一家交易所的走勢(shì)圖。在寫這篇文章的時(shí)候,1個(gè)以太幣價(jià)值65美分。
Gas. 在以太坊上執(zhí)行程序以及保存數(shù)據(jù)都要消耗一定量的以太幣,Gas是以太幣轉(zhuǎn)換而成。這個(gè)機(jī)制用來(lái)保證效率。
DApp. 以太坊社區(qū)把基于智能合約的應(yīng)用稱為去中心化的應(yīng)用程序(Decentralized App)。DApp的目標(biāo)是(或者應(yīng)該是)讓你的智能合約有一個(gè)友好的界面,外加一些額外的東西,例如IPFS(可以存儲(chǔ)和讀取數(shù)據(jù)的去中心化網(wǎng)絡(luò),不是出自以太坊團(tuán)隊(duì)但有類似的精神)。DApp可以跑在一臺(tái)能與以太坊節(jié)點(diǎn)交互的中心化服務(wù)器上,也可以跑在任意一個(gè)以太坊平等節(jié)點(diǎn)上。這里分享一個(gè)以太坊DApp教程,可以高效的學(xué)習(xí)如何開發(fā)一個(gè)DApp,很適合入門。
2. 工作流程
a. 環(huán)境搭建
建議使用Mac OS環(huán)境,不然可能會(huì)出現(xiàn)各種坑。
安裝NodeJS,安裝Python。
安裝testrpc(測(cè)試環(huán)境中使用),安裝go-ethereum(真實(shí)環(huán)境中使用)。
安裝solc。
安裝truffle。
如果是windows的話建議用工具ethbox可以一鍵安裝以太坊開發(fā)環(huán)境的工具: ethbox
b. Solidity語(yǔ)言簡(jiǎn)介
下面是官網(wǎng)上面的一段關(guān)于智能投票合約的示例代碼
contract Ballot { //一個(gè)選民的構(gòu)造體 struct Voter { uint weight; // 權(quán)重(即他可以投幾票) bool voted; //是否已經(jīng)投過票 address delegate; // 代表地址(他可以代表某個(gè)人進(jìn)行投票) uint vote; // index of the voted proposal } // 投票的提案的構(gòu)造體 struct Proposal { bytes32 name; // 提案名稱 uint voteCount; //獲得的票數(shù) } address public chairperson;//會(huì)議主席 //地址 -選民 的map mapping(address => Voter) public voters; // 投票種類的動(dòng)態(tài)數(shù)組 Proposal[] public proposals; ///構(gòu)造函數(shù) function Ballot(bytes32[] proposalNames) { chairperson = msg.sender;//初始化會(huì)議主席 voters[chairperson].weight = 1; //初始化所有的提案 for (uint i = 0; i < proposalNames.length; i++) { proposals.push(Proposal({ name: proposalNames[i], voteCount: 0 })); } } // 給予投票權(quán) function giveRightToVote(address voter) returns (bool b) { if (msg.sender != chairperson || voters[voter].voted) { //對(duì)于會(huì)議主席和已經(jīng)投過票的選民這里不處理 return false;; } voters[voter].weight = 1; return true; } /// 投票權(quán)轉(zhuǎn)移函數(shù) function delegate(address to) { // 投票權(quán)轉(zhuǎn)移的發(fā)起人 Voter sender = voters[msg.sender]; if (sender.voted) throw; //遞歸找到?jīng)]有轉(zhuǎn)移投票權(quán)的 選民 while ( voters[to].delegate != address(0) && voters[to].delegate != msg.sender ) { to = voters[to].delegate; } if (to == msg.sender) { throw; } //將發(fā)起人設(shè)置為已經(jīng)投過票的狀態(tài) sender.voted = true; //將代表設(shè)置為剛才遞歸獲取的選民 sender.delegate = to; Voter delegate = voters[to]; if (delegate.voted) { //如果代表已經(jīng)投過票就在他投票的提案的票數(shù)增加 proposals[delegate.vote].voteCount += sender.weight; } else { //將代表的的票數(shù)增加 delegate.weight += sender.weight; } } /// 投票函數(shù) function vote(uint proposal) { Voter sender = voters[msg.sender]; if (sender.voted) throw; sender.voted = true; sender.vote = proposal; //將投的提案票數(shù)增加 proposals[proposal].voteCount += sender.weight; } ///獲得票數(shù)最多的提案 function winningProposal() constant returns (uint winningProposal) { uint winningVoteCount = 0; for (uint p = 0; p < proposals.length; p++) { if (proposals[p].voteCount > winningVoteCount) { winningVoteCount = proposals[p].voteCount; winningProposal = p; } } } }
解讀
address. 地址類型。chairperson是會(huì)議主席的錢包地址。這個(gè)地址會(huì)在合約的構(gòu)造函數(shù)function Ballot()中被賦值。很多時(shí)候也稱呼這種地址為'owner'(所有人)。
public. 這個(gè)關(guān)鍵字表明變量可以被合約之外的對(duì)象使用。private修飾符則表示變量只能被本合約(或者衍生合約)內(nèi)的對(duì)象使用。如果你想要在測(cè)試中通過web3.js使用合約中的某個(gè)變量,記得把它聲明為public。
Mapping或數(shù)組。mapping(address => Voter)為選民錢包地址和選民構(gòu)造體的鍵值對(duì)。Proposal[] public proposals是一個(gè)提案構(gòu)造體的數(shù)組。
有特殊的變量和函數(shù)總是在全局命名空間存在,主要用于提供有關(guān)blockchain信息,例如msg,block,tx,其中msg.sender為發(fā)起人的地址。
solidity語(yǔ)言更深入的理解可以閱讀官方文檔。
c. 使用geth部署合約
啟動(dòng)一個(gè)測(cè)試節(jié)點(diǎn)
geth --testnet --fast --cache=512 --genesis CustomGenesis.json console
這里的CustomGenesis.json是為了給測(cè)試的賬戶分配以太幣
{ "coinbase": "0x0000000000000000000000000000000000000000", "difficulty": "0x20000", "extraData": "", "gasLimit": "0x2fefd8", "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp": "0x00", "alloc": { "0xe49c283bc6bf92c5833cc981b97679238dd3b5da": { "balance": "111111111000000000000000000000000000" }, "0xd8927c296b3ebe454a6409770a0c323ec4ed23ba": { "balance": "222222222000000000000000000000000000" } } }
solc下的內(nèi)容要替換成你的測(cè)試賬戶地址。具體geth的用法請(qǐng)查看官方文檔和源碼介紹。
使用solc編譯智能合約,獲得二進(jìn)制代碼 例如以下代碼
contract test { function multiply(uint a) returns(uint d) { return a * 7; } }
在geth中輸入
source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
clientContract = eth.compile.solidity(source).test
編譯返回的結(jié)果的JSON格式如下
其中,
code:編譯后的EVM字節(jié)碼
info:編譯器返回的metadata
abiDefination:Application Binary Interface定義。具體接口規(guī)則參見這里
compilerVersion:編譯此代碼的solidity編譯器版本
developerDoc:針對(duì)開發(fā)者的Natural Specification Format,類似于Doxygen
language:合約語(yǔ)言
languageVersion:合約語(yǔ)言版本
source:源代碼
userDoc:針對(duì)用戶的Ethereum的Natural Specification Format。
編譯器返回的JSON結(jié)構(gòu)反映了合約部署的兩種不同的路徑。info信息真實(shí)的存在于區(qū)中心化的云中,作為metadata信息來(lái)公開驗(yàn)證Blockchain中合約代碼的實(shí)現(xiàn)。而code信息通過創(chuàng)建交易的方式部署到區(qū)塊鏈中。
使用solc編譯智能合約,獲得二進(jìn)制代碼 部署合約前,確保你有一個(gè)解鎖的賬戶并且賬戶中有余額,因?yàn)椴渴鸷霞s得過程中會(huì)消耗以太幣。輸入web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")可以查看賬戶余額。 解鎖一個(gè)賬戶
personal.unlockAccount(eth.accounts[0])
獲得賬戶
primaryAddress = eth.accounts[0]
定義一個(gè)abi (abi是個(gè)js的數(shù)組,否則不成功)
abi = [{ constant: false, inputs: [{ name: 'a', type: 'uint256' } ]}]
創(chuàng)建智能合約
MyContract = eth.contract(abi)
發(fā)送交易部署合約
contract = MyContract.new({from: primaryAddress, data:"0x6060604052602a8060106000396000f3606060405260e060020a6000350463c6888fa18114601a575b005b6007600435026060908152602090f3"})
如果交易被pending,如圖說(shuō)明你的miner沒有在挖礦
啟動(dòng)一個(gè)礦工 miner.setEtherbase(eth.primaryAddress) //設(shè)定開采賬戶 miner.start(8)
eth.getBlock("pending", true).transactions 這時(shí)候發(fā)現(xiàn)交易已經(jīng)在區(qū)塊中
不過會(huì)發(fā)現(xiàn),交易還是pending,這是因?yàn)樵摻灰讌^(qū)塊沒有人協(xié)助進(jìn)行運(yùn)算驗(yàn)證,這時(shí)候只需要再啟動(dòng)一個(gè)礦工就行了 miner.start(8)
與合約進(jìn)行交互
Multiply7 = eth.contract(clientContract.info.abiDefinition); var myMultiply7 = Multiply7.at(contract.address); myMultiply7.multiply.call(3) 或 myMultiply7.multiply.sendTransaction(3, {from: contract.address})
d. 使用truffle框架
使用truffle部署智能合約的步驟:
truffle init (在新目錄中) => 創(chuàng)建truffle項(xiàng)目目錄結(jié)構(gòu),
編寫合約代碼,保存到contracts/YourContractName.sol文件。 例如Ballot .sol,此時(shí)要找到migrations文件夾,在deploy_contracts.js文件中添加deployer.deploy(Ballot);
truffile compile 編譯合約代碼。
啟動(dòng)以太坊節(jié)點(diǎn)(例如在另一個(gè)終端里面運(yùn)行testrpc)。
truffle migrate(在truffle項(xiàng)目目錄中)。
1. 編寫單元測(cè)試
在test文件夾中新建ballot.js文件
contract('Ballot',function(accounts)){ //accounts是所以賬戶得數(shù)值 it("獲取投票權(quán)",function(){ var meta = Ballot.deployed(); return meta.giveRightToVote(accounts[1]).then(function(b){ assert.equal(Boolean(b),true,"獲取投票權(quán)失敗"); }); }); }
在項(xiàng)目根目錄下運(yùn)行truffle test,你應(yīng)該看到測(cè)試通過,如果使用自己構(gòu)造的ballot對(duì)象,可以這樣寫:
contract('Ballot',function(accounts)){ //accounts是所以賬戶得數(shù)值 it("獲取投票權(quán)",function(){ var proposals = []; proposals.push("proposal0"); Ballot.new(proposals).then(function(meta){ return meta.giveRightToVote(accounts[1]).then(function(b){ assert.equal(Boolean(b),true,"獲取投票權(quán)失敗"); }); }); }); }
合約中發(fā)送以太幣。 this是合約實(shí)例的地址,以變接下來(lái)檢查這個(gè)地址的余額(或者直接使用this.balance)
當(dāng)你通過web3.js調(diào)用交易函數(shù)時(shí)(使用web3.eth.sendTransaction),交易并不會(huì)立即執(zhí)行。事實(shí)上交易會(huì)被提交到礦工網(wǎng)絡(luò)中,交易代碼直到其中一位礦工產(chǎn)生一個(gè)新區(qū)塊把交易記錄進(jìn)區(qū)塊鏈之后才執(zhí)行。因此你必須等交易進(jìn)入?yún)^(qū)塊鏈并且同步回本地節(jié)點(diǎn)之后才能驗(yàn)證交易執(zhí)行的結(jié)果。用testrpc的時(shí)候可能看上去是實(shí)時(shí)的,因?yàn)闇y(cè)試環(huán)境很快,但是正式網(wǎng)絡(luò)會(huì)比較慢。
Gas. (譯注:以太坊上的燃料,因?yàn)榇a的執(zhí)行必須消耗Gas。直譯為汽油比較突兀,故保留原文做專有名詞。)直到現(xiàn)在我們都沒有涉及Gas的概念,因?yàn)樵谑褂胻estrpc時(shí)通常不需要顯式的設(shè)置。當(dāng)你轉(zhuǎn)向geth和正式網(wǎng)絡(luò)時(shí)會(huì)需要。在交易函數(shù)調(diào)用中可以在{ from: _, value: _, gas: _ } 對(duì)象內(nèi)設(shè)置Gas參數(shù)。Web3.js提供了web3.eth.gasPrice調(diào)用來(lái)獲取當(dāng)前Gas的價(jià)格,Solidity編譯器也提供了一個(gè)參數(shù)讓你可以從命令行獲取合約的Gas開銷概要:solc --gas YouContract.sol.
2. 為合約創(chuàng)建一個(gè)界面
在app目錄中,可以編寫自己的html和js文件,js與智能合約的交互與單元測(cè)試基本一致,例如一個(gè)界面上有一個(gè)輸入框和一個(gè)按鈕,獲得選民的投票權(quán)。
Ballot App Ballot
Example Truffle Dapp
Send
app.js中的代碼為
function getRight() { var account = document.getElementById("account").value; var meta = Ballot.deployed(); meta.giveRightToVote(account).then(function(b){ if(Boolean(b)){ setStatus("Get Right Vote Success"); }else{ setStatus("Get Right Vote Error"); } }).catch(function(e){ setStatus("Get Right Vote Error"); console.log(e); }); };
到此,相信大家對(duì)“以太坊Dapp開發(fā)方法是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
名稱欄目:以太坊Dapp開發(fā)方法是什么
分享網(wǎng)址:http://fisionsoft.com.cn/article/gedsgi.html