夜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プラグインが便利。
インストール
npm または yarn でインストール
npm install -D truffle-plugin-verify yarn add -D truffle-plugin-verifytruffle-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に接続できるようになる。