MOAC实战 - 7. 底层转账

说明

底层转账代表转移的是底层燃料币 MOAC,相当于以太坊的 ETH。这里和合约发行的ERC20代币不同

正文

第一步:

创建连接(前文有了,这里不再介绍)

第二步:

获取序列号,序列号的用途主要是防止双花攻击。其他区块链如井通链的 sequence 也和 MOAC 链的序号类似

1
let sequence = chain3.mc.getTransactionCount(address);

第三步:

组建发送交易的数据结构:

1
2
3
4
5
6
7
8
9
10
let rawTx = {
from: address,
to: to,
nonce: chain3.intToHex(sequence),
gasPrice: chain3.intToHex(30000000000),
gasLimit: chain3.intToHex(4000000),
value: chain3.toHex(chain3.toSha(value, 'mc')),
data: chain3.toHex(memo),
chainId: chain3.intToHex(chain3.version.network)
}

这里代表 A地址 -> B地址的一笔转账。

手续费概念请参考以太坊的手续费概念,这里写常量是做的简单方式处理

  • gasPrice 越大交易越快处理
  • gasLimit 此交易最大允许花费的手续费,这个手续费不能超过区块最大手续费

value 代表转账的金额,单位是 hex 的 sha 最小单位。 这里直接代码转换,非常方便。

data 数据在普通转账里面可以当做备注来使用,这里传入 UTF-8的值,会转换为 HEX 存入区块中。

data数据在合约部署中涉及到的比较复杂,这里不多做描述,这里只介绍普通转账

chainId 区块链id标识,有主网和测试网的区分。这里动态进行获取

第四步:签名

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

使用私钥把组建需要发送交易的数据结构进行签名,签名出来 Blob数据,拿签名数据去交易比较安全。

这一步一般在前端去做,服务器不接触用户的私钥。

第五步:提交上链

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

这里封装了一下,使用 es7 的 Promise 方法。使用过程是一样的。这些写比较美观,逻辑比较清晰。

有错误的话,err不为空,hash为空

无错误的话,err为空,hash有值

这里的hash还需要等待区块同步才能查询到结果,到链上查询这个hash会得到转账的基础信息和是否成功。

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

请我喝杯咖啡吧~