智能合约调用示例
故事是這樣的,有5個小伙伴,他們為 黃豆芽, 黑豆芽,綠豆芽 中的哪種最好吃發生了分歧,于是它們準備發起一個投票。但是大家都希望投票的過程是完全去中心化的…最后他們決定使用區塊鏈智能合約來解決這個問題
準備工作
- 啟動geth(為了更快的打包,建議dev模式),新建5個賬戶,并把defaultAccount(如果沒有設置一般為eth.accounts[0]) 解鎖,保證defaultAccount賬戶里面有一定的資產
- 把合約部署(合約代碼戳這里)上去,樓主這里使用的是?truffle部署合約,其它的方式也是可以的;另外,部署合約的時候,需要給構造器傳一個數組參數,樓主這里給的是?var proposalNames = ['huangDY', 'lvDY', 'heiDY'];?即3個候選選項
上述 Ballot 后面那串即合約存儲地址
開始調用
此處要展示的是一個投票的全過程
合建合約實例
var ballotInstance = eth.contract(abi).at(addr);addr 和 abi是分別賦值為合約存儲地址 和 合約abi的變量。此過程不是一個交易,所以無需繼續挖礦
驗證合約實例是否正確
["0x6875616e67445900000000000000000000000000000000000000000000000000", 0] > web3.toUtf8('0x6875616e67445900000000000000000000000000000000000000000000000000') "huangDY"可以看到合約已經部署上去了,實例也已成功。如果把參數換為 1、2可以分別得到另外兩個候選項
分配投票權
這里先給 eth.account[1] 分配投票權
> ballotInstance.giveRightToVote.sendTransaction(eth.accounts[1], "xiaoA", {from:eth.accounts[0], gas:4700000}); I1226 21:08:07.308936 internal/ethapi/api.go:1047] Tx(0xe7fa31e646f6aefe804f3fc4bf3563a05993c58609270210590f62a5f5b03703) to: 0x6b2ddc515fc610690e34dfbd4915698b75add647 "0xe7fa31e646f6aefe804f3fc4bf3563a05993c58609270210590f62a5f5b03703"注意,這里如果是第一次調用使用合約方法一定要加gas參數 否則會調用失敗。可以看到這是一個新的交易,繼續挖礦,讓礦工打包…驗證一下,投票權是否已經分配成功
> ballotInstance.voters(eth.accounts[1]) ["0x7869616f41000000000000000000000000000000000000000000000000000000", false, 0, 1482757798, 0] > web3.toUtf8('0x7869616f41000000000000000000000000000000000000000000000000000000'); "xiaoA"如上,eth.accounts[1] 已經分配了投票權。繼續,給其它4個賬戶也分配權限,分配完之后查看一下
> ballotInstance.votersNum() 5開始投票
此步驟需要保證參與投票的賬戶都有資產,否則調用合約方法的時候會失敗。這里先用 eth.accounts[0] 給1號綠豆芽(序號是從0開始的)投票
> ballotInstance.vote.sendTransaction(1, {from:eth.accounts[0], gas:4700000}) I1226 21:24:02.752948 internal/ethapi/api.go:1047] Tx(0xddb8efc2083b32fca5bdf99877408638fb1fa2ba95be221473653e234ca0b6a5) to: 0x6b2ddc515fc610690e34dfbd4915698b75add647 "0xddb8efc2083b32fca5bdf99877408638fb1fa2ba95be221473653e234ca0b6a5"繼續挖礦,待打包后查看下投票是否成功
> ballotInstance.winningProposalIndex() 1 > ballotInstance.winnerName() "0x6c76445900000000000000000000000000000000000000000000000000000000" > web3.toUtf8('0x6c76445900000000000000000000000000000000000000000000000000000000'); "lvDY"可以看到,票數最多的是lvDY, 其它默認是0票。可以繼續再用其它的賬戶進行投票,并查看最終的投票結果
原文地址: https://bitshuo.com/topic/58611e404dea36e72c1b3786
總結
- 上一篇: 以太坊geth结构解析和源码分析
- 下一篇: Truffle3.0集成NodeJS并完