落ちこぼれ修士(卒)のこぼれ話

マンガ・アニメ・ゲームから科学的なことまで、国立大学の理学修士卒の落ちこぼれ修士の雑記用ブログ

『SolidityとEthereumによる実践スマートコントラクト開発』で詰んだところと解決法

OS: Window 10

エディタ: VSCode

参考①
note.com

参考②
zenn.dev

参考③
zenn.dev

VSCodeのターミナルをUbuntuにする

qiita.com

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: " to each source file. ~~~
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(){}

とりまここまで