共计 2341 个字符,预计需要花费 6 分钟才能阅读完成。
Hello world 是最简单的程序之一,也是大部分程序员编写的第一个程序。区块链入门也从最基础的 Hello world 智能合约开始。
在正式部署执行 Hello world 智能合约之前,我们需要在电脑上安装 MetaMask for CMT。这是一个安装在 Chrome 浏览器的钱包工具,它的主要功能是管理 CyberMiles 帐号私钥,实现从网页上直接支付 CMTs (包括 gas 费)等功能。
安装过程比较简单,去 Chrome 应用商店中下载插件 MataMask for CMT,打开开发者模式。
如果 Chrome 浏览器中已经安装了其他版本的 MetaMask,为了不影响使用,最好暂时停止使用其他版本的 MetaMask,只留 Metamask for CMT 激活。
安装好 MetaMask for CMT,生成一个新的 CyberMiles 帐号来存储 CMTs,在最上方选择 Main CyberMiles Network 或 CMT Test Network。
MetaMask 需要有真实的 CMT 或者 test CMT 来支付执行智能合约的 gas 费,分别对应主链状态、测试链状态。
CMT 转账速度非常快,差不多 10 秒就到账了,并且不用支付 gas 费,转账体验 + 1 分!
在 Chrome 里打开 Remix for CMT,将写好的 Hello World 智能合约代码放进中间的代码编辑区,当然,你也可以选择自己写代码。
之后点击右侧的 Start to compile, 编译器会自动检查这段代码是否存在常规性错误。没有问题的话,编译器会自动识别出该段合约的名称,也就是 Contract 后面的 Greet。
如果有问题,编译器会给出提示,根据提示修改代码,再次编译即可。
检查代码没有问题后,就可以把 Greet 智能合约部署到 CyberMiles 区块链了。点击右侧最上方的 Run,然后点击 Deploy。这时需要调用 MetaMask for CMT 支付部署智能合约所需要的 gas 费。
一般情况下,MetaMask 的支付页面会自动跳出,点击 Submit 进行支付就可以了。如果没有自动跳出,手动点击插件就好了。可以看到,部署这个合约上链只需要花费 0.000489 个 CMT。
支付完 gas 费后,右下方 Deployed Contracts 处就可以看到,我们的合约已经在 CyberMiles 链上部署好了。
红色的 terminate 可以终止这个合约,但只有合约 owner 才可以执行这项操作,终止合约同样需要支持少量 gas 费。
greet 显示智能合约的内容是什么,在这里是 Hello World。当然,Hello World 这个词只是程序员的选择。作为智能合约的开发者,你可以让 greet() 返回任何字符 — 可以是一首歌,一篇文章,一本书,或者是一段加密的文字。owner 显示这个合约的所有权归哪个地址所有。你为这个合约支付部署 gas 费的账号地址就是合约的所有者。
同时用区块浏览器 www.cmttracking.io/ 查询交易地址信息,可以看到刚刚创建的合约地址。如果你的朋友有这个合约地址,在 At Address 栏内输入合约地址,点击 At Address 就可以收到别致的智能合约问候啦!
我们上面知道怎么用 Hello World 智能合约在区块链存一段话,并让世界上任何人看见这段话。那么,这是怎么在代码里实现的呢?
pragma lity ^1.2.4;
这是智能合约所用的代码语言及版本。
contract Greet {
function greet() {
}
function terminate() {
}
}
以上代码介绍了智能合约的名字 Greet,以及两个功能,greet 和 terminate。
address public owner;
modifier onlyOwner() {
assert(msg.sender == owner);
_;
}
constructor () public {
owner = msg.sender;
}
以上的代码设置了合约的 owner,owner 的地址信息是公开的。信息发送者,也就是谁支付了 gas 费,让合约能够部署到链上,谁就是 owner,并且定义了只有 owner 能够修改这个合约。
function greet() public pure returns (string) {
return “Hello world”;
}
以上代码表明当你调用 greet() 时,就会出现 Hello World。这个功能只是从区块链上读取数据,所以不需要 gas 费用。这里你可以把 Hello World 改成任何文字。
function terminate() external onlyOwner {
selfdestruct(owner); }
这就是智能合约最开始定义的 terminate 终止合约的功能,并且定义了只有 Owner 可以执行这项功能。selfdestruct 是析构函数,用于销毁数据,终止合约。
这个最基础的合约既设置了合约的 Owner,同时也设置了 Owner 能够销毁合约,当执行 selfdesruct 时,合约里的钱也会返还给 Owner。
因为合约地址与钱包地址长地非常像,并且长度也一致,如果不小心把币打到了合约地址,一般情况下,是无法找回的。但如果你知道合约的 owner 是谁,可以联系合约的 owner,在销毁合约时拿回你的资产。
这只是个人的小损失,如果项目方没有认真地对待代码,带来的资产损失是非常严重的。非常典型的案例是,今年 7 月份,Polkadot 有超过 513,774.16 ETH 被冻结在 Parity 钱包中,就是因为合约中的 owner 被人设成 null 了,因此没有人可以终止合约,拿回存在合约里的钱。现在,钱仍然被锁在合约里,永久冻结。
谨慎对待,认真审查每一段代码,尤其是涉及到钱的代码,这是每个程序员该有的素质。
这是最简单最基础的 Hello World,完整代码可去 github 查看。