Go-Ethereum
誰能指出 Web3.eth.sendTransaction 和 web3.eth.signTransaction 之間的區別?
我們是否需要在
web3.eth.signTransaction
通過web3.eth.sendTransaction
.例如:
當我做:
web3.eth.sendTransaction({ from: accs[0], to: wallet[0].address, value: '10000000000' })
我明白了:
{ transactionHash: '0x3b6b08f9b47780f86f54c575e587841e3ec73a2d284928673d731ae9e55419ed', transactionIndex: 0, blockHash: '0x6e16c78b4b93c7be0c7829c0b45af03d8c52837c8a70c55a4783b3e18cd05273', blockNumber: 1, gasUsed: 21000, cumulativeGasUsed: 21000, contractAddress: null, logs: [], status: true }
但是我的錢包裡沒有餘額
$$ 0 $$。地址
我們是否需要在通過
web3.eth.signTransaction
發起交易後簽署交易web3.eth.sendTransaction
?對我來說,你使用after這個詞的事實意味著你在這裡完全感到困惑……除非你真的是說之前……
無論哪種情況,這裡都是交易:
只有在您連接的節點上
web3.eth.sendTransaction({from: account, ...})
解鎖了此功能後,您才可以使用。account
當您使用 Ganache 來測試您的合約時,通常會出現這種情況 - 它會根據您的配置為您解鎖多個帳戶(預設為 10 個帶有私鑰的帳戶
0x000...1
)0x000...a
。您也可以通過 顯式解鎖帳戶
web3.eth.personal.unlockAccount
,儘管這通常不是推薦的工作模式,因為任何入侵您的節點的人也可以使用您解鎖的帳戶(因此您需要以各種方式保護它,例如通過 https)。否則,您需要按以下順序使用以下功能:
web3.eth.accounts.signTransaction
web3.eth.sendSignedTransaction
這是我通常做的(在 web3 v1.0.0-beta.34 上測試):
async function send(web3, transaction) { while (true) { try { const options = { to : transaction._parent._address, data : transaction.encodeABI(), gas : (await web3.eth.getBlock("latest")).gasLimit }; const signed = await web3.eth.accounts.signTransaction(options, PRIVATE_KEY); const receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction); return transactionReceipt; } catch (error) { console.log(error.message); console.log("Press enter to try again..."); await new Promise(function(resolve, reject) { process.stdin.resume(); process.stdin.once("data", function(data) { process.stdin.pause(); resolve(); }); }); } } }
這是一個用法範例(從
async
函式執行):const receipt = await send(web3, myContract.methods.myFunc(arg1, arg2, arg3));