「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をインストールするため、以下のコマンドを叩く。
git clone https://github.com/truffle-box/react-box.git
( cd react-box; git reset --hard c33a70f57559c0040f7109f9db498a0f83187776 )
mkdir old-react-box && cd old-react-box
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”
]
に変更する。