以太坊系列之十一: 零起步使用remix開發智能合約


一步一步使用remix開發智能合約

最新版的remix(2017-8-3)只能使用在線開發了,已經沒有離線版本了,並且好像在線版本要翻牆才能訪問(自行解決).

1.打開remix

注意地址如果是https開頭的,要換成http,否則就沒法訪問本地的http rpc了.
remix地址,打開以后會看到一個Ballot.sol文件,這是一個測試投票程序

2.打開本地的geth

本地的geth記得一定要開啟rpc,下面是我自己的參數

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進行 http rpc通信時會被瀏覽器阻塞
--rpcapi "eth,admin,web3,net,debug" 由於安全起見,geth啟動http rpc的時候是禁止了admin,debug等模塊的,而我們想要通過remix來調試solidity就必須給與這些權限.

3. 配置remix

remix的Contract標簽下的Environment不能是默認的Javascript VM,這樣是沒法運行智能合約的,必須選擇Web3 Provider,另一個Injected Web3在我電腦上點了沒有任何反應,不曉得什么原因.
具體如下圖:
選擇Web3 Provider
這時候瀏覽器會提示你鏈接http://localhost:8545 , 這時候確保你的geth已經啟動,並且添加了--rpc參數,這里如果訪問的是https://ethereum.github.io/browser-solidity,
還是會失敗的,因為瀏覽器會禁止在https模式下去訪問http地址.

如果成功,那么你就可以在Account下拉框中看到你自己的賬戶信息,如果沒有看到那就是上面的某個步驟出錯了.

4. 部署合約

點擊Create按鈕就可以創建合約了.
這時候最常見的錯誤有兩個,一是賬戶沒有解鎖,那你就在geth console中調用personal.unlockAccount來解鎖;二是余額不足.
當然還有一個就是如果你是在私鏈上,記得要啟動miner,否則會一直不成功.

成功以后,就會看到下面的信息
合約創建成功
會告訴你在花費了多少gas,合約的地址等信息.
還有就是下面會出現合約可以調用的函數,這時候你就可以切換上面的賬戶進行合約調用了.和普通的函數調用差不多.
就是要記得,這個是發生在區塊鏈上的,每次調用都會花費以太幣.

5.調試合約

調試也就是分步執行某個事務,這里的事務實際上就是一次合約調用,我這里使用的合約如下:

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 成功以后會出現兩個調用按鈕,donate和moveFund兩個外部可調用函數. 其中donate是沒有參數的,moveFund要有兩個參數.
點擊donate,會在區塊鏈上執行該調用,結果如下:

Result: {
  "blockHash": "0x05ff0a4b8680255fc2f8fd270ff29fc2658a4868bd4a834367e5292aa8c91235",
  "blockNumber": 4471,
  "contractAddress": null,
  "cumulativeGasUsed": 88115,
  "from": "0x1a9ec3b0b807464e6d3398a59d6b0a369bf422fa",
  "gasUsed": 88115,
  "logs": [],
  "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "root": "0xf50ef054ab10044cb0ae253121abd8a971abaeb0b69d29bbf5d3ef97652292d7",
  "to": "0xf77165817ad6e07cf32b16b2d6e64e3c85ca7ffc",
  "transactionHash": "0xdf4d91c207cf8d7acee3c64add6a994039cf77d27e07e85633e7953e35e542e6",
  "transactionIndex": 0
}

可以看到該事務發生在4471區塊上,在該區塊中的事務索引是0(因為是私鏈,肯定只會有這一個事務).

有了這些信息,我們就可以去調試這個調用

切換到Debugger模塊:Debugger
如果按鈕下面有一個The method debug_traceTransaction does not exist/is not available,那是因為geth啟動的時候沒有添加參數
--rpcapi "eth,admin,web3,net,debug"

這時候我們就可以在代碼中設置好斷點,然后啟動,程序就會停在斷點處,我們可以在右側的Solidity State中看到變量的變化.如果想要比較好的調試,還是需要懂一些evm的指令.
否則這樣的調試感覺也意義不大,和js中按照語句調試不一樣,這里主要是針對指令的調試,一句簡單的_giver.push(msg.sender);需要十幾條指令.
調試界面
當然以后隨着remix的發展,調試應該會做的越來越好.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM