koogawa blog

iOS、Android、foursquareに関する話題

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を探せるのでぜひ試してほしい。

メインチェーンとサイドチェーン、そしてレイヤー1およびレイヤー2について理解したことをまとめてみる

間違っていたら教えて下さい。むしろ、ツッコミを期待しています。

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を作るのに便利なボイラープレートがたくさん用意されている。

Truffle Boxes - Truffle Suite

今回はその中の「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() を実行するたびにデータを格納するトランザクションが発生し、同時にガス代も発生する。変数を書き換えるためにお金を払う必要があるというブロックチェーンの仕組みは最初驚くことであろう。

publicview 等のワードも重要な意味を持つので、ぜひ調べてみて欲しい。

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が起動する。

ガス代を確認し「確認」をクリックするとトランザクションが開始し、しばらくするとトランザクションが完了した通知が送られてくる。

これで SimpleStoragevalue 、すなわちブロックチェーンにデータを書き込むことができたわけである🎉 「read()」をクリックすると、value が書き換わっていることが確認できるはずだ。

フロントエンドからどのようにスマートコントラクトを実行したのか、については client/src 以下をじっくり読んで、ところどころ書き換えてみると理解が深まると思う。

ガス代

今回はテストネットを利用したのでガス代を気にする必要はなかった。しかし、メインネットにコントラクトをdeployする場合はそれなりのEtherが必要になるの。じっくり開発環境でテストを実施してからdeployすることをおすすめする。