Ethereum Web3の使い方


Ethereum Web3.js v1.0について解説した文献が英語でもほとんど存在しないので、書きます。Beta版だから、解説するのも面倒だというのもあるけど、今後1.0が主流になるんだから、書きます。

これは下記記事のおまけ
https://note.mu/missmonacoin/n/n4c3baaa2351c

下準備


const Web3 = require('web3')

const hdkey = require('ethereumjs-wallet/hdkey')
const web3 = new Web3()

Ether残高を取得

web3.eth.getBalance(address).then(balanceWei=>{
    const balanceEth=web3.utils.fromWei(balanceWei, "ether")
    console.log(`Your balance is ${balanceWei} (${balanceEth}ETH)`)
})

スマートコントラクトを読み込み(読み込み系)

const erc20ABI=[/* JSON Interface(ABI)がここに入る。ここではERC20のtransfer(address)があると家庭 */]
const contractAddress="0x.............."
const callerAddress="0x..........." //関数を呼び出す人は誰かを指定


const contract =new web3.eth.Contract(erc20ABI,contractAddress,{
  from:callerAddress
})
const balance=async contract.methods["balanceOf"](
              callerAddress
            ).call()

スマートコントラクトを読み込み(書き込み系)

const erc20ABI=[/* JSON Interface(ABI)がここに入る。ここではERC20のtransfer(address)があると家庭 */]
const contractAddress="0x.............."
const callerAddress="0x..........." //関数を呼び出す人は誰かを指定

const nonce = async web3.eth.getTransactionCount(callerAddress) //Ethereum特有のTX整理番号
const tx={
            nonce,
            from:callerAddress,
            gasPrice: web3.utils.numberToHex(100000000000000000),
            gas: web3.utils.numberToHex(50000),
            chainId: CHAIN_ID,
            to: contractAddress,
            value: "0x0"
          }
const contract =new web3.eth.Contract(erc20ABI,contractAddress,{
  from:callerAddress
})
tx.data=contract.methods["transfer"](
              this.sendAddress,
              10000000 //実際に使うときはdecimalsも注意
            ).encodeABI()
const signedTx = async web3.eth.accounts.privateKeyToAccount("0x"+hdkey.fromMasterSeed(seed)
    .derivePath(HD_DERIVATION_PATH).getWallet()
    .getPrivateKey().toString("hex"))
    .signTransaction(tx)
const response = async web3.eth.sendSignedTransaction(signedTx.rawTransaction)

スマートコントラクトをデプロイ

const erc20ABI=[/* JSON Interface(ABI)がここに入る。ここではERC20のtransfer(address)があると家庭 */]
const contractAddress="0x.............."
const callerAddress="0x..........." //関数を呼び出す人は誰かを指定

const nonce = async web3.eth.getTransactionCount(callerAddress) //Ethereum特有のTX整理番号
const tx={
            nonce,
            from:callerAddress,
            gasPrice: web3.utils.numberToHex(100000000000000000),
            gas: web3.utils.numberToHex(50000),
            chainId: CHAIN_ID,
            to: contractAddress,
            value: "0x0"
          }
const contract =(new web3.eth.Contract([])).deploy({
          data:"0x"+this.deployment.data
        })
tx.data=contract.encodeABI()
const signedTx = async web3.eth.accounts.privateKeyToAccount("0x"+hdkey.fromMasterSeed(seed)
    .derivePath(HD_DERIVATION_PATH).getWallet()
    .getPrivateKey().toString("hex"))
    .signTransaction(tx)
const response = async web3.eth.sendSignedTransaction(signedTx.rawTransaction)

Etherを送金

const erc20ABI=[/* JSON Interface(ABI)がここに入る。ここではERC20のtransfer(address)があると家庭 */]
const from="0x.............."
const to="0x..........." //関数を呼び出す人は誰かを指定

const nonce = async web3.eth.getTransactionCount(from) //Ethereum特有のTX整理番号
const tx={
            nonce,
            from,
            gasPrice: web3.utils.numberToHex(100000000000000000),
            gas: web3.utils.numberToHex(50000),
            chainId: CHAIN_ID,
            to,
            value: web3.utils.numberToHex(web3.utils.toWei(""+sendEther, "ether"))
          }
const signedTx = async web3.eth.accounts.privateKeyToAccount("0x"+hdkey.fromMasterSeed(seed)
    .derivePath(HD_DERIVATION_PATH).getWallet()
    .getPrivateKey().toString("hex"))
    .signTransaction(tx)
const response = async web3.eth.sendSignedTransaction(signedTx.rawTransaction)

ガスリミットを計算

const erc20ABI=[/* JSON Interface(ABI)がここに入る。ここではERC20のtransfer(address)があると家庭 */]
const from="0x.............."
const to="0x..........." //関数を呼び出す人は誰かを指定

gasProm=web3.eth.estimateGas({
            from,
            to
          })

変数名がところどころ間違っているけどご愛嬌