所谓会者不难,难者不会。
因为没有经验,加之相关文档不多的缘故,今天确实遇到一个糟心事情。
首先是插件,钱包转账需要用到一个插件:ethereumjs-tx
使用这个插件,把转账的相关数据进行处理,然后通过web3相关的api来进行转账的操作。
let tx = new EthereumTx(details) //使用的时候控制台一直报错
这很让人恼火,找了资料才发现有两个版本:
2.0版本的写法变掉了,但是web3js的api里面没有更新这个写法,所以会一直报错,要么使用新写法要么回退。
我觉得2.0版本写法繁琐,就给回退了。
数据处理问题解决了,那么下面就是转账功能啦。
根据网上一众大佬的文章,得出了如下的文档:
let details = { "to": '0x4445Bbd1f0942857741EEbA3B36970390E9cb887',// 接收方地址 "value": self.$web3.utils.toHex(self.$web3.utils.toWei('0.01', 'ether')),// 转账 0.1wei gasLimit: self.$web3.utils.toHex(99000), gasPrice: self.$web3.utils.toHex(10e9), "nonce": self.$web3.utils.toHex(res++), // 序号ID, 重要, 需要一个账号的交易序号,可以通过web3.eth.getTransactionCount(web3.eth.defaultAccount)获得 "chainId": self.walltContent.CHAIN_ID//主网ID }
接下来是重点:
//先把这个数据转buffer let privateKey = Buffer(‘0x66b3fd79a49dafe44507763e9b6739aa0810de2c15590ac22b5e2f0a3f502073’, 'hex')
//然后使用上面提到的插件把数据转换掉
let tx = new EthereumTx(details)
//继续按照官方api处理数据
tx.sign(privateKey)
var serializedTx = tx.serialize();
let raw = '0x'+serializedTx.toString('hex');
//调用sendSignedTransaction方法转账
self.$web3.eth.sendSignedTransaction(raw).on('receipt',(res)=>{ })
我使用的是bsc测试网,上面的写法对比了好几次后发现跟官方还有其他大佬文章一样阿达,但是可就是死活各种问题,要么是gas费不够要么就是账户钱不够,翻来覆去的,gas费改了无数遍就是不行。
后来在web3教程中才发现buffer的那个数据是私钥,我当时还纳闷怎么都不要私钥就能转账了呢?
然后我就修改了我的buffer,但是还是不行,控制台依旧报错。
因为tx.sign操作私钥的时候,要把私钥前面的'0x'去掉才行。
一切准备就绪后,运行,一分钟不到就转账成功啦!
下面是完整代码:
self.$web3.eth.defaultAccount = walltAddress; self.$web3.eth.getTransactionCount(self.$web3.eth.defaultAccount).then(res=>{ let details = { "to": '0x4445Bbd1f0942857741EEbA3B36970390E9cb887',// 接收方地址 "value": self.$web3.utils.toHex(self.$web3.utils.toWei('0.01', 'ether')),// 转账 0.1wei gasLimit: self.$web3.utils.toHex(99000), gasPrice: self.$web3.utils.toHex(10e9), "nonce": self.$web3.utils.toHex(res++), // 序号ID, 重要, 需要一个账号的交易序号,可以通过web3.eth.getTransactionCount(web3.eth.defaultAccount)获得 "chainId": self.walltContent.CHAIN_ID } let privateKey = Buffer(data.privateKey.substr(2), 'hex') let tx = new EthereumTx(details) tx.sign(privateKey) var serializedTx = tx.serialize(); let raw = '0x'+serializedTx.toString('hex'); self.$web3.eth.sendSignedTransaction(raw).on('receipt',(res)=>{});
标签:插件,tx,utils,谷歌,web3,开发,let,eth,self From: https://www.cnblogs.com/sixrookie/p/16960942.html