您的位置:首頁>財經>正文

區塊鏈學堂(第五課):Browser-solidity+右側的奧秘

使用Browser-solidity來編譯合約&部署合約

在上一章中部署在Geth上的原始程式碼如下:

pragma solidity 0.4.9; contract DemoTypes { function f(uint a) returns (uint b) { uint result = a * 8; return result; } } 這個時候在這個位址的左側, 複製黏貼上述的代碼, 然後就可以看到右側編譯好的代碼:
複製黏貼這段代碼, 且web3.eth.accounts[0]也處於解鎖狀態的話, 即可部署到乙太坊的私有鏈上。 並可以被執行和調用。 > a_demotypes.f.call(100) 800 > a_demotypes.f.call(125) 1000

智慧合約Solidity 原始程式碼分析

這個最簡單的智慧合約代碼如下:

我們接下來試著做一些簡單的分析, 並介紹一些最基本的Solidity知識

第一行 pragma solidity 0.4.9; 第一行代碼是必須的, 否則編譯器將不知道該如何選擇編譯器, 以及編譯器版本。 第一行的pragma soliditypragmasolidity0.4.9注意:從0.4.9起可以在前面不打^,0.4.8/0.4.7等版本還是需要打^

第二行contract DemoTypes { ... }

這裡引用一段說明Solidity裡的Contract

