发代币历经波折,现在将过程记录如下。win适用,mac/linux更适用。
必备技能:1.科学上网条件。2.会使用npm 3.有足够的以太坊(0.2eth足矣)
发token其实是部署智能合约。要经历5个步骤:
- 搭建编译环境
- 编写智能合约
- 编译合约
- 部署合约
- 与合约交互
准备工作
- 科学上网条件
- chrome浏览器,安装metamask插件:https://metamask.io/
- node环境,npm命令,本文使用的是淘宝技术团队提供的cnpm
- 下载geth: https://geth.ethereum.org/downloads/
搭建编译环境
写智能合约用的最多的是solidity语言,然而编译环境实在是懒得吐槽。有在线编译,有框架编译。不过最推荐的是搭建在本地的在线编译。
在线编译
online版本 可能卡,可能慢
最好用最不好用的都是这个东西……好用是因为确实好用,不好用是因为科学上网都解决不了他慢的问题。所以最好下载本地版的。
#安装remix
cnpm install remix-ide -g
#导入有eth的账户,要用这个账户来部署合约呢
geth account import private.key
#本地启动geth 开启rpc和控制台
#这里起的是一个孤立节点,是为了不与其他节点同步数据
geth --nodiscover console --rpc --rpcapi 'web3,eth,debug' --rpcport 8545 --rpccorsdomain '*'
#另开一个控制台!另开一个控制台!另开一个控制台!
#启动remix,默认链接本地8545端口的geth的rpc(就是上面启动那个)
remix-ide
浏览器访问 http://127.0.0.1:8080 就能看到编译器了。虽然也是比较慢,但总算是能用了。
其他编译器
truffle
开发框架,不仅带编译功能,还带部署功能。然而东西略复杂。不推荐用。如果非要用。自行google
solc
之前没调通,现在调通了,有空补上。这个也蛮好用的。
编写智能合约
官方推荐的solidity
- github:https://github.com/ethereum/solidity/tree/v0.4.21
- 官方文档:http://solidity.readthedocs.io/en/v0.4.21/
solidity更新了好几版了。学起来不算太难。不过以发币为目的就不需要学太深入了。直接用ERC20官方模板就可以。
合约就在https://github.com/ConsenSys/Tokens/tree/master/contracts/eip20
编译
浏览器访问 http://127.0.0.1:8080 打开编译器。
左上角有个文件夹的标识,打开到下载的目录。选中三个文件一起打开。
点击右上角start to compile
可能会报一些黄色的warning 不需要理会,只要不是红色error就可以。
然后在start to compile
下面的选择框中选中EIP20
,然后点击旁边的Details
按钮(可能要等几秒钟)。
然后弹出框展示的就是部署需要的数据。需要的是BYTECODE
和ABI
。而WEB3DEPLOY
将BYTECODE
和ABI
包装成了js脚本,可以直接在geth控制台执行来部署合约。只需要稍加修改就可以使用。
接下来开始部署。
部署
部署合约是要消耗eth的,消耗的eth被称为gas,又叫汽油,手续费。部署由矿工来搞定,gas就是要支付的酬劳。
部署合约的操作要转换成多个step,每个step的执行都要消耗gas。最终消耗的eth量由两个参数来控制:gasPrice
和gas
。前者表示每个step消耗的eth,后者表示限定step
的最多执行数。最终消耗的eth是 step * gas
。
本文部署gasPrice
设定的是2GWei
,略慢,可设定到4GWei。
但是gas
的值一定要足够大,因为gas
限定了执行step数,如果step执行完而合约没部署完,那么操作回滚,gas不退。
这是第一个坑,我第一次设置的gas为50000,结果gas清零,部署失败!因此gas不妨设置得尽可能大。之所以说尽肯能,是因为gas的上限受限于两个条件:1.以太坊规定的上限,2.持有的eth量
gas设置的前提是要求账户有足够的eth,eth保有量必须大于设置的gas*gasPrice
。用不完的gas会退回来。这就意味着部署系统的账户,必须能用eth.getBalance()
查到余额,并且余额大于gas*gasPrice
假设由
eth.accounts[0]
来部署,我们称为部署账户
部署分两步:
- 加入变量,生成部署的操作码
- 支付gas,将操作码广播
不仅是部署,任何在以太坊网络的操作都分两步:生成操作码,广播操作码。
部署有两种方式:
- 在以太坊节点,执行上面复制的
WEB3DEPLOY
代码 - 在以太坊节点获取部署的操作码,用metamask广播部署
第1种方法要求节点必须能查到eth.accounts[0]
的余额。因为广播时会检查广播人的余额。如果查不到是无法广播的。只有节点数据同步到一定程度才能查到余额。所谓的一定程度是指:账户所在的数据块被同步。一般来说这是个短时间内无法完成的事情。
所以只能看第2个部署的方法
生成操作码
WEB3DEPLOY
中是直接部署的语句,需要修改成获取操作码的语句。先看下WEB3DEPLOY
的代码
var _initialAmount = /* var of type uint256 here */ ; //要发的token的数量
var _tokenName = /* var of type string here */ ; //token的名字
var _decimalUnits = /* var of type uint8 here */ ; //token精度
var _tokenSymbol = /* var of type string here */ ; //token的symbol
var eip20Contract = web3.eth.contract([{...}]); //contract括号内是abi,此处有省略
var eip20 = eip20Contract.new( //部署语句
_initialAmount,
_tokenName,
_decimalUnits,
_tokenSymbol,
{
from: web3.eth.accounts[0],
data: '0x6060604xxxxxxb0029', //bytecode,此处有省略
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
在上面我们已经把部署账户的私钥添加进来,就用这个账户来生成操作码。然后在上面打开的geth终端中执行下面命令。
这里要注意精度。假设发行100万个token,最小单位是0.01。那么精度就是100,token的总量应该是 100万*100,即 100000000。
//从上面获取abi(第5行)和bytecode(第12行)赋值到下面两个变量
> var abi = [{.....}]
> var bytecode = '0x6060604xxxxxxb0029'
> var c = eth.contract(abi)
> var cData = {from:eth.accounts[0], data:bytecode} //部署账户
> var dcode = c.new.getData('100000000', 'myEth', 100, 'METH', cData)
执行过后上面的dcode就是要广播的操作码了。
metamask部署
chrome安装metamask插件后,导入账户。然后点击send。
- Recipient Address 留空
- amount 填0
- transaction Data中填上操作码。点击next
- GasLimit: 5000000 GasPrice:3Gwei 点击submit 等待成功
部署需要一段时间。部署完成后点击部署成功的合约,可以跳到etherscan.io查看区块。这里要拿到合约地址。
查看token
还是因为数据同步的问题,只能在metamask中查看。
buy和send按钮下面有个token。点开后选择add token,填上获取到的合约地址,就能查看token余额了。
与合约交互见原文
网友评论