Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过使用账本nanos,我想签署一笔交易并发送它_Javascript_Node.js_Ethereum - Fatal编程技术网

Javascript 通过使用账本nanos,我想签署一笔交易并发送它

Javascript 通过使用账本nanos,我想签署一笔交易并发送它,javascript,node.js,ethereum,Javascript,Node.js,Ethereum,我正在尝试通过Node.JS发送以太坊交易,该交易通过Node.JS将ERC20代币发送给拥有Ledger Nano S的人,但我无法成功签署并发送该交易 首先,我通过ledgerhq API的signTransaction方法对事务进行签名,然后在签名后,使用sendSignedTransaction将其发送到主网。当我执行下面的代码时,分类账收到请求并显示交易的详细信息。但是,按下分类账的确认按钮后,控制台返回错误“返回错误:无效签名:加密错误(无效EC签名)” 从“@ledgerhq/h

我正在尝试通过Node.JS发送以太坊交易,该交易通过Node.JS将ERC20代币发送给拥有Ledger Nano S的人,但我无法成功签署并发送该交易

首先,我通过ledgerhq API的signTransaction方法对事务进行签名,然后在签名后,使用sendSignedTransaction将其发送到主网。当我执行下面的代码时,分类账收到请求并显示交易的详细信息。但是,按下分类账的确认按钮后,控制台返回错误“返回错误:无效签名:加密错误(无效EC签名)”

从“@ledgerhq/hw app eth”导入AppEth;
从“@ledgerhq/hw-transport-u2f”导入TransportU2F;
从“@ledgerhq/hw传输节点hid”导入TransportNodeHid;
从“以太坊JS tx”导入以太坊tx
const Web3=require('Web3');
从“ethereumjs util”导入{addHexPrefix,bufferToHex,toBuffer};
const web3=new web3(new web3.providers.HttpProvider('http://localhost:8545'));
变量destAddresses=['0xa6acFa18468786473269Dc1521fd4ff40F6481D9'];
风险价值金额=1000000000000;
var i=0;
var contract=new web3.eth.contract([token contract ABI…],'0x74a…');
const data1=contract.methods.transfer(destAddresses[0],amount.encodeABI();
常量exParams={
气体极限:6e6,
加斯普里斯:3e9,
从:“0x1A…”,
数据:数据1,
至:“0x74a…”,
值:“0x00”,
nonce:“0x0”,
链号:1,
v:“0x01”,
r:“0x00”,
s:“0x00”
}
异步函数makeSign(txParams){
const tx=新以太坊tx(txParams);
const txHex=tx.serialize().toString(“十六进制”);
常量signedTransaction='0x'+txHex;
让运输;
试一试{
transport=等待TransportNodeHid.create();
设eth2=新的AppEth(运输);
const result=wait eth2.signTransaction(“m/44'/60'/0'/0”,txHex)。然后(result=>{
web3.eth.sendSignedTransaction('0x'+txHex)
。然后(res=>{
控制台日志(res);
}).catch(错误=>{
console.log('sendSignedTransaction');
控制台日志(err);
});
}).catch(错误=>{
console.log('signTransaction');
控制台日志(err);
});
txParams.r=`0x${result.r',hex'}`;
txParams.s=`0x${result.s',hex'}`;
txParams.v=`0x${result.v',hex'}`;
返回结果;
}捕获(e){
控制台日志(e);
}
}
makeSign(exParams).then(function(){
console.log(“承诺解析2”);
}.catch(函数(){
控制台日志(“拒绝承诺2”);

});
您的代码已经将事务发送到网络。但是,仅等待“发送”承诺只会给您事务哈希,而不是收据。您需要将其视为事件发射器并等待“确认”事件

  const serializedTx = tx.serialize();
  web3.eth.sendSignedTransaction(serializedTx.toString('hex'))
    .once('transactionHash', hash => console.log('Tx hash', hash))
    .on('confirmation', (confNumber, receipt) => {
      console.log(`Confirmation #${confNumber}`, receipt);
    })
    .on('error', console.error);

要将其发送到您提到的mainnet,您可以在端口8545上运行本地geth节点并使用您的代码,也可以将web3指向或类似位置。

您的代码已将事务发送到网络。但是,只需等待“发送”promise只向您提供事务哈希,而不是收据。您需要将其视为事件发射器并等待“确认”事件

  const serializedTx = tx.serialize();
  web3.eth.sendSignedTransaction(serializedTx.toString('hex'))
    .once('transactionHash', hash => console.log('Tx hash', hash))
    .on('confirmation', (confNumber, receipt) => {
      console.log(`Confirmation #${confNumber}`, receipt);
    })
    .on('error', console.error);
如您所述,要将其发送到mainnet,您可以在端口8545上运行一个本地geth节点并使用您的代码,或者将web3指向或类似位置