「実践 スマート コントラクト開発」のフォロー

「SolidityとEthereumによる実践スマートコントラクト開発」(オライリー・ジャパーン)をやっている。初版発行から日にちが経ったこともあり、自分で「改訂」しながらチュートリアルしている。

3.1.1「Parityのインストール」(p34)

イーサリアムのクライアントを構築にはParityが使われている。
しかし開発者であるParity Technologiesは現在イーサリアムクライアントから離れ、
イーサリアムクライアントはOpenEthereumに引き継がれている。
https://www.neweconomy.jp/posts/37460

//Parityのインストールができなかった
//次にOpenEthereumをGitHubよりダウンロードしたが、ビルドがうまく行かなかった。
//結局、Gethをイーサリアムクライアントとする。

参照:Parity Technologies主宰(イーサリアムの共同設立者)であるケビン・ウッドのRedはこちら。

4-5 GreeterをOwneableにする(p64)

プライバシーを守るライブラリとしてopenzeppelinが使用されている。
しかし本書で扱われているopenzeppelin-solidityは現在推奨されていない。
https://www.npmjs.com/package/openzeppelin-solidity

なので本書にあるnpm install openzeppelin-solidityではなく、
npm install@openzeppelin/contructsの方をインストールする。

一方、contracts/Greeter.solの記述も、
import “openzeppelin-solidity/contracts/access/Ownable.sol”;でなく、
import “@openzeppelin/contracts/access/Ownable.sol”;とする。

現状のopenzeppelinを採用したことで、ほかを変えることが余儀なくされる。

本書ではTruffleは
npm install -g truffle@5.1.31としている。

これを
npm install truffleとする。

ちなみにtruffle versionにて確認すると、

前者は、
Truffle v5.1.31
Solidity v0.5.16

後者は(2022.09/20段階で)
Truffle v5.5.30
Solidity v0.8.17
となっている。

openzeppelelinの現況に合わせ、後者とする。

ここで注意が必要。(たぶん)SolidityのバージョンはSolcのバージョンでもある。

なので、スマートコントラクトのコンパイルのバージョンの記述を
本書のpragma solidity >= 0.4.0 < 0.7.0;から
pragma solidity >= 0.4.0 < 0.9.0;とする(solidity v0.8.17 / solc v0.8.17に合わせた)

またtruffle-configのcompilerのコメントアウトを外し、以下のようにする。

compilers: {
solc: {
version: “0.8.17”
}
}

5.3 Ganacheへのデプロイ(p77)

MetaMaskは秘密鍵の保持のほか、(たぶん)プロバイダー的な役割も担っている。

イーサリアムネットワークへの接続だけでなく(ローカルに準備された)Gnacheにも仲介する。

本書では、その方法が省かれている(その他にも、省略されている箇所が多数ある)

このようにやる。



6.3 資金調達の初期化

6章からtruffle inbox reactを使用する。

ただし、このコマンドを叩きダウンロードされるtruffle inbox reactと、本書のtruffle inbox reactではファイルの構成が異なる。

本書の日本語版の販売が2021年1月15日。翻訳される前の原書の発売が仮に1年、執筆も勘案すると3年前以上前のバージョンと思われる。

なので、あえて、本書のバージョンと同様のtruffle inbox reactをダウンロードする必要がある。

mkdir fundraiser(作業ディレクトリを作成)
cd fundraiser

ここに本書にはない特別なコマンドを叩くのだが、その前に、数年前のtruffle inbox reactに合わせ、nodeのバージョンもダウングレードする必要が出てくる。

具体的には、node@10 をNode.jsの他のインスタンス前に追加する必要がある。後ほど必要になるReact truffle BoxにNode12と互換性のない依存関係がいくつか存在する。このため本書ではLTS(Long Time Support)バージョンを使うことにする。

(本書p44)

本書ではnodebrewを利用しいるが、(個人的な環境では)nodebrewでは上手く行かなかったので、nvmを利用した。

nvm install v10.0.0
nvm ls(ダウンロードした幾つかの既存のバージョンを確認)
nvm use 10.0.0(バージョンを選定)

その上で、古いバージョンのReact Truffle Boxをインストールするため、以下のコマンドを叩く。

  1. git clone https://github.com/truffle-box/react-box.git
  2. ( cd react-box; git reset --hard c33a70f57559c0040f7109f9db498a0f83187776 )
  3. mkdir old-react-box && cd old-react-box
  4. truffle unbox ../react-box

参照:
https://github.com/orgs/trufflesuite/discussions/5552
//truffleは最新バージョン(Truffle v5.5.32)を使用

6.4 受取人の編集

「4-5 GreeterをOwnerable」と同様、
npm install @openzeppelin/contracts
をインストールし、
“import “@openzeppelin/contracts/access/Ownable.sol”;とする。

上記は、solc 0.8、solidity 0.8以上が推奨されているので、truffle-config.js、contractsのバージョンを0.8に書き変える。

//OpenZeppelelinのフォーラムに質問
https://forum.openzeppelin.com/t/compileerror-openzeppelin-contracts-access-ownable-sol/32262

6.4 受取人の編集

setBeneficiaryのテスト(リスト6-12)は本書どおり通らない。try catch文は以下のように書き換える。

npm install truffle-assertions

const truffleAssert = require(‘truffle-assertions’);

it(“throws and error when called from a non-owner account”, async () => {
await truffleAssert.fails(
fundraiser.setBeneficiary(newBeneficiary, { from: accounts[3]}),
truffleAssert.ErrorType.REVERT,
“Ownable: caller is not the owner”
);

//solidity forumに質問
https://ethereum.stackexchange.com/questions/137326/about-try-catch-errortruffle-test

6.6 資金の引き出し

testのtry catch うまくいかず。以下に書き換える必要あり。

describe(“withdrawing funds”,()=>{
it(“throw an error when called from non-owner account”, async()=>{
await truffleAssert.fails(
fundraiser.withdraw({from:accounts[3]}),
truffleAssert.ErrorType.REVERT,
“Ownable: caller is not the owner”
);
});

6.7 フォールバック関数

fanction () external payableを
fallback () external payableに変更する。

9.2 Truffle

本書に合わせて古いバージョンのunbox reactを利用する。
古いバージョンのインストール方法は、上記「6.7の資金調達の初期化」参照




9.2.1 React Truffle Boxのセットアップ

他と同様、手順の説明がかなり省かれている。
Metamaskにログインすることからスタート。

9.2.1 react Truffle Boxのセットアップ

npm run startは、truffle develop、compile、migrateの後、行なう。
それでもエラーになるので、package.jsonの

“development”: [
“last 1 chrome version”,
“last 1 firefox version”,
“last 1 safari version”
]

“development”: [
“>0.2%”,
“not dead”,
“not op_mini all”
]
に変更する。


気づいたことを、お気軽に。
公開まで、やや時間がかかりまーす!