koogawa blog

iOS、Android、foursquareに関する話題

Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient

SolidityとEthereumによる実践スマートコントラクト開発 ―Truffle Suiteを用いた開発の基礎からデプロイまで

👆こちらの本のサンプルを試していると大量に出てくる警告です。

constructor() public {
    _owner = msg.sender;
}

どうすればよい?

public を削除します。

constructor() {
    _owner = msg.sender;
}

solidity - Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient - Ethereum Stack Exchange

解説

Solidity 0.7.0からコンストラクターVisibility ( public / external ) は不要になりました。

Visibility (public / external) is not needed for constructors anymore:

Solidity v0.7.0 Breaking Changes — Solidity 0.7.0 documentation

本の執筆時点ではまだ必須だったのだと思われます。

If you intended this as a fallback function or a function to handle plain ether transactions, use the "fallback" keyword or the "receive" keyword instead.

SolidityとEthereumによる実践スマートコントラクト開発 ―Truffle Suiteを用いた開発の基礎からデプロイまで

👆こちらの本のサンプルを試しているとたまに出てくる警告です。

function () public payable {}

上記のようなフォールバック関数の定義箇所に原因がありそうです。

どうすればよい?

function() public payable {}

の代わりに

fallback() external payable {}

を使いましょう。

payable - Compiler solc expected a state variable declaration - Ethereum Stack Exchange

解説

Solidity v0.6.0からフォールバック関数の定義方法が変わったようです。

The unnamed function commonly referred to as “fallback function” was split up into a new fallback function that is defined using the fallback keyword and a receive ether function defined using the receive keyword.

Solidity v0.6.0 Breaking Changes — Solidity 0.7.4 documentation

夜9時には寝て朝5時に起きる生活を試してみてわかったこと

最近、夜9時には寝て朝5時に起きる、という生活を試している。なかなか良い感じなので、今回はその知見をメモしたいと思う。

そもそものきっかけは子供の寝かしつけ中に自分も寝落ちしてしまう問題が多発していたこと。やってみるとわかるが、暗い部屋で眠気に耐えながらじっと待つという行為は本当に疲れる。ひどい場合は1時間ぐらい寝てくれない日もざらにある。

・・・この時間、なんとかならないか?

そこで思いついたのが、それなら一緒に寝てしまおうというアイデアである。

実際に何度かこのスタイルを試してみてわかったメリットを挙げていく。

朝方はエアコンが要らない!

朝5時ぐらいの時間帯だと、ここ南国🌴宮崎でもエアコンが要らないぐらい涼しい。2〜3時間ぐらいだが、窓からの風だけで作業ができるのは身体にも環境にもよいのではないだろうか。

朝コーヒーを飲まなくなった

朝5時に起きるといっても夜9時には寝ているので、たっぷり8時間睡眠を取っているのである。そのため、眠気覚ましのコーヒーが不要になった。調子が良いときにはランチ後も眠くならないほどである。

作業の質が良くなった気がする

これはちゃんと計測したわけではないが、体感として深夜に頭を使うより、朝方に頭を使ったほうが効率が良い気がしている。眠っている間に頭が良い感じにリセットされているのかもしれない。

***

メリットばかりを挙げてきたが、もちろんデメリットもある。

例えば、夜9時以降に開催されるTwitterスペースでのイベントをリアルタイムで聴きたい場合は、どうしても起きている必要がある。私が大好きなF1なんかは夜11時スタートのレースもよくあるので、毎日この生活リズムを送るのは難しいのが現実である。

とはいえ、メリットが多いのは事実なので、夜9時に寝られる日は積極的に寝ていきたいと思っている😪

TruffleでEtherScan上のスマートコントラクトをVerifyしてみる

※2022/8/8追記: xdai, sokol にも対応した truffle-source-verify というプラグインを見つけたので、必要であればそちらもおすすめです

Etherscanのサイトから手動でもVerifyできるが、非常に大変なのでコマンドラインからVerifyする方法をメモ。

truffle-plugin-verify というTruffleプラグインが便利。

github.com

インストール

  1. npm または yarn でインストール

    npm install -D truffle-plugin-verify
    yarn add -D truffle-plugin-verify
    
  2. truffle-config.jsプラグインを追加
   module.exports = {
     /* ... rest of truffle-config */

     plugins: ['truffle-plugin-verify']
   }
  1. Etherscan websiteにてEtherscanのAPI Key を作成

  2. 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 dry-run on Ethereum Main reports different gas cost (less) than actual deployment gas - Ethereum Stack Exchange

↓こちらの記事も参考になりました。

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の場合は下記サイトが利用できる。

成功すると、WalletにEtherが入金される。

他のテストネットについては、MetaMaskの「購入>テストフォーセット>Etherを取得」からもFaucetを探せるのでぜひ試してほしい。