1. 程式人生 > >Solidity語言編輯器REMIX指導大全

Solidity語言編輯器REMIX指導大全

image

1

文章摘要

本文目標:本文翻譯和實踐Solidity語言編輯器REMIX官網幫助文件,但並不拘泥於逐字翻譯,而時根據實踐用中文語言講透編輯器相關功能。

前置條件:瞭解以太坊ETH和Solidity語言。

技術收穫:

  • 使用REMIX編輯器進行Solidity語言程式設計,編譯,執行,除錯。

  • REMIX介面介紹

    2 使用REMIX編輯器執行”HELLO WORLD”的智慧合約

REMIX是一個智慧合約程式語言Solidity的整合開發環境。

最簡單的入門就是進行”HELLO WORLD”的程式執行。

2.1 智慧合約編譯

新增一個命名為“HelloWorld.sol”的檔案,複製以下程式碼:

pragma solidity ^0.4.17;

contract Hello         

{    

address creator;         

string greeting;         

function Hello(string _greeting) public       

{        

creator = msg.sender;        

greeting = _greeting;    

}        

function greet() public constant returns (string)               

{

return
greeting;     }         function setGreeting(string _newgreeting) public     {         greeting = _newgreeting;     }          /**********      Standard kill() function to recover funds       **********/         function kill() public     {          if (msg.sender == creator)             suicide(creator);  // kills this contract and sends remaining funds back to creator    
} }

點選”Start to compile”按鈕,會得到一下結果:

image

智慧合約編譯

除一些函式的告警提示外,結果表明該智慧合約編譯成功。

2.1.1 編譯告警

如果編寫的程式有告警,REMIX會有提示。一般來說,提示不必修改。

image

REMIXD編譯告警

2.1.2 編譯錯誤

為了說明編譯錯誤案例,把該檔案的第17行”return greeting;”改為”return _greeting;”, 重新編譯,得到以下結果

image

REMIXD編譯錯誤

如果編寫的Solidity程式存在語法錯誤,Remix編譯器會以粉紅色底色提示顯示錯誤原因,並在編輯器視窗提示位置。

編譯錯誤演示完後,恢復第17行程式碼為”return greeting;”

2.1.3 詳情資訊

點選”Detail”按鈕,可以看到詳細資訊。其中WEB3DEPLOY部分的內容就是在案例《第二課 如何實現以太坊最簡智慧合約“Hello World”的執行》(https://www.jianshu.com/p/2a5d60744988)中geth控制檯使用的編譯後代碼。

image

DETAIL的內容

2.2 智慧合約執行

2.2.1 建立智慧合約

選擇“Run”的頁面,選擇Environment環境為Javascript VM,在“Create”按鈕前輸入框內輸入”Hello World!”[注意:輸入字串一定要有英文雙引號],點選“Create”按鈕。

image

建立智慧合約

2.2.2 執行greet函式

點選淺藍色函式”greet”按鈕,可以看到輸出結果為“Hello World!”

image

執行函式greet

說明:淺藍色按鈕函式表示該交易函式執行時不需要消耗GAS的。

2.2.3 執行setGreeting函式

在setGreeting函式按鈕的輸入框輸入內容”Hello Duncan!”, 執行後在點選執行”greet”函式,發現該函式的輸出內容已變為”Hello Duncan!”了,說明setGreeting執行正常。

image

執行函式SetGreeting

說明:粉紅色按鈕函式表示該交易函式執行時是需要消耗GAS的。

3

REMIX介面詳解

第2章以“Hello World”為例,介紹了REMIX整合環境的基本使用方法。本章介紹REMIX編輯器的詳細功能描述。

3.1 REMIX整合環境概述

REMIX是一個智慧合約程式語言Solidity的整合開發環境,它集成了一個偵錯程式和測試環境。

如果你對以下內容感興趣,REMIX是一個不錯的學習方式:

  • 開發智慧合約(REMIX集成了SOLIDITY編輯器)

  • 除錯智慧合約

  • 獲取已執行合約的狀態和屬性

  • 除錯已經提交的合約

  • 分析SOLIDITY程式碼,以便減少編碼錯誤和加強最佳實踐

  • 配合Mist(或者任何植入web3的工具),REMIX可用於測試和除錯DAPP分散式程式。(參考連結Debugging a Dapp using Remix - Mist - Geth )(https://remix.readthedocs.io/en/latest/tutorial_mist.html

詳解介紹使用的程式案例為”ballot.sol”檔案的程式碼,完整程式碼如下:

pragma solidity ^0.4.0;

contract Ballot {    

struct Voter {        

uint weight;        

bool voted;        

uint8 vote;        

address delegate;    

}    

struct Proposal {        

uint voteCount;    

}    

address chairperson;    

mapping(address => Voter) voters;    

Proposal[] proposals;    

/// Create a new ballot with $(_numProposals) different proposals.    function Ballot(uint8 _numProposals) public {        

chairperson = msg.sender;       

 voters[chairperson].weight = 1;        

proposals.length = _numProposals;    

}    

/// Give $(toVoter) the right to vote on this ballot.   

/// May only be called by $(chairperson).    

function giveRightToVote(address toVoter) public {        

if (msg.sender != chairperson || voters[toVoter].voted) return;        

voters[toVoter].weight = 1;    

}    

/// Delegate your vote to the voter $(to).    

function delegate(address to) public {        

Voter storage sender = voters[msg.sender]; // assigns reference        if (sender.voted) return;        

while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender)            

to = voters[to].delegate;        

if (to == msg.sender) return;        

sender.voted = true;        

sender.delegate = to;        

Voter storage delegateTo = voters[to];        

if (delegateTo.voted)            

proposals[delegateTo.vote].voteCount += sender.weight;        

else            

delegateTo.weight += sender.weight;    

}    

/// Give a single vote to proposal $(toProposal).    

function vote(uint8 toProposal) public {        

Voter storage sender = voters[msg.sender];       

 if (sender.voted || toProposal >= proposals.length) return;        

sender.voted = true;        

sender.vote = toProposal;        

proposals[toProposal].voteCount += sender.weight;    

}    

function winningProposal() public constant returns (uint8 _winningProposal) {        

uint256 winningVoteCount = 0;       

 for (uint8 prop = 0; prop < proposals.length; prop++)            

if (proposals[prop].voteCount > winningVoteCount) {                winningVoteCount = proposals[prop].voteCount;                _winningProposal = prop;           

 }    

}

}

