學(xué)習(xí)目的:
1.了解智能合約
2.環(huán)境搭建
3.利用solidity編寫(xiě)hello world合約
4.合約部署和互動(dòng)
5.編寫(xiě)發(fā)行代幣的合約
了解智能合約:
1.智能合約是一套以數(shù)字形式定義的的承諾,包括合約參與方可以在上面執(zhí)行這些承諾的協(xié)議。
2.以太坊中具體定義,它是運(yùn)行在可復(fù)制,共享賬本上的計(jì)算機(jī)程序,可以處理信息,接收、儲(chǔ)存和發(fā)送價(jià)值。
3.以太坊中使用Solidity編寫(xiě)智能合約程序。
環(huán)境安裝:
1.開(kāi)發(fā)框架使用 truffle
2.測(cè)試框架使用testrpc(包含以太坊區(qū)塊鏈測(cè)試環(huán)境以及JavaScript版本的Ethereum虛擬機(jī))
安裝命令:npm install -g ethereumjs-testrpc truffle
版本:Truffle v4.1.3 (core: 4.1.3) Solidity v0.4.19 (solc-js)?
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2)
3.IDE atom,使用etheratom插件來(lái)調(diào)試編寫(xiě)solidity
版本: atom 1.24.1 x64 mac版本
4.geth客戶端
版本:?1.8.2-stable-b8b9f7f4 amd64
5.nodejs
版本:node-v8.10.0.pkg
合約編寫(xiě):
? /Users/lion/my_project/_eth >mkdir test_truffle
? /Users/lion/my_project/_eth >cd test_truffle
? /Users/lion/my_project/_eth/test_truffle >truffle init
完成后,你將擁有如下目錄:
*?contracts?智能合約目錄?
*?migrations?發(fā)布腳本目錄
*?test?存放測(cè)試文件?
*?truffle.js?Truffle的配置文件
合約內(nèi)容:

