Go-Ethereum

Geth 和 Web3js:發送簽名交易時發送方無效

  • March 15, 2022

我使用https://trezor.io/發送簽名交易

我已成功將交易發送至:

  • 松露開發網路
  • 羅普斯滕

現在我使用一個私有的本地 go-ethereum 節點,簽名交易的呼叫與 truffle 和 ropsten 的程式碼完全相同,我Invalid sender在發送交易時得到

在對此進行一些研究時,我發現此錯誤是由於沒有相同的chainId和networkId而產生的,我檢查了我的配置以及我如何執行geth節點並且chainId與networkId相同

我在我的 geth 節點的 genesis.json 中指定了鏈 id 10

"config": {
   "chainId": 10,
   "homesteadBlock": 0,
   "eip150Block": 0,
   "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "eip155Block": 0,
   "eip158Block": 0,
   "byzantiumBlock": 0,
   "clique": {
     "period": 15,
     "epoch": 30000
   }
 }

我用networkId 10執行節點:

geth --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcport 8545 --rpcaddr '192.168.1.244' --rpccorsdomain="*" --ws --wsaddr "192.168.1.244" --wsorigins "http://192.168.1.182" --wsport 8546 --wsapi 'personal,db,eth,net,web3,txpool,miner' --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://8235e42bec82ad8944dcf65b57d25b7a970d6e94f35961a188b2dfd306c6964f2d00d078e3bf1d9ccc6664112669d7ea9c04aa45a8ab9113aa8fe8a04b088f80@127.0.0.1:30310' --networkid 10 --gasprice '1' -unlock 'd770217581e0ca1265c88c9faaff81f5038b129f' --password node1/password.txt --mine console 

關於為什麼會發生這種情況的任何想法?

我正在使用 geth 1.8 和 web3 1.0-beta33

我認為這與 geth 的配置有關,因為正如我所說,我已經使用相同的程式碼向 Truffle dev 和 Ropsten 發送了事務

這是我發送交易的方式(原始碼)https://github.com/ethereum/web3.js/issues/1669

好,

除了在 geth 配置中指定鏈 id 以及在執行節點時還需要在要簽名的事務中指明它

所以,正確的做法是:

"config": {
   "chainId": 10,
   "homesteadBlock": 0,
   "eip150Block": 0,
   "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "eip155Block": 0,
   "eip158Block": 0,
   "byzantiumBlock": 0,
   "clique": {
     "period": 15,
     "epoch": 30000
   }
 }
geth --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcport 8545 --rpcaddr '192.168.1.244' --rpccorsdomain="*" --ws --wsaddr "192.168.1.244" --wsorigins "http://192.168.1.182" --wsport 8546 --wsapi 'personal,db,eth,net,web3,txpool,miner' --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://8235e42bec82ad8944dcf65b57d25b7a970d6e94f35961a188b2dfd306c6964f2d00d078e3bf1d9ccc6664112669d7ea9c04aa45a8ab9113aa8fe8a04b088f80@127.0.0.1:30310' --networkid 10 --gasprice '1' -unlock 'd770217581e0ca1265c88c9faaff81f5038b129f' --password node1/password.txt --mine console 

3)創建原始交易(注意chainId)

var tx = {
          nonce: count ,
          gasPrice: web3.toHex(gasPriceGwei*1e9),
          gasLimit: web3.toHex(gasLimit),
          to: CONTRACT_ADDRESS,
          value: '0x00',
          data: getData,
          chainId:10,
          from:"0xedff546ac229317df81ef9e6cb3b67c0e6425fa7"
      };
      let response = await this.trezorSignTx(tx);

4)然後簽署交易(這裡也要注意chainId):

trezorSignTx= async(transaction)=> {
      let trezor=  await this.getTrezor();
      // spend one change output
      var address_n = "m/44'/1'/0'/0/0"
      // var address_n = [44 | 0x80000000,
      //                  60 | 0x80000000,
      //                  0  | 0x80000000 ,
      //                  0 ]; // same, in raw form
      var nonce = transaction.nonce.substring(2); // note - it is hex, not number!!!
      var gas_price = transaction.gasPrice.substring(2);
      var gas_limit = transaction.gasLimit.substring(2);
      var to = transaction.to.substring(2);
      // var value = '01'; // in hexadecimal, in wei - this is 1 wei
      var value = transaction.value.substring(2); // in hexadecimal, in wei - this is about 18 ETC
      var data = transaction.data.substring(2); // some contract data
      // var data = null  // for no data
      var chain_id = 10; // 1 for ETH, 61 for ETC
      console.log(transaction);
      return new Promise (function (resolve,reject) {
          trezor.ethereumSignTx(
              address_n,
              nonce,
              gas_price,
              gas_limit,
              to,
              value,
              data,
              chain_id,
              function (response) {
                  if (response.success) {

                      console.log('Signature V (recovery parameter):', response.v); // number
                      console.log('Signature R component:', response.r); // bytes
                      console.log('Signature S component:', response.s); // bytes
                      resolve(response);

                  } else {
                      console.error('Error:', response.error); // error message
                      resolve(null);
                  }

              });
      })
  }

這看起來像是 ethereumjs-tx 版本 2.0.0 的問題:https ://github.com/ethereumjs/ethereumjs-tx/issues/165 16

您將需要建構您的交易,如下所示:

const tx = new Tx(txObject, {chain:'ropsten', hardfork: 'petersburg'})

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