REMIX主介面截圖如下,具體說明參考各個子章節。

image

REMIX主介面截圖

3.2 檔案瀏覽器

image

檔案瀏覽器

1)增加新檔案(Create new File)

點選在瀏覽器上增加一個新的智慧合約檔案

image

增加新檔案

2)開啟檔案(Add Local File)

image

開啟存在檔案

3) 匿名釋出到GitHub(Publish to Gist)

image

匿名釋出到GitHub

4) 複製檔案列表到其他瀏覽器(Copy to another instance)

修改輸入目標瀏覽器的網址:

image

複製到別的瀏覽器

開啟新的瀏覽器,檔案列表已複製過來了:

image

別的瀏覽器的檔案列表

5)連結本地伺服器(Connect to Localhost)

在Remix檔案瀏覽器上的檔案並不會同步到本地檔案系統,對瀏覽器檔案列表的新增/修改/刪除並不會同步本地檔案。一般操作時,除錯成功的程式碼需要在本地檔案系統新建檔案儲存。Remix瀏覽器提供了一種方法,就是使用Remixd,允許儲存和同步瀏覽器檔案到你的本地計算機中。因為根據官網文件,筆者沒有能夠在Windows 10系統或者Ubuntu中安裝成功Remixd,本文不再詳細介紹該功能。有興趣的朋友歡迎根據官網文件()嘗試使用REMIXD同步。成功者歡迎跟輝哥反饋交流,補充完整這個文件。

image

連結本地檔案系統

3.3 Solidity語言編輯器

image

Solidity 瀏覽器

Solidity語言編輯器重要的功能列表:

  • TAB頁面顯示開啟的檔案

  • 編譯告警或者錯誤會顯示在編輯器最左側邊

  • Remix自動儲存當前檔案(修改後5秒內)

  • +/- 表示增加/減少編輯器的字型大小

3.4 終端輸出器

image

終端輸出器視窗

終端輸出器功能說明:

  • 點選1按鈕可隱藏終端輸出器

  • 點選2按鈕可情況輸出器內容

  • 點選3按鈕可複製地址資訊等到快取,便於貼上

  • 點選Details按鈕可展開交易詳細內容

  • 點選Debug按鈕可除錯該交易合約

  • 點選複選框,可增加選擇顯示所有的交易還是隻顯示智慧合約相關的交易程式。預設只顯示後者。

image

