4

web3js を使用して、署名を必要としない関数 (コントラクトの状態を更新しない関数など) を呼び出すのは簡単です。ただし、MetaMask ウォレットを手動でロック解除し、 Remix環境内で関数を呼び出す以外に、署名が必要な関数を呼び出す方法は明確ではありません。

初めて Ropsten に dapp をデプロイした後、最初に配列を設定するためにcreateItem(string name, uint price)100 回呼び出す必要がありitemsます。Remix では手動でやりたくないので、自動で行うスクリプトを書きたいと思います。

MetaMask を使用せずにプログラムでトランザクションに署名ethereumjs-txする必要があるようです。とweb3jsも必要です。このすべての情報と公式の web3js doc を使用して、次のことを思いつきます。accountprivateKey

// 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実際には 1 つのキーがありません: nonce. これを実行すると、次のエラーが発生します。

Unhandled rejection Error: Returned error: nonce too low

ここに私の質問があります:

  1. これは一般的に、私がやろうとしていることを行う正しい方法ですか?
  2. nonce1 が true の場合、デプロイされたコントラクトのパラメーターを取得するにはどうすればよいですか?

参考文献:

  1. http://web3js.readthedocs.io/en/1.0/
  2. https://github.com/ethereumjs/ethereumjs-tx
  3. https://ethereum.stackexchange.com/questions/21402/web3-eth-call-how-can-i-set-data-param
  4. 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,
}

しかし今、私はこの例外に遭遇し続けています:

未処理の拒否エラー: 返されたエラー: rlp: uint64 には入力文字列が長すぎます。(types.Transaction)(types.txdata).AccountNonce にデコードします

Google 検索は、例外ハンドラを含むこのファイル ( https://github.com/ethereum/go-ethereum/blob/master/rlp/decode.go ) を見つけさせてくれる以外は役に立ちませんでした。これを解決する方法を知っている人はいますか?

4

2 に答える 2