Ethereum Geth+;web3js发送已签名事务时发件人无效

Ethereum Geth+;web3js发送已签名事务时发件人无效,ethereum,web3js,go-ethereum,trezor,Ethereum,Web3js,Go Ethereum,Trezor,Im用于发送已签名的交易 我已成功将交易发送至: 块菌发展网络 罗普斯滕 现在我正在使用一个私有的本地go ethereum节点,对已签名事务的调用代码与对truffle和ropsten的调用代码完全相同,并且在发送事务时,我得到了无效的发送方 在对此进行一些研究时,我发现这个错误是由于没有相同的chainId和networkId造成的,我检查了我的配置以及如何运行geth节点,chainId与networkId相同 我已经在geth节点的genesis.json中指定了链id 10 "co

Im用于发送已签名的交易

我已成功将交易发送至:

  • 块菌发展网络
  • 罗普斯滕
现在我正在使用一个私有的本地go ethereum节点,对已签名事务的调用代码与对truffle和ropsten的调用代码完全相同,并且在发送事务时,我得到了
无效的发送方

在对此进行一些研究时,我发现这个错误是由于没有相同的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 
你知道为什么会这样吗

Im使用Geth1.8和web3 1.0-beta33

我认为这与geth的配置有关,因为正如我所说的,我已经用相同的代码向truffledev和Ropsten发送了事务


下面是我如何发送事务(源代码)

我已经设法解决了这个问题

除了在geth配置中指定链id和运行节点时,还需要在要签名的事务中指示它

因此,正确的方法是:

(一)

(二)

(三) 创建原始事务(注意chainId)

4) 然后签署交易(请注意此处的chainId):

编辑:跨平台帖子:

签名前:

rawTx.v=缓冲区从([chainId])
rawTx.nonce=wait web3.utils.toHex(web3.eth.getTransactionCount(account))

web3.eth.getTransactionCount(帐户“挂起”)也是获取挂起事务的必要条件。顺便问一下,你的答案有什么不同?
"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 
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);
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);
                   }

               });
       })
   }