以太坊系列之十一: 零起步使用remix开发智能合约
一步一步使用remix開發(fā)智能合約
最新版的remix(2017-8-3)只能使用在線開發(fā)了,已經(jīng)沒有離線版本了,并且好像在線版本要FQ才能訪問(自行解決).
1.打開remix
注意地址如果是https開頭的,要換成http,否則就沒法訪問本地的http rpc了.
remix地址,打開以后會看到一個Ballot.sol文件,這是一個測試投票程序
2.打開本地的geth
本地的geth記得一定要開啟rpc,下面是我自己的參數(shù)
ggeth.exe --datadir=d:/privnet --networkid 89120348581 --rpc --rpccorsdomain "*" --rpcapi "eth,admin,web3,net,debug"--rpc 表示啟動http rpc通道,否則只有本地ipc通道
--rpccorsdomain "*" 是允許跨域訪問,否則http://ethereum.github.io/在對http://localhost:8545進(jìn)行 http rpc通信時會被瀏覽器阻塞
--rpcapi "eth,admin,web3,net,debug" 由于安全起見,geth啟動http rpc的時候是禁止了admin,debug等模塊的,而我們想要通過remix來調(diào)試solidity就必須給與這些權(quán)限.
3. 配置remix
remix的Contract標(biāo)簽下的Environment不能是默認(rèn)的Javascript VM,這樣是沒法運(yùn)行智能合約的,必須選擇Web3 Provider,另一個Injected Web3在我電腦上點(diǎn)了沒有任何反應(yīng),不曉得什么原因.
具體如下圖:
這時候瀏覽器會提示你鏈接http://localhost:8545 , 這時候確保你的geth已經(jīng)啟動,并且添加了--rpc參數(shù),這里如果訪問的是https://ethereum.github.io/browser-solidity,
還是會失敗的,因為瀏覽器會禁止在https模式下去訪問http地址.
如果成功,那么你就可以在Account下拉框中看到你自己的賬戶信息,如果沒有看到那就是上面的某個步驟出錯了.
4. 部署合約
點(diǎn)擊Create按鈕就可以創(chuàng)建合約了.
這時候最常見的錯誤有兩個,一是賬戶沒有解鎖,那你就在geth console中調(diào)用personal.unlockAccount來解鎖;二是余額不足.
當(dāng)然還有一個就是如果你是在私鏈上,記得要啟動miner,否則會一直不成功.
成功以后,就會看到下面的信息
會告訴你在花費(fèi)了多少gas,合約的地址等信息.
還有就是下面會出現(xiàn)合約可以調(diào)用的函數(shù),這時候你就可以切換上面的賬戶進(jìn)行合約調(diào)用了.和普通的函數(shù)調(diào)用差不多.
就是要記得,這個是發(fā)生在區(qū)塊鏈上的,每次調(diào)用都會花費(fèi)以太幣.
5.調(diào)試合約
調(diào)試也就是分步執(zhí)行某個事務(wù),這里的事務(wù)實際上就是一次合約調(diào)用,我這里使用的合約如下:
pragma solidity ^0.4.0; contract Donation {address owner;event fundMoved(address _to, uint _amount);modifier onlyowner { if (msg.sender == owner) _; }address[] _giver;uint[] _values;function Donation() {owner = msg.sender;}function donate() payable {addGiver(msg.value);}function moveFund(address _to, uint _amount) onlyowner {if (_amount <= this.balance) {if (_to.send(this.balance)) {fundMoved(_to, _amount);} else {throw;}} else {throw;}}function addGiver(uint _amount) internal {_giver.push(msg.sender);_values.push(_amount);} }create 成功以后會出現(xiàn)兩個調(diào)用按鈕,donate和moveFund兩個外部可調(diào)用函數(shù). 其中donate是沒有參數(shù)的,moveFund要有兩個參數(shù).
點(diǎn)擊donate,會在區(qū)塊鏈上執(zhí)行該調(diào)用,結(jié)果如下:
可以看到該事務(wù)發(fā)生在4471區(qū)塊上,在該區(qū)塊中的事務(wù)索引是0(因為是私鏈,肯定只會有這一個事務(wù)).
有了這些信息,我們就可以去調(diào)試這個調(diào)用
切換到Debugger模塊:
如果按鈕下面有一個The method debug_traceTransaction does not exist/is not available,那是因為geth啟動的時候沒有添加參數(shù)
--rpcapi "eth,admin,web3,net,debug"
這時候我們就可以在代碼中設(shè)置好斷點(diǎn),然后啟動,程序就會停在斷點(diǎn)處,我們可以在右側(cè)的Solidity State中看到變量的變化.如果想要比較好的調(diào)試,還是需要懂一些evm的指令.
否則這樣的調(diào)試感覺也意義不大,和js中按照語句調(diào)試不一樣,這里主要是針對指令的調(diào)試,一句簡單的_giver.push(msg.sender);需要十幾條指令.
當(dāng)然以后隨著remix的發(fā)展,調(diào)試應(yīng)該會做的越來越好.
轉(zhuǎn)載于:https://www.cnblogs.com/baizx/p/7280224.html
總結(jié)
以上是生活随笔為你收集整理的以太坊系列之十一: 零起步使用remix开发智能合约的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js Math用法jquery是否为空对
- 下一篇: UVA 11100 The Trip,