首页 文章

发送已签名的交易时,Geth web3js发件人无效

提问于
浏览
0

我使用https://trezor.io/发送已签名的交易

我成功地将交易发送到:

  • 松露开发网络

  • Ropsten

现在我正在使用私有本地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

2 回答

  • 0

    签字前: rawTx.v = Buffer.from([chainId]) rawTx.nonce = await web3.utils.toHex(web3.eth.getTransactionCount(account))

  • 0

    我设法解决了这个问题,

    除了在geth配置中指定chain id之外,当运行节点时,还需要在要签名的事务中指明它

    所以,正确的方法是:

    1)

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

    2)

    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)创建原始事务(note 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);
                       }
    
                   });
           })
       }
    

    EDIT :跨平台帖子:Send signed transactions to Ropsten or Truffle develop network with Trezor (Hardware Wallet)

相关问题