1. 程式人生 > >以太坊學習6--智慧合約的線上IDE工具

以太坊學習6--智慧合約的線上IDE工具

導語:

Remix有哪些功能?

  • 開發智慧合約(集成了solidity語言的編輯器)
  • 動態除錯(debug)智慧合約
  • 訪問已部署的智慧合約的狀態和屬性
  • 程式碼分析,給出錯誤提示,並給出最佳實踐的提示
  • 除錯和測試Dapp(需要藉助於Mist或者其它注入了Web3的工具)
說明:

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

2.工作區
正中間是工作區,工作區上半部是程式碼編輯區,在這裡可以寫solidity合約。
- 每5秒自動儲存。
- 支援多tab
- 左上角的+-符號可以改變字型大小
- 自動語法檢查,黃色是警告和建議,紅色是語法錯誤
中部下方是一個互動式的命令列終端。
- 集成了javascript直譯器,可以使用js指令碼與系統互動。
- 注入了web3物件(只有在web provider和injected provider兩種模式下才有)

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

4.編譯(Compile)
- 預設每次編輯程式碼都會自動編譯,如果合約有很多依賴,建議關閉自動編譯。
這裡寫圖片描述
- 詳情按鈕中有包含編譯生成的詳細資訊。

5.執行(Run)
- 執行環境有三種模式可選:
** JavaScript VM: 這種模式是在瀏覽器中模擬一個區塊鏈,合約在這個模擬的沙盒中執行,重新整理頁面就會使所有資料清空,不會做任何持久化,沒有注入web3物件。
** Injected Provider:連線到包含注入web3物件的源上,例如Mist和Metamask。
** Web3 Provider:連線到遠端節點,需要填寫源的url地址和埠,例如geth、ganache等客戶端,包含web3物件。
- Account 當前操作的賬戶,比如用於釋出合約、呼叫合約方法。
- Gas Limit 合約交易的gas最大限量。
- Value 向合約傳送以太幣。
- Deploy 部署合約。相當於new一個合約例項。(舊版是Create按鈕)
- At Address 假定此地址是所選合約的一個已部署的例項。相當於將地址強制轉換為一個合約例項。

6.設定(Settings)
- 編譯器版本選擇
- Text Wrap 編輯器自動換行
- Always use VM at Load 總是在載入時使用虛擬機器
- Enable Optimization 編譯優化,對執行gas做優化,除錯期間不要使用,可能會引起行為異常。

7.分析(Analysis)
這裡是編譯器做靜態程式碼分析的選項,給出相應的警告。
預設全部勾選,並自動執行。也可以手動執行。

8.偵錯程式(Debugger)
動態除錯內容比較多,之後再專門介紹。

9.支援(Support)
這裡是一個線上支援的連結,可以線上與remix的開發團隊溝通,提交bug或者意見反饋。也可以直接訪問地址:

https://gitter.im/ethereum/remix
 

取得代幣合約:

代幣合約的範例很多,https://www.ethereum.org/token有提供一個最小可行的代幣合約(MINIMUM VIABLE TOKEN):

pragma solidity ^0.4.0;
contract MyToken {
/* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function MyToken(uint256 initialSupply) public {
        balanceOf[msg.sender] = initialSupply;              
        // Give the creator all initial tokens
    }

    /* Send coins */
    function transfer(address _to, uint256 _value) public {
        require(balanceOf[msg.sender] >= _value);           
        // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); 
        // Check for overflows
        balanceOf[msg.sender] -= _value;                    
        // Subtract from the sender
        balanceOf[_to] += _value;                  
        // Add the same to the recipient
    }
}
使用Remix編譯合約:

1.點選右上角 + 新增一個檔案
名稱任意只要副檔名是“.sol”。
這裡寫圖片描述
IDE左側是檔案瀏覽器區域,左上角有一排功能按鈕。
- 建立新檔案
- 從硬碟中匯入檔案
- 將專案檔案上傳至github
- 更新GitHub上的專案檔案
- 將專案檔案複製到另外一個remix例項中
- 連線到本地硬碟

2.複製合約內容到該檔案並編譯
Remix預設會自動編譯,旁邊沒有跳出紅色的ERROR就代表編譯成功(有黃色感嘆號不影響)。
這裡寫圖片描述

