摘要:最后毅然決然的選擇自己同步節(jié)點(diǎn)的苦逼之路。三用連接發(fā)起智能合約交易要發(fā)起交易首先要解決的就是問題一,不可以用。自己同步節(jié)點(diǎn)就可以先解鎖在簽名交易,然后發(fā)送交易給其他節(jié)點(diǎn)。
一.前言
前文提到目前有一些公司提供公共的以太坊對(duì)外服務(wù),就是以你可以調(diào)用他的web3接口,之前一直被兩個(gè)問題困擾,一個(gè)是覺得別人的節(jié)點(diǎn)不安全,還有初步嘗試后發(fā)現(xiàn)Infura節(jié)點(diǎn)沒有開放賬戶相關(guān)的方法。沒法使用web3.eth.sendTransaction方法,以為只能進(jìn)行一些查詢服務(wù),用處就較為雞肋。最后毅然決然的選擇自己同步節(jié)點(diǎn)的苦逼之路。看了大神文章,兩個(gè)問題迎刃而解,并踩過大神文章重的一些坑,實(shí)際的寫了一個(gè)群發(fā)幣腳本。
二.申請(qǐng)Infura目前較為主流的以太坊服務(wù)就是Infura,到Infura官網(wǎng)申請(qǐng),只要輸入一點(diǎn)基本資料和Email就可以得到API-key(輸入自己常用郵箱,回復(fù)的郵件不要?jiǎng)h除,因?yàn)镮nfura不存在登入系統(tǒng),所以再次使用只能去郵箱找API-key,沒保留只能再次申請(qǐng)了)。
三.用連接Infura發(fā)起智能合約交易要發(fā)起交易首先要解決的就是問題一,web3.eth.sendTransaction不可以用。為什么不能用呢,其實(shí)web3.eth.sendTransaction的原理是創(chuàng)建一個(gè)交易然后發(fā)給你連接的以太坊節(jié)點(diǎn),以太坊節(jié)點(diǎn)可以理解為有兩個(gè)功能,一個(gè)是發(fā)出一筆簽了名的正確交易,另一個(gè)是給本節(jié)點(diǎn)中處于解鎖狀態(tài)的賬戶中發(fā)來的交易簽名。自己同步節(jié)點(diǎn)就可以先解鎖在簽名交易,然后發(fā)送交易給其他節(jié)點(diǎn)。但I(xiàn)nfura提供給你的服務(wù)只有各種查詢和轉(zhuǎn)發(fā)交易,并沒把錢包開放給你儲(chǔ)存私鑰(開放也不放心存過去)。是的但你可以把簽名好的交易發(fā)給它他幫你轉(zhuǎn)發(fā)掉。所以第二個(gè)安全問題也就解決了,因?yàn)槟銢]有把私鑰發(fā)給它,只是把你認(rèn)可你自己簽名的交易發(fā)給他了。
下面是實(shí)現(xiàn)web3中用智能合約私鑰簽名的細(xì)節(jié):
1.創(chuàng)建一個(gè)交易對(duì)象
var _web3 = new Web3(yourInfuraAddress); const txData = { nonce: _web3.utils.toHex(nonce), gasLimit: _web3.utils.toHex(99000), // gasPrice: _web3.utils.toHex(10e9), // 10 Gwei to: contract_address, from: address1, value: "0x00", data: "0x"+"a9059cbb"+"000000000000000000000000"+address2+hexNum }
參數(shù)解釋:
nonce:整數(shù)類型,nonce從零開始計(jì)數(shù)每次加一,直接填寫較大的會(huì)等待它前面的數(shù)的交易完成才能交易,較小會(huì)失敗,使用與自己發(fā)送的處于pending狀態(tài)的交易相同的nonce,則會(huì)取消掉前一筆交易,所以一般錢包發(fā)給同一個(gè)人的前一筆交易被擁堵可以發(fā)送一個(gè)0eth的交易取消前面交易。我們使用下面方法獲取當(dāng)前的nonce:
_web3.eth.getTransactionCount(sendAddress).then(function(res){ nonce = res; }
gasLimit和gasPrice: gasPrice一般可以設(shè)置1G位到10G位之間,gasLimit話費(fèi)gas數(shù)量eth交易一般是固定21000個(gè),智能合約會(huì)根據(jù)合約方法復(fù)雜程度自動(dòng)變化,gaslimit可以設(shè)置消耗最大值,超過這個(gè)值將取消交易。(注意:需要轉(zhuǎn)換成16進(jìn)制,可以使用web3.utils.toHex方法。)
to:如果是智能合約交易則是智能合約地址
from:發(fā)起方的公鑰
value:轉(zhuǎn)賬的eth數(shù),智能合約交易請(qǐng)?zhí)?x00
data:這個(gè)有門道了,0x開頭表示十六進(jìn)制,前八位方法名一般基于erc20的tranlation方法為a9059cbb,其他的可以將合約粘貼到remix上面看,之后64位依次第一個(gè)參數(shù)接受token方第二個(gè)參數(shù)token數(shù)量(要16進(jìn)制不夠64位前面補(bǔ)0,補(bǔ)零方法在后邊,更加牛逼的用法官網(wǎng)參數(shù)解釋)
補(bǔ)零方法:
function addPreZero(num){ var t = (num+"").length, s = ""; for(var i=0; i<64-t; i++){ s += "0"; } return s+num; }
2.創(chuàng)建raw transaction
要引入另一個(gè)套件 ethereumjs-tx。記得先用 npm 安裝。建立raw transaction、
var Tx = require("ethereumjs-tx"); var tx = new Tx(rawTx);
3.使用私鑰簽名
const privateKey = new Buffer("", "hex"); tx.sign(privateKey);
4.交易序列化
const serializedTx = transaction.serialize().toString("hex")
5.發(fā)送交易及各種狀態(tài)初六
var tran = _web3.eth.sendSignedTransaction("0x" + serializedTx); tran.on("confirmation", (confirmationNumber, receipt) => { //console.log("confirmation: " + confirmationNumber); }); tran.on("transactionHash", hash => { console.log("hash"); console.log(hash); }); tran.on("receipt", receipt => { console.log("receipt:"); console.log(receipt); }); tran.on("error", (err)=>{ alert("出現(xiàn)錯(cuò)誤請(qǐng)查看控制臺(tái)"); console.log(err); });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/24045.html
摘要:將返回進(jìn)程碼查看實(shí)時(shí)查看日志關(guān)閉殺死進(jìn)程同步節(jié)點(diǎn)結(jié)論目前來說和都是可以同步成功節(jié)點(diǎn)完全可以放在國外,同步速度會(huì)很快,使用連接執(zhí)行腳本就好有特殊需求國內(nèi)阿里云也可以同步成功。 ETH公有鏈節(jié)點(diǎn)同步 最近區(qū)塊鏈公司很多都會(huì)搞發(fā)糖果活動(dòng),一般都能吸引幾萬粉絲,這就來了一個(gè)需求,給人家發(fā)糖果。主流的geth,parity,甚至imtoken錢包只能輸入地址一筆筆交易,幾萬筆交易人工根本無法完成...
摘要:可以解鎖,也可以將交易代碼寫函數(shù)內(nèi)。簽名交易同理封裝一個(gè)異步函數(shù),實(shí)際上簽名交易分為兩個(gè)步驟簽名一個(gè)交易發(fā)送這個(gè)簽名的交易到區(qū)塊鏈。 一.開發(fā)環(huán)境安裝及其搭建 1.安裝node 最好v8的可以使用ES6語法2.安裝ganacheganache介紹:雖說真實(shí)發(fā)布必須要使用前文說到的三種方法geth,parity,或其它服務(wù)商,但是測(cè)試開發(fā)環(huán)境下,有一款本地基于內(nèi)存的錢包,不需要等待確認(rèn)交...
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊 Web 錢包 3 - 展示錢包信息及發(fā)起簽名交易)](https://learnblockchain.cn/20...,請(qǐng)讀者前往原文閱讀 以太坊去中心化網(wǎng)頁錢包開發(fā)系列,將從零開始開發(fā)出一個(gè)可以實(shí)際使用的錢包,本系列文章是理論與實(shí)戰(zhàn)相結(jié)合,一共有四篇:創(chuàng)建錢包賬號(hào)、賬號(hào)Keystore文件導(dǎo)入導(dǎo)出、展示錢包信息及發(fā)起簽...
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開發(fā)以太坊 Web 錢包 3 - 展示錢包信息及發(fā)起簽名交易)](https://learnblockchain.cn/20...,請(qǐng)讀者前往原文閱讀 以太坊去中心化網(wǎng)頁錢包開發(fā)系列,將從零開始開發(fā)出一個(gè)可以實(shí)際使用的錢包,本系列文章是理論與實(shí)戰(zhàn)相結(jié)合,一共有四篇:創(chuàng)建錢包賬號(hào)、賬號(hào)Keystore文件導(dǎo)入導(dǎo)出、展示錢包信息及發(fā)起簽...
摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...
閱讀 1774·2021-10-11 10:57
閱讀 2363·2021-10-08 10:14
閱讀 3401·2019-08-29 17:26
閱讀 3358·2019-08-28 17:54
閱讀 3031·2019-08-26 13:38
閱讀 2906·2019-08-26 12:19
閱讀 3616·2019-08-23 18:05
閱讀 1284·2019-08-23 17:04