Go-Ethereum
Geth 和 Web3js:發送簽名交易時發送方無效
我使用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'})