『SolidityとEthereumによる実践スマートコントラクト開発』で詰んだところと解決法
OS: Window 10
エディタ: VSCode
参考①
note.com
参考②
zenn.dev
参考③
zenn.dev
Openzeppelinからimportする
4章, 6章での詰みポイント
6章P108 Ownable.solのインポート
書籍中の記述
npm install openzeppelin-solidity --save
これだとうまくいかない
下のノートに従う
note.com
まずアンインストールした
npm uninstall openzeppelin-solidity
npmを初期化
npm init
ノート通りに3.4.1をインストール
npm install openzeppelin-solidity@3.4.1
そしてFundraiser.solのimportの部分の記述を書き換え。
import "openzeppelin-solidity/contracts/access/Ownable.sol";;
またTruffle-config.jsを下のように書き換えてsolidityのバージョンを決定した
const path = require("path"); module.exports = { contracts_build_directory: path.join(__dirname, "client/src/contracts"), networks: { develop: { port: 8545 } }, compilers: { solc: { version: "0.6.0" } } };
これでtruffle testが通った.
P123 SafeMathをimport
SafeMathとOwnableのSolidityのバージョンが違うらしく, なぜか上手くいかなかったので,
書籍の記述
import "openzeppelin-solidity/contracts/utils/math/SafeMath.sol"
まずopenzeppelin-solidityをアンインストールした
npm uninstall openzeppelin-solidity
OpenZeppelinのページを見て、新しいバージョンをインストールをした
github.com
npm install @openzeppelin/contracts
node_modulesに@openzeppelin/contracts以下がインストールされた
OpenZeppelin 4.3.2ではOwnable.solは @openzeppelin/contracts/access/Ownable.sol に、SafeMath.solは @openzeppelin/contracts/utils/math/SafeMath.sol にある
そこでFundraiser.solでは以下のように書き換えてインポートした
pragma solidity >0.4.23 <0.9.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; ~~~
truffle-config.jsを下のように書き換え、solidityのバージョンを変えた
const path = require("path"); module.exports = { ~~~ compilers: { solc: { version: "^0.8.0" } } };
よく分からないエラーが発生
1. Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier:
2. Warning: Visibility for constructor is ignored. If you want the contract to be non-deployable, making it "abstract" is sufficient. ~~~
1. では何かライセンスが要求される
Fundraiser.solの1行目に以下の文を追加, OOOは好きな文字でOK
// SPDX-License-Identifier: ORE
2. ではconstructorの記法が変化しているという話
www.shibuya24.info
Fundraiser.solとMigration.solのconstructor文からpublicを消去
constructor(){}
とりまここまで