以太坊區塊鏈智能合約基礎介紹

The Basic Introduction of Ethereum Blockchain Smart Contract

Ethereum簡介

區塊鏈是一個去中心化的分散式資料庫,而Ethereum利用區塊鏈的公平與公正性來發展智能合約在區塊鏈系統上,讓區塊鏈不再只是單純的數位貨幣轉換與交易,更可以讓公司、組織或個人開發者在這個可追溯、難以篡改、高可信度的系統上發展更多元化的服務。

Ethereum是一個區塊鏈平台,使用者可以在上面撰寫與發佈程式(智能合約)來發展多元化的應用,國外已經有非常多團隊利用智能合約來打造服務(如 Slock.it、SkinCoin等),在Ethereum裡面智能合約通過,去中心化的虛擬機器(稱為「以太虛擬機」Ethereum Virtual Machine)來處理合約,Ethereum的概念首次在2013~2014年間,被程式設計師Vitalik Buterin提出,並在2015年啟動Ethereum Public Chain。

Ethereum特色

[Ethereum Virtual Machine (EVM)]

•Ethereum是一個blockchain平台,使用者可以在上面撰寫/發布程式(智能合約)

•智能合約程式本身與執行時的輸入輸出都會儲存在blockchain中,任何人都可以存取

•智能合約執行在EVM中(Ethereum Virtual Machine)

1.類似於Java程式執行在JVM中

2.智能合約先編譯成EVM bytecode,由EVM來執行此bytecode

3.EVM is Turing complete

•使用EVM的原因有2個

1.通用性

2.安全性

[EVM通用性]

Ethereum有上千個節點,每一個節點的軟硬體環境都不一樣,Ethereum透過EVM來執行智能合約,確保每一個節點都有相同的執行環境。

智能合約與EVM關係示意圖

[EVM安全性]

既然任何人都可以發布智能合約,總是有人會製作惡意程式,來攻擊其他人,或是程式有漏洞而影響到其他節點,因此需要一個安全的執行環境,智能合約在EVM環境中執行時並不會影響到主要系統(例如:作業系統)

1.EVM在設計上是一個沙盒(sandbox),是一個和作業系統隔離開來的執行環境

2.在EVM中,智能合約無法存取檔案系統、網路或是其他一般程式,只能存取其他智能合約

雖然一般使用者可以對智能合約發送交易,但是真正執行智能合約的人是認證使用者,認證使用者在認證區塊/交易的時候執行智能合約,並將執行結果寫入blockchain

另外為了避免因無窮迴圈的惡意攻擊或疏失導致癱瘓節點,EVM使用gas機制,類似於使用電子產品需要消耗電力:

1.使用者在執行程式之前必須提供一些gas
 2.程式在執行每一條指令時會消耗固定gas
 3.如果程式執行結束時,gas還有剩餘,則此程式為正常執行,剩餘gas會返還交易發起人
 4.如果程式執行尚未結束,但是gas已經消耗完了,則此程式執行為無效,當作沒有發生,gas全部交給認證使用者

Smart contract介紹

智能合約是儲存在區塊鏈上的程式,經濟學人提到智能合約可以讓眾多組織的資料庫得以用低廉的成本互動,並且讓使用者寫下精密的合約,智能合約功能之一是產生去中心化自治組織,透過智能合約可以減少重複性高與繁瑣的人工作業。

[應用產業]

●IOT:

Slock.It開發的智慧鎖可以在付費後自動開啟,讓使用者在付費後可以幫電動車充電、或是打開租屋的房門

[影片連結]https://www.youtube.com/watch?v=-Ht23KXic1k

●智慧電網:

TransActive Grid讓使用者可以和鄰居買賣能源

●證券:

透過智能合約減少證券繁瑣的交易步驟,並提供快速清算與交割

●版權授權:

Ujo Music平臺讓創作人用智慧合約發布音樂,消費者可以直接付費給創作人

●眾籌平台:

The Rudimental讓獨立藝術家在區塊鏈上進行群眾募資

●租賃:

DocuSign & Visa將在未來使用智能合約支付的雛形

