TruffleでEtherScan上のスマートコントラクトをVerifyしてみる
※2022/8/8追記: xdai
, sokol
にも対応した truffle-source-verify というプラグインを見つけたので、必要であればそちらもおすすめです
Etherscanのサイトから手動でもVerifyできるが、非常に大変なのでコマンドラインからVerifyする方法をメモ。
truffle-plugin-verify というTruffleプラグインが便利。
インストール
npm または yarn でインストール
npm install -D truffle-plugin-verify yarn add -D truffle-plugin-verify
truffle-config.js
にプラグインを追加
module.exports = {
/* ... rest of truffle-config */
plugins: ['truffle-plugin-verify']
}
Etherscan websiteにてEtherscanのAPI Key を作成
Etherscan API keyを
truffle-config.js
に追加
API keyを直書きするのではなく、dotenv
経由で読み込むのが望ましい。
module.exports = {
/* ... rest of truffle-config */
api_keys: {
etherscan: 'MY_API_KEY'
}
}
使い方
スマートコントラクトのdeployが完了したら、次のコマンドで1つ以上のコントラクトをVerifyできる。
truffle run verify SomeContractName AnotherContractName --network networkName [--debug]
--network
には truffle-config.js
に記載したネットワーク名を指定できる。
例えば、 rinkeby
にdeployした SimpleStorage
コントラクトをVerifyするには次のコマンドを実行する。
truffle run verify SimpleStorage --network rinkeby
コントラクトのアドレスを指定することもできる。
truffle run verify SimpleStorage@0x61C9157A9EfCaf6022243fA65Ef4666ECc9FD3D7 --network rinkeby
サポートされているチェーン
EtherScan以外も多様なチェーンがサポートされている。
module.exports = { /* ... rest of truffle-config */ api_keys: { etherscan: 'MY_API_KEY', optimistic_etherscan: 'MY_API_KEY', arbiscan: 'MY_API_KEY', bscscan: 'MY_API_KEY', snowtrace: 'MY_API_KEY', polygonscan: 'MY_API_KEY', ftmscan: 'MY_API_KEY', hecoinfo: 'MY_API_KEY', moonscan: 'MY_API_KEY', bttcscan: 'MY_API_KEY', aurorascan: 'MY_API_KEY', cronoscan: 'MY_API_KEY' } }
最新のサポート状況は公式の https://github.com/rkalis/truffle-plugin-verify をチェックしてほしい。
Truffleでdeployする前にガス代を見積もる方法
Gas estimation on mainnet · Issue #3367 · trufflesuite/truffle · GitHub
$ truffle migrate --dry-run
のようにdeploy時に --dry-run
オプションを付ければガス代をシミュレーションできるらしい。
ただし、多少の誤差はあるっぽい。
↓こちらの記事も参考になりました。
truffle - What is the real price of deploying a contract on the Mainnet? - Ethereum Stack Exchange
MetaMaskをインストールしてテストネットのFaucetを使ってみる
MetaMaskは、Ethereum系ブロックチェーンの通貨やNFTを一括で補完・管理できるソフトウェアウォレットであり、ブラウザ拡張機能版とモバイルアプリ版がある。(Wikipedia) https://ja.wikipedia.org/wiki/MetaMask
MetaMaskインストール
https://metamask.io/ からMetaMaskのWebブラウザ拡張をインストールできる。
セットアップ中にシークレットリカバリーフレーズが発行されるが、これは絶対に外部に公開してはいけないことを覚えておこう。
セットアップが完了すると、0xf3e6f572d9e062C0C39C2AE0A3B56466a09626a2
のようなウォレットアドレスが発行される。このアドレスは公開しても問題ない。(ちなみに、このウォレットアドレスは私koogawaのものなので、テストネットで送金のテストをしてもらっても構わない。なんならメインネットで投げ銭してもらうのも歓迎である)
Faucet
Faucet(フォーセット)とは、開発者がスマートコントラクトをテストするためにテスト用のイーサを無償で配布する仕組みである。Faucetはネットワークごとに複数存在する。例えばRinkebyの場合は下記サイトが利用できる。
- https://faucet.rinkeby.io/ 2022/7現在動いていないっぽい?
- https://rinkebyfaucet.com/ 動いてそうだが利用は自己責任で!
成功すると、WalletにEtherが入金される。
他のテストネットについては、MetaMaskの「購入>テストフォーセット>Etherを取得」からもFaucetを探せるのでぜひ試してほしい。
メインチェーンとサイドチェーン、そしてレイヤー1およびレイヤー2について理解したことをまとめてみる
間違っていたら教えて下さい。むしろ、ツッコミを期待しています。
1/ 最近ブロックチェーンについて調べているので、メインチェーンとサイドチェーン、そしてレイヤー1およびレイヤー2について理解したことをまとめてみる(間違っていたら教えて下さい)
— Kosuke Ogawa🌤️エンジニア🏝宮崎 (@koogawa) 2022年7月13日
2/ メインチェーン(例:Ethereum)メインのブロックチェーン。スマートコントラクトを実行するために必要な仮想マシン(EVM)を搭載するノードによって構成される。利用者が増えれば増えるほどトランザクションが増加し、ガス代が高騰中
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
3/ サイドチェーン(例:Polygon)
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
メインチェーンのスケーラビリティ問題を解決するため、メインチェーンと並列で動作するブロックチェーン。メインチェーンとは違うブロックチェーンを使ってトランザクションを処理する
4/ ブロックチェーンはレイヤー構造によって分類できる。
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
レイヤー1は「土台」にあたり、全てのトランザクションの基盤となる部分。Ethereumを例に挙げるとレイヤー1にはEthereumブロックチェーンが相当する。
5/ レイヤー2はレイヤー1のパフォーマンスを向上させるための技術(レイヤー2スケーリングソリューション)。レイヤー1を離れ、オフチェーンで動作する(Plasmaというオンチェーン型もある)レイヤー2での取引や計算プロセスは公開されないため、戻される結果を信じるしかない
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
6/ この辺りを調べていくと「サイドチェーンとレイヤー2の違いは?」という疑問にぶち当たる。どちらもブロックチェーンが抱えるスケーラビリティ問題を解決するものだが、大きな違いは
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
・オフチェーンかオンチェーンか
・同じブロックチェーンか違うブロックチェーンか
ということ。
7/ オフチェーンかオンチェーンか:
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
サイドチェーンはオンチェーンであるのに対し、レイヤー2はオフチェーンでの取引をメインとなるブロックチェーンに格納するため、メインチェーンから安全性の保証を引き継ぐ(のが理想だが実際はできてないらしい)
8/ 同じブロックチェーンか違うブロックチェーンか:
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
レイヤー2は同じブロックチェーンであるのに対し、サイドチェーンはメインチェーンとは違うブロックチェーンで動くので、サイドチェーンのセキュリティに依存することになる
9/ 以上、長々と書いてみましたが、ブロックチェーン技術についてはまだまだ勉強中なので、間違っているところがあればぜひ教えてください🙏
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年7月13日
Truffle + React Boxで簡単なスマートコントラクトを体験してみる
ブロックチェーンに 1
のような整数を書き込むだけのサンプルを見つけたので、動作手順をメモしておきます。
とりあえずスマートコントラクトを体験してみたい!という人におすすめです。
※MetaMaskをインストールしてない場合は下記記事を参考にインストールを完了してください
記事執筆時の環境
- Node.js v12.9.0
- Truffle v5.5.19
- MetaMask v10.17.0
Truffle
まずは Truffle をインストール。
$ npm install truffle
zshだと、インストール後に truffle
を実行しても "zsh: command not found: truffle" になってしまう問題が発生することがある。その場合は このあたりを検索するといろいろと対処法が出てくる。
Truffleには、Dappを作るのに便利なボイラープレートがたくさん用意されている。
今回はその中の「React Box」を使うことにする。(Reactの知識があることが望ましい)
適当なディレクトリを作り、React Boxをunboxする。
$ truffle unbox react
すると、次のようなディレクトリ構造が作られる。
truffle/contracts/SimpleStorage.sol
が今回重要となるソースコードである。.sol
という拡張子の通り、Solidityという言語で書かれている。
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; contract SimpleStorage { uint256 value; function read() public view returns (uint256) { return value; } function write(uint256 newValue) public { value = newValue; } }
Solidityに関する詳しい解説は省略するが、このSolidityでやっているのは下記の通りである。
SimpleStorage
というコントラクトを定義value
というuint256
型の状態変数を用意read() で
value` の値を読み込むwrite()
でvalue
型の値をブロックチェーンに書き込む
状態変数とは、コントラクトの永続ストレージにデータを格納するためのものである。つまり、この例では write()
を実行するたびにデータを格納するトランザクションが発生し、同時にガス代も発生する。変数を書き換えるためにお金を払う必要があるというブロックチェーンの仕組みは最初驚くことであろう。
public
や view
等のワードも重要な意味を持つので、ぜひ調べてみて欲しい。
deploy
コントラクトをdeployするには truffle migrate --network (NetworkName)
コマンドを使う。このコマンドを実行すると内部的にコンパイルも行われる。コンパイルだけしたい場合は truffle compile
コマンドを使うと良い。
deployの際は、予めネットワークの設定が必要になる。詳しくは下記記事を参照して欲しい。
Infuraを利用してTruffleからRinkebyに接続してみる - koogawa blog
ここではテストネットであるRinkebyにdeployすることにする。
$ truffle migrate --network rinkeby
deployが成功すると、コントラクトアドレスやガス代などがコンソールに出力される。このログから、スマートコントラクトをdeployするだけでもお金が必要ということがわかる。deployされたスマートコントラクトはetherscanのサイトから参照できる。
https://rinkeby.etherscan.io/address/0x74c7382e11311530757bedb953d7f302cfaef417
実行
deployまでできたので、次はWebブラウザからコントラクトを実行してみる。client ディレクトリに移動して次のコマンドを入力し、Webサーバを起動しよう。
$ npm run start
自動的にブラウザが立ち上がり、localhost:3000
が表示される。
ためしに「write()」ボタンに適当な整数を入力し、マウスでクリックするとMetaMaskが起動する。
ガス代を確認し「確認」をクリックするとトランザクションが開始し、しばらくするとトランザクションが完了した通知が送られてくる。
これで SimpleStorage
の value
、すなわちブロックチェーンにデータを書き込むことができたわけである🎉 「read()」をクリックすると、value
が書き換わっていることが確認できるはずだ。
フロントエンドからどのようにスマートコントラクトを実行したのか、については client/src
以下をじっくり読んで、ところどころ書き換えてみると理解が深まると思う。
ガス代
今回はテストネットを利用したのでガス代を気にする必要はなかった。しかし、メインネットにコントラクトをdeployする場合はそれなりのEtherが必要になるの。じっくり開発環境でテストを実施してからdeployすることをおすすめする。
Infuraを利用してTruffleからRinkebyに接続してみる
マネージドイーサリアムノードのサービスプロバイダであるInfuraを利用して、TruffleからRinkebyに接続する設定をメモする。
Infuraサインアップ
まずは https://infura.io/register にアクセスして、アカウントを作成する。最初にプロジェクトを作成するが、名前は何でも良い。
「MANAGE KEY」を押すとAPI KEYが表示されるのでそれをメモする。
truffle-config.js
Truffleの設定ファイルである truffle-config.js を開き、networks: {}
の中にRinkebyセクションを追加する。
rinkeby: { provider: () => { return new HDWalletProvider( mnemonic, `https://rinkeby.infura.io/v3/${infuraProjectId}` ); }, network_id: "*" },
また、上の方にある
require('dotenv').config(); const mnemonic = process.env["MNEMONIC"]; const infuraProjectId = process.env["INFURA_PROJECT_ID"]; const HDWalletProvider = require('@truffle/hdwallet-provider');
の行もコメントアウトする。
見て分かる通り dotenv
、HDWalletProvider
を使うのでそれぞれインストールする。
npm install dotenv npm install @truffle/hdwallet-provider
HDWalletProvider
はデプロイプロセスで利用できるプロバイダを作成するためのライブラリである。プロバイダを作成するためには、InfuraのAPI KEYおよびシークレットリカバリーフレーズ(ニーモニックとも呼ばれる)にアクセスする必要がある。そこで、環境変数を使ってアクセスできるようにしておく。
!!注意:シークレットリカバリーフレーズは絶対に公開しないように!!
$ export MNEMONIC="<あなたのシークレットリカバリーフレーズ>” $ export INFURA_PROJECT_ID="<INFURAのAPIKEY>”
ここまで設定すれば、truffle migrate --network rinkeby
などのコマンドを用いてRinkebyに接続できるようになる。
#WWDC22 What's new in MapKit メモ
所感
- pointOfInterestFilter、 showsBuildings、 showsTrafficなどdeprecated になるMKMapViewのプロパティがあるので、MapKit使っている開発者は見ておくべき
- アップルさんのデモもUIKitで作られていたので、地図アプリはまだフルSwiftUIで作るのはしんどいのかもしれない
- サンプルコードがとてもよくできているのでいちどビルドしてみるのをおすすめします
ツイートまとめ
さて、気になっていたWhat's new in MapKitをみていきますよ #wwdc22 https://t.co/xcexcO5iE1
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月9日
#WWDC22 iOS 15 まで使われていたMKMapViewの
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月9日
- mapType
- pointOfInterestFilter
- showsBuildings
- showsTraffic
などはdeprecatedに。
iOS 16からは新しいMKMapConfigurationが登場 pic.twitter.com/kWFAgFJj15
#WWDC22 MKMapConfigurationは抽象クラスであり、
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月9日
- MKImageryMapConfiguration: 航空写真
- MKHybridMapConfiguration: 航空写真+標準
- MKStandardMapConfiguration: 標準
が用意されてる。
それぞれ設定可能なプロパティが異なるようだ pic.twitter.com/ljBgdRhZeP
#WWDC22 iOS 16ではMapKitのオーバーレイの上にもラベルを表示できるように。これがデフォルトの動きになるっぽい pic.twitter.com/rZXDw2mueC
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月10日
#WWDC22 そういえばMapKitのデモアプリはUIKitで書かれていたなー。まだSwiftUIよりも書きやすいんだろうか
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月10日
#WWDC22 Selectable Map Features、つまりiOS 16からはPOI以外にも市や山、湖などを選択できるようなったってことかな。たしかに今までは建物しか選択できなかったよね pic.twitter.com/Ex0U5KJnZa
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月10日
#WWDC22 MapKitのサンプルアプリ、これはよくできている。このコードを読めば Look Aroundの実装を把握できそう / Explore a location with a highly detailed map and Look Around https://t.co/tDMTYGHrle pic.twitter.com/ljv8MFPMJV
— Kosuke Ogawa⛅エンジニア🏝宮崎 (@koogawa) 2022年6月10日