谷歌插件開發(四)

所謂會者不難,難者不會。

因爲沒有經驗,加之相關文檔不多的緣故,今天確實遇到一個糟心事情。

首先是插件,錢包轉賬需要用到一個插件: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)=>{});

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章