以太坊發(fā)行代幣

學(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è)合約里面的方法做一些具體操作,比如交易等等


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容