背景
okexchain由于与以太坊接口兼容,交易类型兼容,因此可以直接使用以太坊的客户端SDK来访问okexchain,比如使用ethers.js,truffle等。
问题:
Transaction hash mismatch from Provider.sendTransaction.
在使用ethers.js工具发送交易到okexchain的过程中,出现了交易执行失败的报错信息,但其实交易已经成功了。
ethers.js 报错信息:Transaction hash mismatch from Provider.sendTransaction.
ethers.js在本地生成了以太坊风格的交易哈希h(rlp编码+keccak256哈希),然后用该哈希h到okexchain链上查询交易是否成功,但是该交易在okexchain上的交易哈希h2(amino编码+sha256哈希)跟cosmos风格相同,跟以太坊风格的不同,因此哈希h在okexchain上查不到,ethers.js客户端认为交易发送失败,但其实交易发送成功。
解决方案:
js
- okexchain团队基于官方的etherjs上实现了amino+sha256算法,可以生成exchain或cosmos风格的交易hash。并且将其命名为
exchain-ethers
发布到了npm仓库,开发者可通过命令行安装exchain-ethers,替代原先的ethers项目
sudo npm install exchain-ethers
项目地址 https://github.com/okx/ethers.js/releases/tag/v5.4.0.1
- 如果不打算使用ethers.js,也可以参考其他方式,比如基于truffle实现js版本的交易发送。
代码范例 https://github.com/okx/solidity-sample/blob/main/js/index.js
go
oec官方也提供对go版本的交易发送方式,基于go-ethereum和comos-sdk实现交易发送。
代码范例 https://github.com/okx/solidity-sample/blob/main/go/exchain-web3-sample/main.go
java
oec官方也基于web3j,版本v3.4.0,实现了用java发送交易。
代码范例 https://github.com/okx/solidity-sample/blob/main/java/exchain-web3-sample/src/main/java/com/exchain/web3/util/ContractUtilTest.java
注意: