我正在使用https://trezor.io/发送已签名的交易
我已成功将交易发送至:
现在我正在使用私有本地go-ethereum节点,已签名交易的调用与松露和罗普森的代码完全相同,发送交易时我得到了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
的方式答案 0 :(得分:0)
我设法解决了这个问题,
除了在geth配置中指定链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) 创建原始交易(注意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);
}
});
})
}
编辑:跨平台发布:Send signed transactions to Ropsten or Truffle develop network with Trezor (Hardware Wallet)
答案 1 :(得分:0)
在签名之前:
rawTx.v = Buffer.from([chainId])
rawTx.nonce = await web3.utils.toHex(web3.eth.getTransactionCount(account))