在本地部署合約:

1.設定網路
點選左邊上面的run。
Environment選擇JavaScript VM代表所有資料都是存在本地記憶體(功能類似testrpc)。它會提供5個虛擬賬戶每個有100ETH,隨便選一個賬戶(要記住)。
這裡寫圖片描述

2.傳送交易部署合約
選擇MyToken。可以看到Deploy按鈕(舊版是Create按鈕)。且已根據合約內容顯示必須填入unit256 initialSupply(也就是要發行的代幣數量)。輸入一個數目並按Deploy,就會發送交易部署合約。
這裡寫圖片描述

合約部署成功後,可以看到合約的使用介面。Remix會自動根據合約的內容,產生對應的合約使用介面。可以看到合約有兩個功能:balanceOf(查詢餘額)和transfer(轉移代幣)。
這裡寫圖片描述

底下可以看到log(紀錄每一次的操作)。點展示下拉按鈕可以看到該筆交易詳細資料。
這裡寫圖片描述
這裡寫圖片描述

執行合約–查詢餘額:

1.選擇剛剛發起合約的賬戶,可點選帳戶右邊的圖示覆制
這裡寫圖片描述
注:初始的時候還100個eth,現在變少是因為每調一次智慧合約都會花費相應的eth

2.輸入賬戶,點選balanceOf
注:舊版必須用”“把帳戶包起來,因為資料傳送是用JSON格式,所以要加上”“。如果忘記輸入”“就會在log報錯
可以在旁邊看到執行結果,也就是目前這個賬戶的代幣餘額。
這裡寫圖片描述

執行合約–轉移代幣:

1.選擇要轉出的賬戶
選擇剛剛發起合約的賬戶。
這裡寫圖片描述

2.輸入要轉入的賬戶,點選transfer
點選transfer,成功後會看到log更新。
這裡寫圖片描述
這裡寫圖片描述

3.確認餘額更新
再查詢轉入賬戶的餘額,就可以看到代幣餘額增加了
這裡寫圖片描述

錯誤情況:
如果選擇要轉出的賬戶代幣餘額不足,這筆交易會失敗,就會在log看到錯誤。
這裡寫圖片描述
 

在測試網路部署合約:

1.安裝 MetaMask
首先,要連到測試網路,就要安裝MetaMask。他是瀏覽器端的Ethereum錢包,可以連結Ethereum主網和測試網路。安奘後需要建立Ethereum賬戶。
MetaMask外掛的安裝使用可以檢視我的前一篇文章https://blog.csdn.net/m0_37739193/article/details/81057582
安裝好MetaMask後選擇測試網路,匯入eth不為零的賬戶或者自己挖礦獲得相應的eth,並且要切換到該使用者,回到Remix,這次Environment選擇Injected Web3,Remix會自動連結MetaMask。
這裡寫圖片描述
成功會看到和MetaMask相同賬戶和Ether餘額
注:疑問:我不理解為什麼要這樣顯示(顯示兩個相同的賬戶,你不應該顯示一個嗎),還是哪裡有問題了
這裡寫圖片描述

2.部署合約
接著用剛才同樣的方式,輸入一個數目(我這裡輸入的是1000000)並按Deploy部署合約,就會看到MetaMask的彈出視窗。直接按submit傳送交易。
這裡寫圖片描述
稍等一點時間(我等了一分鐘左右吧,因為要等這個交易被確認),首先在瀏覽器右下角出現
這裡寫圖片描述
點選會彈出如下頁面
這裡寫圖片描述
部署成功後合約的使用介面就會在Remix中跑出來。
這裡寫圖片描述
就可以用同樣的方式使用合約了!
複製該智慧合約地址,在MetaMask中可以加入該代幣。
這裡寫圖片描述
注意:我一開始匯入部署好的智慧合約地址後顯示發起該合約的賬戶該代幣餘額為0。後來才發現是匯入的時候單位寫的是18的緣故,因為我總共發了1000000個幣,這裡填18會顯示小數點後三位顯示不全所以會顯示為0。所以說這裡填0餘額才會顯示為1000000,填1則會顯示100000.0
這裡寫圖片描述