[影片連結]https://www.youtube.com/watch?v=2rLNbd6MQXg

[Smart contract與Ethereum節點的關係]

透過Ethereum提供的console介面就能與智能合約溝通,或使用Ethereum提供的javascript api(web3.js)或是json rpc api在行動裝置、網頁或是中介層上結合智能合約打造出一個具完整體系的Dapp(Decentralized Applications)系統,創造出更多元化的去中心化應用服務。

[Solidity]

Solidity是Ethereum其中一個較為主流的智能合約程式語言,撰寫完Solidity之後將奇編釋成位元組碼,然後發佈在以太坊區塊鏈上

設計智能合約的步驟:

●撰寫程式碼

下圖是一個經點的智能合約範例,合約中有一個type為uint的變數(storedData),並且有兩個function,一個為set()另一個為get(),當呼叫set()時需要帶入一個uint的值,而set()會將所帶入的值給storedData,透過get()可以取得storedData的值。

contract SimpleStorage {
  uint storedData;
  function set(uint x) {
storedData = x;
}
  function get() constant returns (uint) {
return storedData;
}
}

●編輯程式

1.線上編譯器:

https://ethereum.github.io/browser-solidity/

2.本地編譯:

●加入ethereum ppa
$sudo add-apt-repository ppa:ethereum/ethereum-qt
$sudo add-apt-repository ppa:ethereum/ethereum
$sudo apt-get update
●安裝go-ethereum
$sudo apt-get install solc
●編譯Solidity
$git clone --recursive https://github.com/ethereum/webthree-umbrella.git
$cd webthree-umbrella
$ ./webthree-helpers/scripts/ethupdate.sh --no-push --simple-pull --project solidity # update Solidity repo
$ ./webthree-helpers/scripts/ethbuild.sh --no-git --project solidity --cores 4 -DEVMJIT=0 -DETHASHCL=0 # build Solidity only
●編譯器執行檔solc的目錄為 solidity/build/solc,將此目錄加入環境變數$PATH
●使用指令:
solc — abi — bin — optimize — o <path> *.sol
編譯輸出interface
--abi
編譯輸出bytecode
--bin
編譯最佳化
--optimize
編譯輸出目錄
-o <path>

●發布智能合約:

有幾種方法可以發佈智能合約(如:geth console裡面、node.js)。

1.geth console

撰寫一個js檔,並在ABI與bytecode的部份填入,剛剛所編譯好的ABI與bytecode
$ vim testContract.js
var myContract = web3.eth.contract(ABI);
var contractInst = myContract.new(
{
from: web3.eth.accounts[0],
data: ‘bytecode’,
gas: 123456
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' +
contract.address +
' transactionHash: ' +
contract.transactionHash);
} })
存檔後開啟geth,來發布智能合約
// in geth console
> loadScript(“myContract.js”)

2.node.js

● 執行智能合約:

可以透過Ethereum提供的web3.js,或是直接在節點中執行智能合約。

●要執行智能合約,必須知道2項資訊
1.智能合約interface or abi
2.智能合約address:
在發佈後會回傳一個智能合約的地址
// in geth console
> var myContract = web3.eth.contract(ABI);
> var contractInst = myContract.at(“address”);
> contractInst.functionName.sendTransaction(…);

[關於智能合約的其他關念]

•在ethereum中,智能合約和一般使用者一樣都屬於一種帳號(account)

•一般使用者帳號(externally owned account): 由使用者所控制的帳號

•智能合約帳號(contract account): 由程式碼所控制的帳號,並且由一般使用者帳號所呼叫與執行

•智能合約不會自已執行,一定需要有人來呼叫它

•智能合約也有自己的存款(balance),並且可以呼叫其他智能合約(message)或對一般使用者發送交易

  • 智能合約一旦發布至blockchain中,其程式碼便不能更改

以太坊區塊鏈智能合約的基礎介紹大概先到這邊,之後會在講述更多與更細節的內容(如:Solidity更細部的解釋、節點如何架設等等)。

“如果您覺得文章有幫助到您,歡迎follow我的medium,可以一起交流與分享,或是給我一個「掌聲」,感謝!”