Contracts in Solidity are similar to classes in object-oriented languages. They contain persistent data in state variables and functions that can modify these variables. Calling a function on a different contract (instance) will perform an EVM function call and thus switch the context such that state variables are inaccessible. (引用自 here

中文翻譯:

Solidity中Contract和物件導向語言中的類很相像。 有帶持久資料的變數, 以及能改變這些變數的function. 在不同的Contract實例中調用一個function, 將會執行一個在EVM(乙太坊虛擬機器)中的function調用。

由此可見,
Solidity中的智慧合約和傳統物件導向語言中的類很相像, 因此有構造函數, 有繼承, 有變數, 有function, 也有抽象類別等等傳統概念。 由Solidity所寫的智慧合約, 經過編譯後就會由EVM來部署執行Solidity語言是一種類JS的語言, 因此很多編碼規範和JS很相似

第三行function f(uint a) returns (uint b) { ... } 上面說過, contract中包含了變數&方法(function)。 function f(uint a) returns (uint b)fuint auint buint 代表無狀態的整型數位, 即大於0的整數uint = uint256, 最大值為2的256次方, 這個數字對於絕大多數的數學運算是足夠得了。 相對於uint來說還有帶負數的整數類型, 即int, int=int256, 取值範圍從 負2的128次方到正2的128次方 uint/int類型細節請參見後面的Int類型介紹。 或者點擊here

Function的核心代碼function f(uint a) returns (uint b) { uint result = a * 8; return result; } 這是一段很平常的js代碼, 值得注意的是以下兩點 Solidity是一個類型語言, 因此每個變數都需要定義他的類型, uint/int/string/var

Solidity is a statically typed language, which means that the type of each variable (state and local) needs to be specified (or at least known – see Type Deduction below) at compile-time. Solidity provides several elementary types which can be combined to form complex types. 引用自here

關於編碼風格 uint result = a * 8;

More than one space around an assignment or other operator to align with 引用自here

Yes: x = 1; y = 2; long_variable = 3;

更多關於Solidity的編碼風格, 請參考官方文檔 https://solidity.readthedocs.io/en/develop/style-guide.html

經過上面的代碼, 我們知道了關於智慧合約的一些基礎知識, 下篇將開始講解Browser-solidity右側的奧秘

首先重複一遍Browser-solidity的地址:https://ethereum.github.io/browser-solidity

Browser-solidity是一個官方提供的一個基於流覽器的合約編譯器, 非常好用, 而且build版本會緊跟最新的Solidity的build版本。 但由於網路原因以及GFW的存在, 有可能會另一部分人訪問很慢, 進而影響開發效率。 下面介紹如何在本地部署Browser-solidity

本地部署Browser-solidity方法npm install # fetch dependencies npm run build # build application into build/app.js Step 3: 啟動npm 伺服器 npm run serve

本地打開效果如下:然後就可以隨意的撰寫自己的智慧合約了。

Browser-solidity 細節詳解

這裡用到的Browser-solidity是官網的, 如果打不開或者速度太慢, 請參照上面的本地搭建方法。 Browser-solidity的右側詳細解析, 請參看下圖:

1.當前的solidity版本, 如上圖截圖所示為0.4.9, 這個默認用的是當前最新的release版本。 2.點擊下拉清單, 可以選擇不同的版本, 包括還未成熟的最新構建版本, 或者是之前的版本等。 個人強烈建議, 儘量選擇release版本, 如下圖所示的這些 3.點擊create,會在記憶體中將該智慧合約創建一個實例,即將下面的web3 deploy代碼部署在虛擬的記憶體中。4.bytecode是原始程式碼的編譯產物,這個也是最終會被放到區塊鏈上的標識。任何在網路裡的人都可以讀到這段bytecode.5.interface 是智慧合約除了bytecode之外的另一個核心,他是該智慧合約和外界溝通的核心6.web3.deploy 代碼,是可以直接部署在geth網路上的一段部署代碼,在上一章中,我們已經試過了,只要複製黏貼這段代碼,就可以直接在一個區塊鏈私有鏈上進行部署,並且調用他。7.from 代表合約由那個帳戶生成,那個帳戶生成,則生成所需的gas就需要該帳戶承擔,預設為eth.accounts[0],因為所有的挖礦所得的乙太幣也預設都存入該帳戶中區。 data: 代表的就是bytecode gas: 代表的是為了部署該合約最多準備的gas數量,當然實際上可能用不了這麼多gas,具體消耗以實際使用量為准,這裡只是設定一個最大量。8.最後這段是一個典型的javascript的非同步調用的寫法,將上面的new方法的結果傳遞給下一個方法 function(e,contract) 在下一個方法中處理如果挖礦成功的顯示結果。

到這裡為止,我們已經詳細剖析了一個最簡單的智慧合約,以及乙太坊的一些底層技術細節。下一章中,我們仍將在browser-solidity這個工具中,討論稍微複雜點的智慧合約。

發文時比特幣標準價格 買價:¥7201.00 賣價:¥7108.00

3.點擊create,會在記憶體中將該智慧合約創建一個實例,即將下面的web3 deploy代碼部署在虛擬的記憶體中。4.bytecode是原始程式碼的編譯產物,這個也是最終會被放到區塊鏈上的標識。任何在網路裡的人都可以讀到這段bytecode.5.interface 是智慧合約除了bytecode之外的另一個核心,他是該智慧合約和外界溝通的核心6.web3.deploy 代碼,是可以直接部署在geth網路上的一段部署代碼,在上一章中,我們已經試過了,只要複製黏貼這段代碼,就可以直接在一個區塊鏈私有鏈上進行部署,並且調用他。7.from 代表合約由那個帳戶生成,那個帳戶生成,則生成所需的gas就需要該帳戶承擔,預設為eth.accounts[0],因為所有的挖礦所得的乙太幣也預設都存入該帳戶中區。 data: 代表的就是bytecode gas: 代表的是為了部署該合約最多準備的gas數量,當然實際上可能用不了這麼多gas,具體消耗以實際使用量為准,這裡只是設定一個最大量。8.最後這段是一個典型的javascript的非同步調用的寫法,將上面的new方法的結果傳遞給下一個方法 function(e,contract) 在下一個方法中處理如果挖礦成功的顯示結果。

到這裡為止,我們已經詳細剖析了一個最簡單的智慧合約,以及乙太坊的一些底層技術細節。下一章中,我們仍將在browser-solidity這個工具中,討論稍微複雜點的智慧合約。

發文時比特幣標準價格 買價:¥7201.00 賣價:¥7108.00

Next Article
喜欢就按个赞吧!!!
点击关闭提示