終端顯示內容

  • 輸入關鍵字可搜尋定位輸出內容
    例如輸入”Hello “關鍵字,相關的內容就顯示出來了。

image

搜尋Hello關鍵字

  • 監聽網路(Listen to network)
    勾選後,REMIX不僅監聽REMIX編輯器中建立的交易,還監聽當前環境中所有的交易。

3.5 分頁控制面板

3.5.1 編譯合約

image

Compile控制面板

釋出到Swarm網路(Publish on Swarm)

點選“Publish on Swarm”按鈕可把智慧合約原始碼和對應的ABI資訊釋出到網路上。這個合約智慧是非抽象類的才能釋出。

合約釋出後,你可以點選Detail按鈕,在彈出視窗的“SWARM LOCATION”

位置找到對應的MetaDATA資訊。

資訊中的SWARM LOCATION位置有對應網址,在能科學上網的計算機就可找到該合同的MetaData資訊 “bzzr://165fad4c3d8ead3a7fe28296777b4bedafb09bb57de2e9ba39c1547866437182”

3.5.2 執行

image

 Run控制面板

重點特性說明

1) 環境選擇

JavaScript VM: 所有交易在瀏覽器的沙盒中被執行。這以為著沒有結果是永久儲存的。當頁面過載後,一個新的區塊鏈會被從零開始執行,老的會被丟棄。

Injected Provider: Remix將連線被植入的Web3物件。例如Mist或者Metamask錢包是提供植入的Web3物件的例子。例如《第八課 如何除錯以太坊官網的智慧合約眾籌案例》(https://www.jianshu.com/p/c7c87c7ad74f)就是使用Meta的賬號。

Web3 Provider: Remix將連線到一個遠端節點。你可以用這個地址來選擇錢包客戶端:geth, parity or any Ethereum client.

2) 初始化合約

建立合約

“Create”按鈕用於建立合約。合約建立時,需要參考左邊構建函式定義(智慧合約的同名函式為構建函式)的型別來輸入引數。

image

建立合約

注意:如果輸入引數為地址或者字串,都需要使用英文雙引號(“”)囊括起來,使用英文(“,”)表示輸入引數分割。

執行合約

假設給出的地址是一個選擇合同的例項。通過這種方法就可以跟已經執行的合同進行互動。要特別謹慎使用該功能,因為系統不做驗證。執行時要確認信任這個地址的合同。

等待(pending)合約

image

掛起合約

等待合約表示還沒有完成執行過程的合約。按鈕功能描述參考上述附件。

3.5.1.1 Web3 Provider遠端節點配置

1) 啟動Ganache客戶端。不熟悉的,可參考該篇文章的對應關鍵字“在WINDOWS上安裝Ganache”安裝好客戶端(https://www.jianshu.com/p/683ea7d62a39)。

image

啟動Ganache客戶端

2) 輸入Web3 Provider遠端節點,例如Ganache的籤寶地址為“HTTP://127.0.0.1:7545

image

輸入WEB3 privider的伺服器地址

3) 輸入完成後,Remix的賬號列表更新為Ganache的賬號列表了。

賬號為Ganache的賬號列表

3.5.3 除錯

