上文"區塊鏈 (Blockchain) 在供應鏈 (Supply Chain) 與企業資源規劃 (ERP) 系統扮演什麼角色?"提到區塊鏈的智能合約在企業應用上很重要,這篇就來實作一下在區塊鏈 (Blockchain) 上使用 Remix 部署智能合約 (Smart Contract)吧。
智慧型合約概念於1994年由一名身兼電腦科學家及密碼學專家的學者尼克·薩博首次提出,到了2015年乙太坊區塊鏈推出之後,智能合約 (Smart Contract) 才更具體的被使用在區塊鏈上。
比特幣 (BitCoin) 區塊鏈與乙太坊區塊鏈都可以開發智能合約,但是與比特幣智能合約來比較,乙太坊的智能合約被認為較符合圖靈完備 (Turing Completeness)。
意思就是乙太坊的智能合約開發比較完備,完備的意思就是可以開發任何情況的智能合約,至於原因是什麼,你可以參考這篇文章"Turing Completeness and Cryptocurrency"。
區塊鏈上儲存資料比較容易理解,但是智能合約的程式碼為何可以放在區塊鏈? 這些程式碼在哪裡執行?
乙太坊的智能合約程式碼會將 Bytecode (位元組碼) 及 ABI (Application Binary Interface) 儲存在區塊鏈,然後可以在乙太坊的虛擬機器 (Ethereum Virtual Machine,EVM) 上執行。你可以想像 Bytecode 就是執行檔,ABI 就是外界跟執行檔溝通的介面 (有點像API)。
乙太坊的智能合約開發環境有很多種,其中比較方便使用的就是 Remix IDE,
Remix IDE 乙太坊智能合約開發環境 : https://remix.ethereum.org/
使用Solidity開發智能合約,裡面會有三個基本部分 : 合約的版權宣告、開發合約的Solidity版本、合約內容。
合約的版權宣告 : 可以參考這個列表 https://spdx.org/licenses/
為何智能合約需要宣告版權? 因為智能合約就是把程式碼上鏈,因此大家都可以看到你的智能合約,有些會看到原始碼,有些只看到 Bytecode (位元組碼)。不管是原始碼或是位元組碼,其實都算把智能合約公開了,因為位元組碼是可以解譯為原始碼的。
所以你的智能合約就需要宣告版權,讓大家知道可以如何使用。
開發合約的Solidity版本 : 因為Solidity一直在改版,所以需要知道你的智能合約是使用哪個版本寫的,這樣才能順利地在乙太坊虛擬機器 (Ethereum Virtual Machine,EVM) 上執行。
合約內容 : 就是你的合約定義了哪些規則。
例如一個空的智能合約就長這樣 :
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract MyContract {
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11; //指定編譯器版本
contract addTest{ //合約
uint result; //全域性變數
function getResult(uint _a, uint _b) public returns (uint){ //內部函式
result = _a + _b;
return (result);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract HelloWorld { string public name;
function setName (string memory newName) public { name=newName; }
function getGreeting() public view returns (string memory) { return string(abi.encodePacked("Hello, ", name)); } }
https://ethereum.stackexchange.com/questions/99971/what-does-enable-optimization-mean-in-remix-and-what-does-it-do
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract HelloWorld {
string public name;
constructor (string memory initName) {
name=initName;
}
function setName (string memory newName) public {
name=newName;
}
function getGreeting() public view returns (string memory) {
return string(abi.encodePacked("Hello, ", name));
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract SimpleBank {
address payable public owner;
constructor () {
owner = payable(msg.sender);
}
function sendMoney () public payable {
}
function sendMoneyTo (uint _amount, address _to) public payable {
payable(_to).transfer(_amount);
}
function withdrawMoney(uint _amount) external {
require(msg.sender==owner,"Only owner can do this.");
payable(msg.sender).transfer(_amount);
}
function getBalance () external view returns (uint) {
return address(this).balance;
}
}
https://www.tutorialspoint.com/solidity/solidity_constructors.htm
https://steemit.com/blockchain/@oneleo/solidity-constructor
https://rinkeby.etherscan.io/address/0x37Dcc7822cf1A48F4D735a64e7cfe02365B83fbE
https://www.youtube.com/watch?v=PdNxXGGWJRI
發行Token的智能合約上鏈後的資料如下 : (使用Flatten整合智能合約檔案)
https://rinkeby.etherscan.io/address/0x6B83F25B4EaebDc7a77661dFCD8132E9dE01e316
以下的影片說明從無到有的建立一個 Solidity 智能合約的過程 (英文)
https://www.youtube.com/watch?v=s9MVkHKV2Vw
這是他的範例原始碼 :
https://gist.github.com/rodgtr1/427a6e0cea78281fb9ad8ea9980bb5a2
參考資料 :
Smart Contract 開發 https://ithelp.ithome.com.tw/users/20092025/ironman/1759
Ethereum 智能合約開發筆記 https://gist.github.com/Ankarrr/561fb3e49bd22847780fb93f0e382f59
0 留言