智慧合約開發神器-Remix

weixin_33861800發表於2017-11-29

Remix是一個基於solidity語言的線上智慧合約開發IDE,它提供從編譯,除錯到部署的全流程工具,功能非常強大。

介面

開啟Remix, 就會看到它的工作區:

1871218-53d302b20ab93e30.png
remix.png

  1. 資料夾管理
    最左邊是資料夾管理,裡面列出了當前的工作區裡的檔案,remix可以支援從本地資料夾讀取檔案。

  2. 工作區
    正中間是工作區,工作區上半部是程式碼編輯區,在這裡可以寫solidity合約。
    下半部是日誌區,在執行智慧合約時,會顯示transaction相關的資訊。

  3. 功能區
    最右邊是功能區,也是最為強大的地方,最主要的就是編譯和執行區了,除錯區其實也很強大,但是對於一般開發者太難用了(我..)

  • 編譯
    編譯裡會顯示當前合約的編譯結果以及編譯錯誤和報警等資訊
  • 執行
    在執行區,你可以選擇不同的環境(虛擬環境,內建web3等)部署和執行你的合約。
    工作區裡的合約程式碼編譯後,可以在這個區裡部署和檢視。

Remix使用示例

對於智慧合約互相呼叫,我一直有一個疑問,如果使用者A呼叫合約a,而合約a又呼叫了合約b,那麼在合約b的程式碼執行時,msg.sender是誰?是使用者A還是合約a?

為了解決這個問題,我們來親自動手驗證下:

  1. 開啟remix,輸入程式碼
pragma solidity ^0.4.9;

contract Called {
    address public caller;
    
    function Test() {
        caller = msg.sender;
    }
}

contract Caller {
    Called public called;
    
    function Caller(address _called) {
        called = Called(_called);
    }
    
    function Go() {
        called.Test();
    }
}

程式碼裡寫了一個Called和一個Caller合約,當我們呼叫Caller.Go()時,它會去呼叫對應Caller的Test()函式, Caller就會將msg.sender記錄下來。

  1. 部署Called
    在功能區的編譯tab看到編譯沒有問題後,點開執行tab,我們可以選擇browser/ballot.sol:Called合約,然後點選Create,部署。(注意,這裡一定把上面的Envonment選項選成Javascript VM)


    1871218-f3cf09b7b2c6ea78.png
    remix-c1-create.png

    這時我們應該能看到Called已經部署了,右下多出了一個已經部署的Caller例項,我們可以點選複製按鈕複製該例項的地址。

  2. 部署Caller
    在執行區中間選擇Caller合約,這裡可以看到它的Create裡是可以接收一個引數的,我們把剛剛複製的Called地址複製進去(記得用引號包圍)


    1871218-0311eb0d426fb60c.png
    remix-c2-create.png

    點選Create,我們就部署了一個Caller了,該Caller裡有一個Called合約的引用。

  3. 測試
    好,我們現在就可以測試啦,點選執行Caller合約的Go函式,可以看到日誌裡輸出了一些transaction資訊,但是Called裡面的caller值沒有更新,我們還需要點一下caller獲取當前的最新值。


    1871218-566f3f9af02ee127.png
    remix-c2-run.png

    可以看到,caller值更新成了0xbbf289d846208c16edc8474705c748aff07732db, 而這個就是下面的Caller合約的地址。

於是我們可以得到結論,當合約再去呼叫合約時,msg.sender會是上一個合約的地址,而不是交易發起者的地址。

相關文章