MOAC实战 - 8. 合约部署

概念

智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。

智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。

部署前准备

准备工作可以参考前面文章

新建合约文件

这里我们使用 Solidity 语言来编写合约。相关语法请自行学习。

新建 Test.sol

1
2
3
4
5
6
7
8
9
pragma solidity ^0.4.24;

contract HelloWord {
string public Say = "HelloWord";

function sayhello() public view returns(string memory){
return Say;
}
}

我们在MOAC上编写合约建议使用 0.4.x 版本,我们使用 0.4.24版本进行合约的编写。

编译合约文件

  • 选择编译库为 0.4.24
  • EVM VERSION 为默认
  • CONTRACT 选择默认
  • 点击编译按钮
  • 下方 ABI 和 Bytecode 可以复制出来

浏览器环境测试发布

  • ENVIRONMENT 选择 JavaScript VM 默认虚拟机
  • 点击 Deploy 部署按钮进行部署
  • 下面有两个方法可以点击调用

下载合约代码

本地新建三个文件

1
2
3
4
TESTDIR
├── Test.sol
├── Test.abi
├── Test.bytecode

把浏览器的代码拷贝到三个文件中去。

拷贝完成后,abi 和 bytecode像下图所示(仅结构,请忽略代码具体内容)

在MOAC链上部署合约

部署合约这里踩了很多坑,测试了很多方法。本地编译的坑最多,各种环境配置(不建议使用本地编译的方式,如想使用本地编译的方式,请自行研究)。

下面的部署方式是目前我接触的最优部署方式

1. 创建连接

创建连接的方法在前文已经介绍了,这里不再多做介绍了。

2. 声明部署账户

请确保部署账户中拥有一定数量的MOAC,因为部署合约需要消耗 Gas

1
2
3
4
5
// 发布合约的地址
const initWallet = {
address: "0x3E7F188981bb007CFF261d6E0Fb1A6cedBc4cfAd",
secret: "xxx"
}

3. 读取合约文件

1
2
3
4
5
6
7
const fs = require('fs');
const path = require('path');

// 读取合约BYTECODE
const solPath = path.join(__dirname, 'xxxxx/Test.bytecode');
const solFile = fs.readFileSync(solPath, 'utf8');
const bytecodeJson = JSON.parse(solFile).object;

4. 组建部署参数

具体解释可以参考代码里面的注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 加上 0x 头
const bytecode = "0x"+bytecodeJson;

// 获取燃料使用,这一步可以使用常量
const gasEstimate = chain3.mc.estimateGas({data: bytecode});

// 获取sequence
const txcount = chain3.mc.getTransactionCount(initWallet.address);

// 创建合约的交易json
const rawTx = {
from: initWallet.address,
nonce: chain3.intToHex(txcount),
gasPrice: chain3.intToHex(420000000000), //chain3.intToHex(chain3.mc.gasPrice)
gasLimit: chain3.intToHex(gasEstimate),
to: '0x',
value: '0x',
data: bytecode,
shardingFlag: 0, //default is global contract
chainId: chain3.version.network
}

5. 签名

1
const signature = chain3.signTransaction(rawTx, initWallet.secret);

6. 上链

1
2
3
4
5
const { err, hash } = await new Promise(resolve => {
chain3.mc.sendRawTransaction(signature, function(err, hash) {
resolve({ err, hash });
});
});

7. 查询结果

图片仅代表结构,具体内容只是做参考

注意:

这里查询返回的hash,只有 status 为 success 时才算部署成功。

这里消耗了一定数量的 gas,具体代表的含义可以自行 google。

结语

在MOAC部署合约和在以太坊上部署合约一样都比较简单,只是缺少一些好的文档进行参考。

这里掉坑爬坑,分享些经验给大家,可以帮助大家少走弯路。

附件资料

附件一个 openzeppelin v2.0 规范的 ERC20 标准的代币的代码。
大家可以研究下这个代码,也可以使用这个代码一键发币。
这个代码的 Solidity版本时 v0.4.24的,经测试,MOAC链对此支持比较友好。

参考资料

  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2020 翟天野

请我喝杯咖啡吧~