Go-Ethereum

誰能指出 Web3.eth.sendTransaction 和 web3.eth.signTransaction 之間的區別?

  • August 7, 2019

我們是否需要在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...10x000...a

您也可以通過 顯式解鎖帳戶web3.eth.personal.unlockAccount,儘管這通常不是推薦的工作模式,因為任何入侵您的節點的人也可以使用您解鎖的帳戶(因此您需要以各種方式保護它,例如通過 https)。

否則,您需要按以下順序使用以下功能:

  1. web3.eth.accounts.signTransaction
  2. 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));

引用自:https://ethereum.stackexchange.com/questions/73683