合約編譯:
> truffle compile
命令返回:
Compiling ./contracts/HelloWorld.sol...
Writing artifacts to ./build/contracts
同時(shí)在項(xiàng)目目錄下會(huì)生成一個(gè)build的目錄,里面的內(nèi)容是編譯后的結(jié)果文件.
合約部署:
編寫(xiě)部署文件:
在migrations目錄,1_initial_migration.js文件中添加兩行代碼:
var Migrations = artifacts.require("./Migrations.sol");
var HelloWorld = artifacts.require("./HelloWorld.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
deployer.deploy(HelloWorld);
};
編寫(xiě)鏈接以太坊客戶端的配置文件:
module.exports = {
networks: {
development: {
host: "localhost", port: 8545, network_id: '*', // 匹配任何network id gas:5000000 } } };
啟動(dòng)testrpc:
> testrpc
部署命令:
>truffle migrate --reset
返回結(jié)果:
Using network 'development'.
Running migration: 1_initial_migration.js ? Replacing Migrations... ? ... 0x088bbc083c39d1a8b9ff33943257b1f87c50c5937584c24488a0b74bf77d2af3 ? Migrations: 0xae9d2511c50958863dd30a374ebc1783a4349232 ? Deploying HelloWorld... ? ... 0x49fd087ea9c1da6d3453193e79bcdbeec54595874423bc23267008d4240bf731 ? HelloWorld: 0x0d400f2540406a86c3a725b118aaab5ef54e705f Saving successful migration to network... ? ... 0xa3a7cc28a0ef03c473cbaf3d6d2892fa5c441798b06ea6dcb5143862ae8b6099 Saving artifacts...
合約調(diào)用:
> truffle console
truffle(development)> var contract
undefined
HelloWorld.detectNetwork truffle(development)> HelloWorld.deployed().then(function(instance){ contract = instance })
undefined? ? ? ? ?
truffle(development)> contract.setContent("123")
{ tx: '0x8b17186c45e31502537828b6a439260d1889e76279807d62fb539fe6faeeb5f9', ? receipt:? ?? { transactionHash: '0x8b17186c45e31502537828b6a439260d1889e76279807d62fb539fe6faeeb5f9', ?? ? transactionIndex: 0, ?? ? blockHash: '0x431aa934dff9d539462d02b3f84e7f60380ceb815f40f0ddb3cf230aa0a63d45', ?? ? blockNumber: 11, ?? ? gasUsed: 42847, ?? ? cumulativeGasUsed: 42847, ?? ? contractAddress: null, ?? ? logs: [], ?? ? status: 1 }, ? logs: [] }
truffle(development)> contract.sayContent();
'123'
成功^_^!
編寫(xiě)代幣的合約:
以太坊的上發(fā)行代幣,需遵循ERC20協(xié)議,才能在mist 等客戶端發(fā)布。
以下是簡(jiǎn)略版本,發(fā)布到geth客戶端中使用。
pragma solidity ^0.4.19;
contract MyToken
{
? ? string public name;
? ? string public symbol;
? ? uint8 public decimals;
? ? mapping (address => uint256) public balancesOf;
? ? address public owner;
? ? event Transfer(address indexed from, address indexed to, uint256 value);
? ? function MyToken(uint256 _supply, string _name, string _symbol, uint8 _decimals) public
? ? {
? ? ? ? if(_supply == 0)? _supply = 1000000;
? ? ? ? owner = msg.sender;
? ? ? ? balancesOf[msg.sender] = _supply;
? ? ? ? name = _name;
? ? ? ? symbol = _symbol;
? ? ? ? decimals = _decimals;
? ? }
? ? function transfer(address _to, uint _value) public
? ? {
//? ? ? ? require(balancesOf[msg.sender] < _value); //避免轉(zhuǎn)移出去的代幣超過(guò)當(dāng)前的存貨
//? ? ? ? require(balancesOf[_to] + _value < balancesOf[_to]); //避免自己調(diào)用自己,或者遞歸調(diào)用
? ? ? ? balancesOf[msg.sender] -= _value;
? ? ? ? balancesOf[_to] += _value;
? ? ? ? Transfer(msg.sender, _to, _value);
? ? }
? ? function mint(uint _amount) public
? ? {
? ? ? ? balancesOf[owner] += _amount;
? ? }
}
部署合約:
//truffle框架部署代碼
var MyToken = artifacts.require("./MyToken.sol");
module.exports = function(deployer) {
? deployer.deploy(MyToken, 1000000, "太平幣", "TBB", 18);
};
//部署操作命令和步驟
>geth --datadir "chain" --rpc --rpcaddr localhost --rpcport 8545 --nodiscover console --vmdebug 2>> eth.log //本地啟用私有鏈測(cè)試
> miner.start() && personal.unclockAccount() 啟動(dòng)挖礦和解鎖賬戶
//再第二個(gè)終端,合約目錄下使用以下命令
> truffle migrate --reset //部署命令,同時(shí)結(jié)果會(huì)返回合約地址,注意觀察
Running migration: 1520850885_my_token.js??
Replacing MyToken...0x281ec1591b90387e50922aac7cc8383ab6549eaf30b735a688b7d811b7f4111b ?
MyToken: 0x414d2fd5357f63b22fa0be50d2f4c61c4e68097e //合約地址
Saving successful migration to network... ? ... 0x94737295782072187b4466e72b5e6c4ea43bde0b64ee43be553ef3da788cff12 Saving artifacts...
//再?gòu)腷uild/contract/MyToken.jso文件中拷貝abi:字段的值,值需要轉(zhuǎn)義和壓縮
//回到geth命令行中
> var my_token = eth.contract(JSON.parse('轉(zhuǎn)義后的abi值')).at("合約地址");
然后可以調(diào)用這個(gè)合約里面的方法做一些具體操作,比如交易等等