gpt4 book ai didi

ethereum - 将已签名的交易发送到 Ropsten

转载 作者:行者123 更新时间:2023-12-01 12:15:28 27 4
gpt4 key购买 nike

使用 web3js 调用不需要签名的函数很容易(例如,不更新合约状态的函数)。但是,除了手动解锁我的 MetaMask 钱包和调用内部函数 Remix 之外,不清楚如何调用需要签名的函数。环境。

首次将我的 dapp 部署到 Ropsten 后,我需要调用 createItem(string name, uint price) 100 次填充 items数组最初。由于我不想在 Remix 中手动执行此操作,因此我想编写一个自动执行此操作的脚本。

看来我需要 ethereumjs-tx除了web3js在没有 MetaMask 的情况下以编程方式签署交易。我也需要我的 accountprivateKey .有了所有这些信息和官方的 web3js 文档,我想出了以下内容:

// Call an external function programatically

const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io"))
const account = "ACCOUNT_ADDRESS"
const privateKey = new Buffer('PRIVATE_KEY', 'hex')
const contract = new web3.eth.Contract(abi, CONTRACT_ADDRESS, {
from: account,
gas: 3000000,
})

const functionAbi = contract.methods.myFunctionName(myArgument).encodeABI()

let estimatedGas
contract.methods.myFunctionNAme(myArgument).estimateGas({
from: account,
}).then((gasAmount) => {
estimatedGas = gasAmount.toString(16)
})

const txParams = {
gasPrice: '0x' + estimatedGas,
to: CONTRACT_ADDRESS,
data: functionAbi,
from: account,
}

const tx = new Tx(txParams)
tx.sign(privateKey)

const serializedTx = tx.serialize()

web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).
on('receipt', console.log)

代码运行,但 txParams实际上少了一把 key : nonce .运行此程序时,您会收到以下错误:
Unhandled rejection Error: Returned error: nonce too low

以下是我的问题:
  • 这通常是做我想做的事情的正确方法吗?
  • 如果 1 为真,我如何获得 nonce已部署合约的参数?

  • 引用:
  • http://web3js.readthedocs.io/en/1.0/
  • https://github.com/ethereumjs/ethereumjs-tx
  • https://ethereum.stackexchange.com/questions/21402/web3-eth-call-how-can-i-set-data-param
  • https://ethereum.stackexchange.com/questions/6368/using-web3-to-sign-a-transaction-without-connecting-to-geth

  • 更新:

    感谢 Adam,现在我学会了如何获取 nonce .所以我添加了以下代码:
    let nonce
    web3.eth.getTransactionCount(account).then(_nonce => {
    nonce = _nonce.toString(16)
    })

    const txParams = {
    gasPrice: '0x' + gasPrice,
    to: CONTRACT_ADDRESS,
    data: functionAbi,
    from: account,
    nonce: '0x' + nonce,
    }

    但现在我不断遇到这个异常:

    Unhandled rejection Error: Returned error: rlp: input string too long for uint64, decoding into (types.Transaction)(types.txdata).AccountNonce



    除了让我找到这个具有异常处理程序的文件( https://github.com/ethereum/go-ethereum/blob/master/rlp/decode.go )之外,谷歌搜索没有帮助。有谁知道如何解决这个问题?

    最佳答案

    一般看起来是正确的。我唯一的问题是你打算如何加载私钥?您需要提示输入私钥,或者在 keystore 中导入/读取并提示输入密码。您可以使用 keythereum完成此操作(请参阅 key import 部分的示例代码)。
    nonce只是用于为帐户订购交易的增量数字。要获得正确的值,只需使用 web3.eth.getTransactionCount(account)
    编辑 - 使用带有锁定帐户的 Ganache 运行示例(--secure 选项):

    SimpleContract.sol

    pragma solidity ^0.4.19;

    contract SimpleContract {
    uint public val = 4;

    function increment(uint amt) public {
    val += amt;
    }

    function get() public constant returns (uint) {
    return val;
    }
    }

    test.js
    const Web3 = require('web3');
    const Tx = require('ethereumjs-tx');

    const provider = new Web3.providers.HttpProvider("http://localhost:8545");
    const web3 = new Web3(provider);

    const account = '0x9a6d82ef3912d5ab60473124bccd2f2a640769d7'; // Ganache
    const privateKey = Buffer.from('70f1384b24df3d2cdaca7974552ec28f055812ca5e4da7a0ccd0ac0f8a4a9b00', 'hex');
    const contractAddress = '0x6dd7c1c13df7594c27e0d191fd8cc21efbfc98b4'; // Deployed manually
    const abi = [{"constant":true,"inputs":[],"name":"val","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amt","type":"uint256"}],"name":"increment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}];

    const contract = new web3.eth.Contract(abi, contractAddress, {
    from: account,
    gasLimit: 3000000,
    });

    const contractFunction = contract.methods.increment(3);

    const functionAbi = contractFunction.encodeABI();

    let estimatedGas;
    let nonce;

    console.log("Getting gas estimate");

    contractFunction.estimateGas({from: account}).then((gasAmount) => {
    estimatedGas = gasAmount.toString(16);

    console.log("Estimated gas: " + estimatedGas);

    web3.eth.getTransactionCount(account).then(_nonce => {
    nonce = _nonce.toString(16);

    console.log("Nonce: " + nonce);
    const txParams = {
    gasPrice: '0x09184e72a000',
    gasLimit: 3000000,
    to: contractAddress,
    data: functionAbi,
    from: account,
    nonce: '0x' + nonce
    };

    const tx = new Tx(txParams);
    tx.sign(privateKey);

    const serializedTx = tx.serialize();

    contract.methods.get().call().then(v => console.log("Value before increment: " + v));

    web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', receipt => {
    console.log(receipt);
    contract.methods.get().call().then(v => console.log("Value after increment: " + v));
    })
    });
    });

    结果:
    $ npm run my_test

    > hello_world_dapp@1.0.0 my_test C:\cygwin\home\adamk\eth\hello_world_dapp
    > node ./test.js

    Getting gas estimate
    Estimated gas: 6919
    Nonce: 5
    Value before increment: 19
    { transactionHash: '0xb6fdfc36cc32cb01a2be8832a387da586a44a37c1241bbf2979745536f206ed4',
    transactionIndex: 0,
    blockHash: '0xb6ee8d4e45585010d9a12d48aa37a478eb6021aad78599f1719cb424ab364bb5',
    blockNumber: 10,
    gasUsed: 26905,
    cumulativeGasUsed: 26905,
    contractAddress: null,
    logs: [],
    status: 1 }
    Value after increment: 22

    关于ethereum - 将已签名的交易发送到 Ropsten,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48838899/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com