以太坊作為區塊鏈2.0技術的代表,與比特幣最大的不同就在於其圖靈完備性,可以編寫智慧合約。今天,就在以太坊上寫一個簡單的Solidity程式,來了解下智慧合約的開發環境。
準備知識
-
#####以太坊本地客戶端geth
上一篇已經講解了geth的本地編譯和基本使用。
-
Solidity程式語言
基於以太坊的智慧合約使用一種類似於JS的叫Solidity的程式語言編寫,副檔名為.sol。它也是以太坊官方推薦的程式語言。
-
EVM執行環境
上面說到Solidity類似於JavaScript,它的執行環境是EVM(Ethereum Virtual Machine),以太坊虛擬機器。EVM執行在以太坊節點上。
-
編譯IDE
EVM執行的是智慧合約的位元組碼,所以在部署智慧合約之前需要編譯。之前以太坊提供的IDE叫Mix(現在已經停止維護),現在使用的是一個網頁形式呈現的編譯器,叫ReMix。
我們執行Solidity程式時,需要將Solidity拷貝到程式碼區然後編譯執行。當然,我們也可以下載一個離線版的ReMix到本地。
-
#####合約部署
智慧合約的部署是指把合約位元組碼釋出到區塊鏈上,並使用一個特定的地址來標示這個合約,這個地址稱為合約賬戶。 以太坊中有兩類賬戶:
- 外部賬戶 該類賬戶被私鑰控制(由人控制),沒有關聯任何程式碼。
- 合約賬戶 該類賬戶被它們的合約程式碼控制且有程式碼與之關聯。和比特幣使用UTXO的設計不一樣,以太坊使用更為簡單的賬戶概念。
兩類賬戶對於EVM來說是一樣的。外部賬戶與合約賬戶的區別和關係是這樣的:一個外部賬戶可以通過建立和用自己的私鑰來對交易進行簽名,來傳送訊息給另一個外部賬戶或合約賬戶。
在兩個外部賬戶之間傳送訊息是價值轉移的過程。但從外部賬戶到合約賬戶的訊息會啟用合約賬戶的程式碼,允許它執行各種動作(比如轉移代幣,寫入內部儲存,挖出一個新代幣,執行一些運算,建立一個新的合約等等)。
只有當外部賬戶發出指令時,合同賬戶才會執行相應的操作。 合約部署就是將編譯好的合約位元組碼通過外部賬號傳送交易的形式部署到以太坊區塊鏈上(由實際礦工出塊之後,才真正部署成功)。
-
合約執行
合約部署之後,當需要呼叫這個智慧合約的方法時只需要向這個合約賬戶傳送訊息(交易)即可,通過訊息觸發後智慧合約的程式碼就會在EVM中執行了。
擼起袖子就是幹
1.準備以太坊賬戶
//1.從測試網路啟動一個以太坊網路節點
geth --datadir testNet --dev console 2>> test.log
//2.檢視賬戶,系統會有一個預設的賬戶
eth.accounts
//3.檢視餘額,由於是測試網路 預設賬戶會有大量的餘額
eth.getBalance(eth.accounts[0])
//4.建立新賬戶,使用者密碼為chaors 可以用2檢視
personal.newAccount("chaors")
//5.給新使用者轉賬 從一個地址轉給另一個地址9個以太幣
eth.sendTransaction({from:'0x4ca5da2d66d9bf9074bd2fd097f468d92cd15d17',to:'0x67588df863e337e78b290cb77809197de1b2fc38',value:web3.toWei(9,"ether")})
//6.部署合約前需要對賬戶進行解鎖
personal.unlockAccount(eth.accounts[1], "chaors")
複製程式碼
2.編寫HelloWorld合約程式碼
pragma solidity ^0.4.23; //solidity版本
contract helloWorld { //helloWorld合約
string hello; //字串變數
function hi(string _hello) public {
hello = _hello;
}
function say() constant public returns (string) {
return hello;
}
}
複製程式碼
編譯得到WEB3DEPLOY程式碼(JS指令碼)
複製的JS程式碼為:
var helloworldContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hello","type":"string"}],"name":"hi","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var helloworld = helloworldContract.new(
{
from: web3.eth.accounts[0],
data: '0x608060405234801561001057600080fd5b506102d7806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063954ab4b214610051578063f186264d146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b8060009080519060200190610202929190610206565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a7230582056e01e9d4d42bc4cefefd88238c2506481e8352b31b1cbe58662a291251c45c00029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
});
複製程式碼
3.合約部署
將複製的JS程式碼拷貝到geth JS控制檯,直接回車:
4.檢視helloword合約
這樣,我們通過一個很簡單的solidity程式碼瞭解了智慧合約的開發和部署流程。實際開發總體也就是這幾步,後面會詳細地做一些智慧合約的開發案例。
問題
-
這個helloworld的怎麼輸出一個字串呢???
. . . .
網際網路顛覆世界,區塊鏈顛覆網際網路!
--------------------------------------------------20180425 23:17