背景(background)
最近一段时间一直在研究区块链,之前其实还算是有点排斥的,对区块链了解的特别浅显.或许面未知的领域人的本性当中总有一种排斥,总是站在自己的角度,站在经验的角度,以一种高的姿态去观望.当一种新的技术颠覆了之前人们脑海中习以为常的经验的时候,那时你再进场或许为时已晚.所以在这里告诫自己,时刻保持学习的姿态.
梯子(prequisite)
没有梯子就别搞了,很多东西都在墙外,下面介绍一下各个系统的梯子。梯子用的是shadowsocks
,反正我觉得挺好用的,有免费的节点不过好像不稳定,也有收费的不懂的可以自己去搜一下
工具(tools)
-
etherscan
image.png
在以太坊平台上进行的所有交易都可以去etherscan上去查询,对每笔交易都有很清晰的描述.
-
以太坊钱包(EthereumWallet)
image.png
站在梯子上,点击这个download就可以下载,注意选择自己操作系统对应的版本
操作流程
- 安装钱包,选择 rinkeby testnet
下载好以太坊钱包后选择testnet
,别选成mainnet
了,发行代币要收费的,测试环境可以免费获取ether的,所以我就直接在测试链演示了,如果你在主链有ether的话,和测试链操作没有区别的。因为相当于一个以太坊节点,所以会去同步该链中所有的区块信息,不过这是点对点下载的所以速度还是挺快的
同步区块信息
选择rinkeby测试链
-
创建账户
进入钱包后首先选择wallet,下面有 add account,然后输入密码就直接添加好了
创建账户
创建好账户之后可以看到账户的ether为0,但是在平台发行代币是需要矿工费的,所以我们先去弄点money
账户信息
- 测试链rinkeby ether领取
进入测试链ether领取的链接,可以看到有三种方法获取,我们就用第一种在推特上发一条推文,点击下面圈出来的tweet的链接
ether领取
接着会弹出以下编辑好的推文,然后发下面的那个0x000开头的一长串地址换成你的账户上面的那个地址,最后点击发推
image.png
随后进入推特,找到刚才发的那个推文,copy链接
image.png
最后回到之前的那个领取界面,把链接粘贴进去就ok了,大概过一段时间会发到你的账户里,如果不放心可以去etherscan上面查询交易详情
image.png
过一段时间回到自己的钱包,可以看到钱已经到了
image.png
-
构建智能合约
构建合约
接着把是下面这个链接里的code copy到上面的code栏
智能合约code地址(https://www.ethereum.org/token#the-code)
这里我把decimal这只成了2,就是不想有太多零头,token name ,和 token symbol自己可以随便命名,下面可以看到我为了快速的创建智能合约把费用拉到最大了,最后点击发布就ok了
image.png
-
执行一笔转账
image.png
- 去测试链etherscan上验证
rinkeby etherscan
输入合约地址,进行查询可以看到交易详情
image.png
总结(summary)
真的不容易,一步步走到了这里,不过挺开心的,自己的代币在rinkeby etherscan上面都可以查询到,其实现在以太坊平台的很多代币基本上都是这种方式去创建的,这以上环节的核心部分就是 智能合约的创建,也就是那段代码,因为这段代码是不可变的,所以如果代码中有bug那将是个灾难.而且代码一定要简洁,遵循函数式编程,声明式的.不然写那么多代码可都是钱,二进制代码发送到区块上,矿工去执行,是按照你逻辑复杂度收费的。
大家也可以去coinmarket上面看看,很多token都是建在Ethereum平台上,但是有多少是真正做实事的,有多少是圈钱跑路的,大家要小心点,当然如果别人是跑路的你和庄家在一个点上也能捞一波。。。但是泡沫之后留下来的肯定都是真正做事的。
接下来就是去探索dapp,最近一直在研究eos,但是毕竟eos testnet刚搭起来,资料不是很多,写智能合约用的是c++,其实也不是什么难事,但是要去写简洁的代码就需要下功夫了。当然不能只研究技术,思考技术的价值,如何利用技术去变现,如何让技术更好的服务更多的人是我们一直需要思考的.
不管怎么样,人工智能和区块链一直是十分感兴趣的方向,当然这两个结合在以后肯定是一个趋势.
网友评论
1、我用windows钱包在创建代币的时候,代码和代币信息都填好了,发布代币页面的地址AMOUNT不可选是空的,没有数字和地址可选,点提交按钮没有一点反应,无法发布
2、在测试网络上面发布的代币,在正式网络看不到吧,要发布可用的代币要去正式网络发布吗?
Functions in interfaces should be declared external.
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
^-----------------------------------------------------------------------------------------------^