以太坊发行代币

学习目的:

1.了解智能合约

2.环境搭建

3.利用solidity编写hello world合约

4.合约部署和互动

5.编写发行代币的合约


了解智能合约:

1.智能合约是一套以数字形式定义的的承诺,包括合约参与方可以在上面执行这些承诺的协议。

2.以太坊中具体定义,它是运行在可复制,共享账本上的计算机程序,可以处理信息,接收、储存和发送价值。

3.以太坊中使用Solidity编写智能合约程序。


环境安装:

1.开发框架使用 truffle

2.测试框架使用testrpc(包含以太坊区块链测试环境以及JavaScript版本的Ethereum虚拟机)

安装命令: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插件来调试编写solidity

版本: atom 1.24.1 x64 mac版本

4.geth客户端

版本: 1.8.2-stable-b8b9f7f4 amd64

5.nodejs

版本:node-v8.10.0.pkg


合约编写:

➜ /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 发布脚本目录

* test 存放测试文件 

* truffle.js Truffle的配置文件


合约内容:

合约编译:

> truffle compile

命令返回:

Compiling ./contracts/HelloWorld.sol...

Writing artifacts to ./build/contracts

同时在项目目录下会生成一个build的目录,里面的内容是编译后的结果文件.

合约部署:

编写部署文件:

在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);

};

编写链接以太坊客户端的配置文件:

module.exports = {

networks: {

development: {

host: "localhost", port: 8545, network_id: '*', // 匹配任何network id gas:5000000 } } };

启动testrpc:

> testrpc

部署命令:

>truffle migrate --reset

返回结果:

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...

合约调用:

> 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'

成功^_^!


编写代币的合约:

以太坊的上发行代币,需遵循ERC20协议,才能在mist 等客户端发布。

以下是简略版本,发布到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); //避免转移出去的代币超过当前的存货

//        require(balancesOf[_to] + _value < balancesOf[_to]); //避免自己调用自己,或者递归调用

        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 //本地启用私有链测试

> miner.start() && personal.unclockAccount() 启动挖矿和解锁账户

//再第二个终端,合约目录下使用以下命令

> truffle migrate --reset //部署命令,同时结果会返回合约地址,注意观察

Running migration: 1520850885_my_token.js  

Replacing MyToken...0x281ec1591b90387e50922aac7cc8383ab6549eaf30b735a688b7d811b7f4111b  


MyToken: 0x414d2fd5357f63b22fa0be50d2f4c61c4e68097e //合约地址


Saving successful migration to network...   ... 0x94737295782072187b4466e72b5e6c4ea43bde0b64ee43be553ef3da788cff12 Saving artifacts...


//再从build/contract/MyToken.jso文件中拷贝abi:字段的值,值需要转义和压缩


//回到geth命令行中


> var my_token = eth.contract(JSON.parse('转义后的abi值')).at("合约地址");


然后可以调用这个合约里面的方法做一些具体操作,比如交易等等


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343