web3js を使用して、署名を必要としない関数 (コントラクトの状態を更新しない関数など) を呼び出すのは簡単です。ただし、MetaMask ウォレットを手動でロック解除し、 Remix環境内で関数を呼び出す以外に、署名が必要な関数を呼び出す方法は明確ではありません。
初めて Ropsten に dapp をデプロイした後、最初に配列を設定するためにcreateItem(string name, uint price)
100 回呼び出す必要がありitems
ます。Remix では手動でやりたくないので、自動で行うスクリプトを書きたいと思います。
MetaMask を使用せずにプログラムでトランザクションに署名ethereumjs-tx
する必要があるようです。とweb3js
も必要です。このすべての情報と公式の web3js doc を使用して、次のことを思いつきます。account
privateKey
// 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
ここに私の質問があります:
- これは一般的に、私がやろうとしていることを行う正しい方法ですか?
nonce
1 が true の場合、デプロイされたコントラクトのパラメーターを取得するにはどうすればよいですか?
参考文献:
- 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,
}
しかし今、私はこの例外に遭遇し続けています:
未処理の拒否エラー: 返されたエラー: rlp: uint64 には入力文字列が長すぎます。(types.Transaction)(types.txdata).AccountNonce にデコードします
Google 検索は、例外ハンドラを含むこのファイル ( https://github.com/ethereum/go-ethereum/blob/master/rlp/decode.go ) を見つけさせてくれる以外は役に立ちませんでした。これを解決する方法を知っている人はいますか?