除錯/回滾和單步除錯是一個很重要的功能,點選《第九課 如何在Remix環境下進行Solidity程式碼單步除錯》(https://www.jianshu.com/p/a2502274b092)文章檢視。

3.5.4 設定

Settiongs

重要特性說明:

  • Solidity version:編譯SOLIDITY版本,不調整的話系統會預設選擇最新正式釋出的版本。

  • Always use Ethereum VM at Load:勾選此項會在重新載入時預設選擇JavaScript VM環境。

  • Enable Optimization:勾選此項會節省執行GAS,JVM等測試環境可不用勾選。

3.5.5 分析

分析面板顯示的是最後一次編譯的資訊,預設情況下每一次編譯都會產生一個新的分析。

這個分析面板顯示的是合約程式碼的詳細資訊,它可以幫助你避免程式碼錯誤或者增強編碼能力。

Analysis頁面

Security:
Transaction origin: 如果tx.origin被使用則會告警;
Check effects: 避免潛在的可重入性BUG;
Inline assembly:  使用植入彙編方式;
Block timestamp: Semantics maybe unclear;
Low level calls: Semantics maybe unclear;
Block.blockhash usage: 自毀呼叫;

Gas & Economy:
Gas costs: 函式的GAS消耗太高會告警。
This on local calls: 勾選後本地函式會被喚醒;

Miscellaneous:
Constant functions: 檢查潛在的常量函式
Similar variable names: 檢查變數名是否太相似

Miscelllaneous下方顯示的是本次編譯的優化告警,供程式設計師優化程式碼使用。

Analysis頁面2

3.5.6 支援

支援頁面,可點選需求技術支援和交流。

remix_supporttab

4

典型錯誤介紹

4.1 REMIX編譯器官網連結打不開

提示內容:點選官網連結(http://remix.ethereum.org),如果打不開或者有錯誤提示“mock compiler: source not found”

原因分析: 這個主要是不能科學上網引起官網瀏覽器不能下載完全。

解決辦法:

1,參考歐陽哥哥的文章《【以太坊開發】Remix IDE本地部署與配置個性風格》完成本地REMIX的部署;
2,採用一個已國內部署的REMIX瀏覽器連結:http://remix2.ju3ban.net

4.2 引數轉換失敗

提示內容: 終端輸出器顯示為“transact to Donation.moveFund errored: Error encoding arguments: Error: Assertion failed ”

原因分析:
Solidity函式定義為”function moveFund(address _to, uint _amount)”

RUN面板的函式輸入引數如下,希望轉移5個ETH給目標賬號。

“0x14723a09acff6d2a60dcdf7aa4aff308fddc160c”,500000000000000

結果提示錯誤。

這個原因主要是因為”5 *10^18”的值超過了計算器的範圍,需要增加”“來讓程式進行轉換。Solidity的預設單位為wei,1 ETH = 1*10^18 wei。

解決辦法:
輸入引數改為2個引數均有雙引號則不會有錯誤提示。

“0x14723a09acff6d2a60dcdf7aa4aff308fddc160c”,”500000000000000”

在remix中,任何輸入引數都可以帶”“表示。

5

參考文件

本文作者:HiBlock區塊鏈技術佈道群-筆名輝哥

加微信baobaotalk_com,加入技術佈道群

以下是我們的社群介紹,歡迎各種合作、交流、學習:)

image

相關推薦

第十課 Solidity語言編輯REMIX指導大全

1. 文章摘要 【說明】未列出的課程為知識普及的非實操類課程,所有區塊鏈文章參考“區塊鏈入口”專欄。 #2. 使用REMIX編輯器執行"HELLO WORLD"的智慧合約 REMIX是一個智慧合約程式語言Solidity的整合開發環境。 最簡單的入門就是進行

Solidity語言編輯REMIX指導大全

1 文章摘要 本文目標:本文翻譯和實踐Solidity語言編輯器REMIX官網幫助文件,但並不拘泥於逐字翻譯,而時根據實踐用中文語言講透編輯器相關功能。 前置條件:瞭解以太坊ETH和Solidity語言。 技術收穫: 使用REMIX編輯器

solidity線上編輯Remix中文版

Remix是以太坊官方開源的Solidity線上整合開發環境,可以使用Solidity語言在網頁內完成以太坊智慧合約的線上開發、線

給大家介紹兩個好用的C語言編輯

注意到很多小夥伴經常反饋在學習C語言時該選擇什麼 C語言 編輯器好呢?都說慾善其事必先利其器,網路上也有很多不同型別的編輯器,讓人很難進行抉擇!C語言 編輯器選擇哪個好? 所以我今天根據我個人的使用情況,整理了幾款C語言編輯器分享給大家,需要的看官看下文了解一下喲~ (小編推薦一個學C語

百度編輯使用函式大全

在渲染 ueditor 的時候,將 ueditor 交給一個全域性變數。 var ue = UE.getEditor('container'); str = ue.getContent();直接獲取文字中的內容 百度編輯器UEditor常用設定函式大全 線上文件對UE

在Windows/Ubuntu上使用Visual Studio Code作為Go語言編輯操作步驟

下面以在Windows10上操作為例,在Ubuntu上操作步驟與windows一致:1. 從 https://code.visualstudio.com/  下載windows上的最新發布版本1.21.1,即VSCodeSetup-x64-1.21.1.exe;2. 以管理員

vim編輯操作命令大全-絕對全

學習連結: vim命令大全 http://blog.csdn.net/scaleqiao/article/details/45153379 vim命令小技巧 http://www.codeceo.com/article/useful-vim-command.html

現在的C語言編輯裡的int範圍為什麼是-2147483648~2147483647

下面是引用百度文庫的一段話: “這得從二進位制的原碼說起:  如果以最高位為符號位,二進位制原碼最大為0111111111111111=215-1=32767 最小為1111111111111111=-(215-1)=-32767  此時0有兩種表示方法,即正0和負0:00

Atom 編輯快捷鍵大全

檔案切換 ctrl-shift-s 儲存所有開啟的檔案 cmd-shift-o 開啟目錄 cmd-\ 顯示或隱藏目錄樹 ctrl-0 焦點移到目錄樹 目錄樹下,使用a,m,delete來增加,修改和刪除 cmd-t或cmd-p 查詢檔案

C語言之如何讓vim編輯永久顯示行號

語言 打開 默認 linux環境 linu 顯示 命令行模式 c語言 mrc 在Linux環境下的編輯器有vi、vim、gedit等等。 進入這些編輯器之後,為了方便我們需要編輯器顯示出當前的行號,可偏偏編輯器默認是不會顯示行號的。 我們有二種辦法可以解決: 第一

《Linux命令行與shell腳本編程大全》第十章 使用編輯

命令 filename 令行 識別 shel edit 其他命令 shift 文件 主要介紹vim, nano, emacs,KWrite,Kate,GNOME 10.1 vim Unix系統最初的編輯器 10.1.1檢查vim軟件包 先搞明白你所用的Linux系統是哪種v

如何將CAD編輯語言切換至英文

第一步 www. 對話 小夥伴 設置 右下角 技術分享 下拉 沒有 如何將迅捷CAD編輯器專業版的語言切換至英文,在CAD編輯器中我們經常使用的都是中文狀態下的迅捷CAD編輯器,但是如果我們需要將CAD編輯器的語言切換至英文應該要怎麽操作呢?本編文章就來教教大家如何將迅捷C

CAD編輯語言可以進行中英文切換嗎?要怎麽來操作呀?

type ffffff image str 激活 希望 不可 屬性設置 窗口 CAD編輯器的語言可以進行中英文切換嗎?要怎麽來操作呀?現在隨著科技的發展,很多的小夥伴們都開始的接觸到CAD當中來,但是在CAD行業中每天不可避免的就是編輯圖紙,那在編輯的時候都是借助第三方工具

推薦 13款js編輯大全

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

sublimeText3編輯 + 入門教程 + 使用大全

sublimeText3編輯器 + 入門教程 + 使用大全 Ctrl+D選中游標所佔的文字,繼續操作則會選中下一個相同的的文字 ctrl+G:輸入行號,可快速跳轉該行 ctrl+p:輸入冒號,在輸入行號,可快速跳轉到某一行 Alt+F3選中文字按下快捷鍵,即可一次性選擇全部相同的文字進行同時編輯:舉個例子:

Go語言環境安裝,驗證go語言環境、使用文字編輯編寫一個go hello world,Go lang IDE安裝,在golang中新建一個go程式

1 Golang語言環境安裝包下載 https://www.golangtc.com/ 下載: go1.9.2.windows-amd64.msi 和 go1.9.2.windows-amd64.zip 2 golang語言環境安裝 本筆記使用go1.10.2.window

CAD編輯語言要在那裡設定

在使用CAD編輯器的過程中,不知道小夥伴們有沒有遇到過這樣的情況,就是在繪製圖紙的時候,使用的編輯器的語言的英文的,但是小編表示完全看不同呀,那怎麼設定CAD編輯器的語言了?CAD編輯器的語言要在那裡設定?小夥伴們都知道嗎?下面小編就來教教大家,有興趣的朋友可以來看看。 步驟一:首先,在電腦中開啟一個瀏覽器

CAD編輯語言要在那裏設置

blog 制圖 不難 cto 下拉 log 需要 oss src 在使用CAD編輯器的過程中,不知道小夥伴們有沒有遇到過這樣的情況,就是在繪制圖紙的時候,使用的編輯器的語言的英文的,但是小編表示完全看不同呀,那怎麽設置CAD編輯器的語言了?CAD編輯器的語言要在那裏設置?小

IDEA編輯下 JNI Java中呼叫C\C++語言的詳細方法步驟

Mac OS 上進行github的配置 註冊GitHub賬號,直接去官網註冊即可 建立github.io 在自己的主頁,點選”New repository”,即可新建一個版本庫 安裝或更新

c語言文字編輯

#include<stdio.h> #include<conio.h> #include<string.h> #include<stdint.h> #include<ctype.h> # define LEN sizeof(struct Lnode)