合約是代碼(它的功能)和數據(它的狀態)的集合,存在于以太坊區塊鏈的特定地址。合約賬戶能夠在彼此之間傳遞信息,進行圖靈完備的運算。合約依靠被稱作以太坊虛擬機(EVM)字節代碼(以太坊特有的二進制格式)上的區塊鏈運行。
合約很典型地用諸如Solidity等高級語言寫成,然后編譯成字節代碼上傳到區塊鏈上。
以太坊高級語言
合約依靠被稱作以太坊虛擬機(EVM)字節代碼(以太坊特有的二進制格式)上的區塊鏈運行。然而,合約很典型地用諸如Solidity等高級語言寫成,然后用以太坊虛擬機編譯器編譯成字節代碼上傳到區塊鏈。
編譯合約
solidity合約的編譯可以通過很多機制完成。
通過命令行使用solc編譯器。
在geth或eth提供的javascript控制臺使用web3.eth.compile.solidity(這仍然需要安裝solc編譯器)。
在線Solidity實時編譯器。
建立solidity合約的Meteor dapp Cosmo。
Mix IDE。
以太坊錢包。
注意:關于solc和編譯Solidity合約代碼的更多信息可在此查看。
在geth設置solidity編譯器
如果你啟動了geth節點,就可以查看哪個編譯器可用。
這一指令會返回到顯示當前哪個編譯器可用的字符串。
注意:solc編譯器和cpp-ethereum一起安裝。或者,你可以自己創建。
如果你的solc可執行文件不在標準位置,可以用—solc標志為solc可執行文件指定一個定制路線。
或者你可以通過控制臺在執行期間設置這個選項:
編譯一個簡單合約
讓我們編譯一個簡單的合約源:
這個合約提供了一個單一方法multiply,它和一個正整數a調用并返回到a*7。
注意:編譯器通過RPC因此也能通過web3.js,對瀏覽器內任何通過RPC/IPC連接到geth的Dapp可用。
下面的例子會向你展示如何通過JSON-RPC接合geth來使用編譯器。
Code編譯的以太坊虛擬機字節代碼
Info從編譯器輸出的額外元數據
Source源代碼
Language合約語言(Solidity,Serpent,LLL)
LanguageVersion合約語言版本
compilerVersion用于編譯這個合約的solidity編譯器版本。
abiDefinition應用的二進制界面定義
userDoc用戶的NatSpec Doc。
developerDoc開發者的NatSpec Doc。
編譯器輸出的直接結構化(到code和info)反映了兩種非常不同的部署路徑。編譯的以太坊虛擬機代碼和一個合約創建交易被發送到區塊,剩下的(info)在理想狀態下會存活在去中心化云上,公開驗證的元數據則執行區塊鏈上的代碼。
如果你的源包含多個合約,輸出會包括每個合約一個入口,對應的合約信息對象可以用作為屬性名稱的合約名字檢索到。你可以通過檢測當前的GlobalRegistrar代碼來試一下:
創建和部署合約
開始這一章節之前,確保你有解鎖的賬戶和一些資金。你現在會在區塊鏈上創建一個合約,方法是用上一章節的以太坊虛擬機代碼作為數據給空地址發送交易。
注意:用在線Solidity實時編譯器或Mix IDE程序會更容易完成。
所有的二進制數據都以十六進制的格式序列化。十六進制字符串總會有一個十六進制前綴0x。
注意:注意arg1,arg2,…是合約構造函數參數,以備它要接受參數。如果合約不需要構造函數參數,就可以忽略這些參數。
值得指出的是,這一步驟需要你支付執行。一旦交易成功進入到區塊,你的賬戶余額(你作為發送方放在from領域)會根據以太坊虛擬機的gas規則被扣減。一段時間以后,你的交易會在一個區塊中出現,確認它帶來的狀態是共識。你的合約現在存在于區塊鏈上。以不同步的方式做同樣的事看起來是這樣:
與合約交互
與合約交互典型的做法是用諸如eth.contract()功能的抽象層,它會返回到javascript對象,和所有可用的合約功能一起,作為可調用的javascript功能。描述合約可用功能的標準方式是ABI定義。這個對象是一個字符串,它描述了調用簽名和每個可用合約功能的返回值。
現在ABI中具體說明的所有功能調用都在合約實例中可用。你可以用兩種方法中的一種來調用這些合約實例上的方法。
當用sendTransaction被調用的時候,功能調用通過發送交易來執行。需要花費以太幣來發送,調用會永久記錄在區塊鏈上。用這種方式進行的調用返回值是交易散表。
當用call被調用的時候,功能在以太坊虛擬機被本地執行,功能返回值和功能一起返回。用這種方式進行的調用不會記錄在區塊鏈上,因此也不會改變合約內部狀態。這種調用方式被稱為恒定功能調用。以這種方式進行的調用不花費以太幣。
如果你只對返回值感興趣,那么你應該用call。如果你只關心合約狀態的副作用,就應該用sendTransaction。
在上面的例子中,不會產生副作用,因此sendTransaction只會燒gas,增加宇宙的熵。
測試合約和交易
你通常需要低級的測試策略,為交易和合約排除故障。這一章節介紹了一些你可以用到的排錯工作和做法。為了測試合約和交易而不產生實際的后果,你最好在私有區塊鏈上測試。這可以通過配置一個替代網絡ID(選擇一個特別的數字)和/或不能用的端點來實現。推薦做法是,為了測試你用一個替代數據目錄和端口,這樣就不會意外地和實時運行的節點沖突(假定用默認運行。
審核編輯:符乾江
-
數據
+關注
關注
8文章
7002瀏覽量
88943 -
代碼
+關注
關注
30文章
4779瀏覽量
68525
發布評論請先 登錄
相關推薦
評論