yarn startで「Create React App requires a dependency」エラー

現象

yarn startすると以下のエラー。

$ yarn start
yarn run v1.22.10
warning ../package.json: "dependencies" has dependency "@project-serum/swap" with range "^0.1.0-alpha.34" that collides with a dependency in "devDependencies" of the same name with version "^0.1.0-alpha.32"
warning ../../../package.json: No license field
$ ../node_modules/.bin/react-app-rewired start

There might be a problem with the project dependency tree.
It is likely not a bug in Create React App, but something you need to fix locally.

The react-scripts package provided by Create React App requires a dependency:

  "webpack": "4.44.2"

Don't try to install it manually: your package manager does it automatically.
However, a different version of webpack was detected higher up in the tree:

  /Users/user/node_modules/webpack (version: 4.46.0)

Manually installing incompatible versions is known to cause hard-to-debug issues.

If you would prefer to ignore this check, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
That will permanently disable this message but you might encounter other issues.

To fix the dependency tree, try following the steps below in the exact order:

  1. Delete package-lock.json (not package.json!) and/or yarn.lock in your project folder.
  2. Delete node_modules in your project folder.
  3. Remove "webpack" from dependencies and/or devDependencies in the package.json file in your project folder.
  4. Run npm install or yarn, depending on the package manager you use.

In most cases, this should be enough to fix the problem.
If this has not helped, there are a few other things you can try:

  5. If you used npm, install yarn (http://yarnpkg.com/) and repeat the above steps with it instead.
     This may help because npm has known issues with package hoisting which may get resolved in future versions.

  6. Check if /Users/user/node_modules/webpack is outside your project directory.
     For example, you might have accidentally installed something in your home folder.

  7. Try running npm ls webpack in your project folder.
     This will tell you which other package (apart from the expected react-scripts) installed webpack.

If nothing else helps, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
That would permanently disable this preflight check in case you want to proceed anyway.

P.S. We know this message is long but please read the steps above :-) We hope you find them helpful!

error Command failed with exit code 1.

原因

今回のケースは、node_modulesがインストール済だっため、エラーが起きていた。

(案1)恒久対応

以下の対応を実施する。

  1. Delete package-lock.json (not package.json!) and/or yarn.lock in your project folder.
  2. Delete node_modules in your project folder.
  3. Remove "webpack" from dependencies and/or devDependencies in the package.json file in your project folder.
  4. Run npm install or yarn, depending on the package manager you use.

Webpackの削除は、対象パスが以下のように表示されるため、該当ディレクトリを削除する。

However, a different version of webpack was detected higher up in the tree:

  /Users/user/node_modules/webpack (version: 4.46.0)

よくあるハマりポイントは、 npm install / yarn install したディレクトリのnode_modulesを削除してしまい、解決されないこと。
削除しないといけないディレクトリは上記のパス(ターミナルで出力されたパス)になるため要注意。自分の場合は、ホームディレクトリにインストールしていたため、そこが引っかかってエラーになった。

(案2)暫定対応

恒久対応で解決しない場合は、以下ヒントの対応で暫定的に解決可能。

If you would prefer to ignore this check, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
That will permanently disable this message but you might encounter other issues. 

.envファイルを作成して「SKIP_PREFLIGHT_CHECK=true」を記述するだけ。

参考

「docker pull solanalabs/solana」すると「latest not found」

現象

SolanaのDockerイメージをpullすると以下のエラー。

$ docker pull solanalabs/solana
Using default tag: latest
Error response from daemon: manifest for solanalabs/solana:latest not found: manifest unknown: manifest unknown

原因

Docker HubのSolana公式で書かれている「$ docker pull solanalabs/solana」の方法だとうまくいかない。
docker pullは、tagを指定しないとlatestのtagを自動的に指定するようになっているが、Solana側でlatestというのtagを用意していないため、見つからないというエラーが表示される。

対応

Docker Hubで SoalanのTags をもとに最新バージョンのtagを指定する。
補足:右側に「docker pull solanalabs/solana:v1.8.2」のようにコマンドをコピペできるようになっているので、それを使うと便利

自分が見たときはv1.8.2が最新だったため、以下のように指定して実行。

$ docker pull solanalabs/solana:v1.8.2
v1.8.2: Pulling from solanalabs/solana
50e431f79093: Pull complete
833010d8bb1e: Pull complete
2b13a6389198: Pull complete
Digest: sha256:d11e0cae5baa19ecee1815cf49800f02354d382179b4214c8c3921d66ce10c4d
Status: Downloaded newer image for solanalabs/solana:v1.8.2
docker.io/solanalabs/solana:v1.8.2

備考

以下でもDocker実行可能。Dockerの容量を食うため、ディスク容量に要注意。

Solana SDK Docker Image - GitHub

Macのマウス速度変更(LogicoolアプリをやめてMac設定)

課題

Logicoolマウスを使っているので、Logicoolアプリを使って設定管理をしていたが、突然以下のメッセージが表示されて設定が有効にならなくなった。

LOGICOOL OPTIONS に対して入力監視許可が必要です

サポートページの macOS Big Sur、macOS Catalina、および macOS Mojave の Logicool Options 権限メッセージ をもとに設定をして再起動もしてみたが、やはり解決せず。

以前からLogicoolアプリが調子悪く(?)、ホイールが効かなくなる、通信が切れる、といった不具合があったため、Logicoolアプリをやめることにした。

対策

Macのマウスのデフォルト速度は、ターミナルで以下を実行すると変更できる。速度は以下の数字部分を変更する。

defaults write "Apple Global Domain" com.apple.mouse.scaling 11

注意点として、ターミナルで実行したあとは、Macの再起動またはユーザーログアウトをしないと設定が有効にならない。

いろいろな方が本件について、画像付きでわかりやすい解説をしているので、もっと詳しく知りたい場合は「Macマウス速度」で検索すると解説記事がHITする。

チュートリアル「Create an NFT and deploy to a public testnet, using Truffle」のエラー対応

NFT作成の下記チュートリアルを実行していったときに発生したエラーの対応メモ。

Create an NFT and deploy to a public testnet, using Truffle - Guides and Tutorials - OpenZeppelin Community

「nft.baseURI is not a function」エラー

truffle(develop)> await nft.baseURI()
Uncaught TypeError: nft.baseURI is not a function
    at evalmachine.<anonymous>:1:13

仕様が変わったらしくエラーになるが無視でよい。なお、代替コマンドを探したが発見できず。

「HDWalletProvider is not defined」エラー

$ npx truffle console --network rinkeby
ReferenceError: HDWalletProvider is not defined
・・・
Truffle v5.4.16 (core: 5.4.16)
Node v12.22.7

@truffle/hdwallet-provider をインストールする。

$ npm install @truffle/hdwallet-provider

truffle-cofig.jsの以下をコメントアウトしてアクティブにする。

// const HDWalletProvider = require('@truffle/hdwallet-provider');
// 
// const fs = require('fs');
// const mnemonic = fs.readFileSync(".secret").toString().trim();

「ReferenceError: mnemonic is not defined」エラー

$ npx truffle console --network rinkeby
ReferenceError: mnemonic is not defined
・・・
Truffle v5.4.16 (core: 5.4.16)
Node v12.22.7

.secretファイルをルートに作成して、rinkebyのtestnet用に作成したウォレット(MetaMask)のニーモニックを直書きする。

作成するのはsecrets.jsonではないため要注意。おそらく現在は仕様が変わった?

Truffle Suite GanacheのFilecoin対応アプリ

普通にDLするTruffle SuiteのGanacheだと、Filecoinが表示されない。
おそらく、GanacheのBeta版のみFilecoinに対応しているため、まだ公式リリース(一般配布)していないためと思われる。

やりたいこと

Truffle Suiteの以下チュートリアルで、Truffle Box FilecoinをGanache上で表示して、NFTをミントしたり、いろいろ検証してみたい。

filecoin Boxes Truffle Suite

Filecoin対応版Ganacheのインストール方法

以下のTruffle公式GitHubのリリース一覧から、「2.6.0-beta.3 - Filecoin-flavored Ganache - Filecoin Frosty 🍦」を見つける。

trufflesuite/ganache-ui

macの場合は、AssetsからdmgファイルをDLしてインストールする。これがFilecoin対応版になっている。

起動するとバージョンが新しくなり、Filecoinが選択できるようになる。

通貨もFILになる。

参考

Truffle Box Filecoinチュートリアルのハマりポイント

Truffleの以下チュートリアルでいろいろハマったため、その時のメモ。

Truffle Box Filecoin

1. Unknown environment: developmentエラー

エラー内容

$ truffle preserve --environment development ./assets/ --filecoin
Unknown environment: development. Check your truffle-config.js?
Truffle v5.4.15 (core: 5.4.15)
Node v12.22.7

対応

  • 「$ npm install -g truffle@preserves」を実行する
  • 実行ディレクトリが正しいか確認する(ルートディレクトリで実行する)
  • truffle-config.jsをいじってなければ間違っていない可能性が高いので、それまでの手順が正しいか確認する

2. not found in global or local node modulesエラー

エラー内容

$ truffle preserve --environment development ./assets/ --filecoin
Error:
Error: truffle-plugin-debugger listed as a plugin, but not found in global or local node modules!

対応

debuggerがインストールされていないため、「$ npm i truffle-plugin-debugger」でインストールする。
trufflesuite / truffle-plugin-debugger

3. Invalid StartDealParams.Wallet provided.エラー

エラー内容

見やすいように整形しているため、コマンドに利用はしないでください。

$ curl -X POST \
     -H 'Content-Type: application/json' \
     -d '{
    "jsonrpc": "2.0",
    "id": 0,
    "method": "Filecoin.ClientStartDeal",
    "params": [
        {
            "Data": {
                "TransferType": "graphsync",
                "Root": {
                    "/": "QmZTR5bcpQD7cFgTorqxZDYaew1Wqgfbd2ud9QqGPAkK2V"
                },
                "PieceCid": null,
                "PieceSize": 0
            },
            "Wallet": "t3s3la37547tijmoeiep7ktogws3tep2eqrralh7rhi2mpe46q574gceyy467356onblzvwf7ejlelo2rdsg4q",
            "Miner": "t01000",
            "EpochPrice": "2500",
            "MinBlocksDuration": 300
        }
    ]
}' \
     http://localhost:7777/rpc/v0

【以下が実行結果】

{
    "jsonrpc": "2.0",
    "error": {
        "message": "Invalid StartDealParams.Wallet provided. Ganache doesn't have the private key for account with address t3s3la37547tijmoeiep7ktogws3tep2eqrralh7rhi2mpe46q574gceyy467356onblzvwf7ejlelo2rdsg4q",
        "stack": "Error: Invalid StartDealParams.Wallet provided. Ganache doesn't have the private key for account with address t3s3la37547tijmoeiep7ktogws3tep2eqrralh7rhi2mpe46q574gceyy467356onblzvwf7ejlelo2rdsg4q\n    at Blockchain.startDeal (/Users/xxx/Desktop/blockchain/filecoinDemo/node_modules/@ganache/filecoin/dist/node/ganache-filecoin.min.js:2:783097)\n    at async FilecoinApi.Filecoin.ClientStartDeal (/Users/xxx/Desktop/blockchain/filecoinDemo/node_modules/@ganache/filecoin/dist/node/ganache-filecoin.min.js:2:769545)",
        "code": -32700
    }
}

対応

ウォレットアドレスが誤っているため、「$ npx ganache filecoin」を打ったときに出力される、tから始まるウォレットアドレスを利用する。

ウォレットアドレスの変更部分は以下。
「"Wallet":"t3s3la37547tijmoeiep7ktogws3tep2eqrralh7rhi2mpe46q574gceyy467356onblzvwf7ejlelo2rdsg4q"」

4. Invalid JSON RPC response: 404 Not Foundエラー

エラー内容

$ truffle console
> Something went wrong while attempting to connect to the network. Check your network configuration.
Invalid JSON RPC response: "404 Not Found"
Truffle v5.2.7-preserves.5 (core: 5.2.7-preserves.5)
Node v12.22.7

対応

「$ truffle develop」コマンドを打つ。

「$ truffle console --network development」も試したが、うまくいかず上記コマンドのみ通った。

5. 最終的にどのようなコマンドが起動状態になるのか

NFTミントなどのトランザクション時

  • ルートディレクトリ:$ truffle develop (Filecoinブロックチェーンサーバー用。処理が終わったら閉じてもOK)
  • ルートディレクトリ:$ npm run start (NFTのミント用。同上)

NFT表示時

  • uiディレクトリ:$ npm run start (フロントエンド用)

この状態で http://localhost:3000/ にアクセスすると、以下が表示される。
フロントエンド側では画像をただ表示しているだけのため、ブロックチェーンサーバーの起動は必要ない。

truffle unboxしたあとにtruffle consoleでwrong networkエラー

現象

truffle unbox reactしたあとに、truffle consoleすると以下のエラーが出る。

$ truffle console
> Something went wrong while attempting to connect to the network at http://127.0.0.1:7545. Check your network configuration.

Could not connect to your Ethereum client with the following parameters:
    - host       > 127.0.0.1
    - port       > 7545
    - network_id > 5777
Please check that your Ethereum client:
    - is running
    - is accepting RPC connections (i.e., "--rpc" or "--http" option is used in geth)
    - is accessible over the network
    - is properly configured in your Truffle configuration file (truffle-config.js)

Truffle v5.4.15 (core: 5.4.15)
Node v12.22.7

原因

今回のケースは truffle console のデフォルトのネットワーク名(development)とtruffle-config.jsで設定した名前(develop)がミスマッチしていた。

truffle consoleを実行すると、truffle-config.jsで設定されているネットワーク名の「development」がデフォルト実行されるようになっている。
しかし、truffle unbox reqactしたときのtruffle-config.jsのネットワーク名は「develop」になっているため、truffle consoleを実行しても、「ネットワークに接続できない」というエラーが表示されてしまう。

「$ truffle unbox react」後のtruffle-config.js

const path = require("path");

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // to customize your Truffle configuration!
  contracts_build_directory: path.join(__dirname, "client/src/contracts"),
  networks: {
    develop: {
      port: 8545
    }
  }
};

おそらく、Truffle Box Reactが積極的にメンテされていないようなので、古い状態のままになっているのが原因と思われる。

GitHub truffle-box/react-box/truffle-config.js

なお、 $ truffle init で初期生成した場合は、ネットワーク名がデフォルトで「development」になっているため、そのまま $ truffle console できる。

「$ truffle init」後のtruffle-config.js

module.exports = {
  /**
   * Networks define how you connect to your ethereum client and let you set the
   * defaults web3 uses to send transactions. If you don't specify one truffle
   * will spin up a development blockchain for you on port 9545 when you
   * run `develop` or `test`. You can ask a truffle command to use a specific
   * network from the command line, e.g
   *
   * $ truffle test --network <network-name>
   */

  networks: {
    // Useful for testing. The `development` name is special - truffle uses it by default
    // if it's defined here and no other network is specified at the command line.
    // You should run a client (like ganache-cli, geth or parity) in a separate terminal
    // tab if you use this network and you must also set the `host`, `port` and `network_id`
    // options below to some value.
    //
    // development: {
    //  host: "127.0.0.1",     // Localhost (default: none)
    //  port: 8545,            // Standard Ethereum port (default: none)
    //  network_id: "*",       // Any network (default: none)
    // },

対応

案1(truffle consoleでネットワーク名を指定)

以下のようにネットワーク名が指定できる。

$ truffle console --network ネットワーク名

そこで、truffle-config.jsで設定したネットワーク名を指定する。初期状態であれば以下のような指定になる。

$ truffle console --network develop
truffle(develop)>
(To exit, press ^C again or ^D or type .exit)

案2(truffle-config.jsのネットワーク名を修正)

以下のように「develop」を「development」に修正する。

const path = require("path");

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // to customize your Truffle configuration!
  contracts_build_directory: path.join(__dirname, "client/src/contracts"),
  networks: {
    development: {
      port: 8545
    }
  }
};

truffle consoleすると以下のように「truffle(development)」と表示される。

$ truffle console
truffle(development)>
(To exit, press ^C again or ^D or type .exit)

truffle unboxしたあとにyarn run startするとnot foundエラー

現象

2018年頃のTruffleチュートリアル記事(たとえばTruffle Boxを利用したTruffle + React + Ganache構築記事など)のとおりに進めると、以下のエラーが出る。

$ yarn run start
yarn run v1.22.10
warning package.json: No license field
error Command "start" not found.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

原因

おそらく、2021年現在と2018年頃で仕様が変わったらしく(?)、yarn run startするディレクトリ場所が違う。yarn run startはpackage.jsonが存在するディレクトリで実行する必要がある。
2018年頃は、ルートディレクトにpackage.jsonが生成された(?)が、2021年現在はclientディレクトリ配下に生成されるようになった。

[2018年頃]
root
 ┣ package.json
 ┣ truffle-config.js
 ┣ truffle.js
 ┣ contracts
 ┣ migrations
 ・・・

[2021年現在]
root
 ┣ client
  ┣ package.json
 ┣ contracts
 ┣ migrations
 ┣ truffle.js
 ・・・

対応

clientディレクトリに移動してから、yarn run startを実行する。

DrizzleでCould not connectエラー

以下サイトを試していたときに発生したエラー。

Microsoft Ignite ブロックチェーン開発の概要 演習 - Drizzle を使ってみる

環境

  • macOS Big Sur 11.6
  • Truffle v5.4.15 (core: 5.4.15)
  • Solidity v0.5.16 (solc-js)
  • Node v12.22.7
  • Web3.js v1.5.3
  • テキストエディターATOM

今回はVisual Studio Codeは利用せずにATOMを利用。

現象

記事内では以下のように、Visual Studio Codeを使ったビルドやデプロイが説明されていたが、すべてターミナルで実行した。

[記事の説明]

1. Visual Studio Code 内から、[ターミナル] > [新しいターミナル] に移動してターミナルを開きます。
2. 次に、「ganache-cli」と入力して、Ganache CLI を起動します。
いずれかのコントラクトを右クリックし、[Build Contracts](コントラクトをビルドする) を選択します。 ビルドとコンパイルが正常に完了するまで待ちます。
3. もう一度コントラクトのいずれかを右クリックし、[Deploy Contracts](コントラクトをデプロイする) を選択します。 デプロイ先のウィンドウが表示されたら、develop ネットワークを選択します。 移行が正常に完了するまで少し待ちます。

上記のかわりに以下を実行。

$ truffle compile
〜省略(これは成功する)〜

$ truffle migrate

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.

> Something went wrong while attempting to connect to the network at http://127.0.0.1:7545. Check your network configuration.

Could not connect to your Ethereum client with the following parameters:
    - host       > 127.0.0.1
    - port       > 7545
    - network_id > 5777
Please check that your Ethereum client:

そうするとネットワークに接続できない旨のエラーが発生。

原因

Ethereumブロックチェーン(ノードサーバー)に接続ができていない。つまり、サーバーが動いていない or ネットワーク設定が誤り。
今回のケースはブロックチェーンを動かしていなかった。

なお、ネットワーク設定の誤りでよくあるのは、truffle_config.jsの「network_id: "*"」を「network_id: "5777"」と記載しているケース。これだと文字列になってしまうため、「network_id: 5777」と記載する必要あり。

対応

案1(truffle develop)

ブロックチェーン起動からmigrateまで1セットで実行できる truffle develop を利用して、コンパイルとマイグレーションを実行する。
(前提)ganache-cliは停止していること

$ truffle develop
truffle(develop)> compile
truffle(develop)> migrate

そのあとに記事の以下内容を実行すると画面表示までできる。

[記事の内容]

- cd app: app/ フォルダーに移動します。
- npm rebuild: app/ フォルダーでビルドを実行し、変更を再コンパイルします。
- npm run start: React の Web パック開発サーバーを起動します。 これにより、React プロジェクトの新しいブラウザー ウィンドウが開きます。

案2(Ganache起動)

デスクトップアプリのGanacheでブロックチェーンを動かしてからmigrateする。

  1. 以下をDLして起動(SERVERのPORT NUMBERは「7545」にする)
    Ganache ONE CLICK BLOCKCHAIN - Truffle Suite

  2. 以下をターミナルで実行

$ truffle compile
$ truffle migrate

(試してはいないが)Ganacheに接続して画面確認する場合は、GanacheでWORKSPACEを立ち上げたあとに、設定で以下のように「ADD PROJECT」ボタンでtruffle-config.jsを読み込ませて、リンクさせる必要あり。

MetaMaskの接続先アカウントが変更できない

Truffle Suiteのチュートリアルをやっていたときに、MetaMaskで接続したいアカウントに変更できなかったときの対応メモ。
以下のようなポップアップ表示されてウォレットを選択するやつです。

現象

Truffle Suiteで構築したブロックチェーン(Pet Shopサイト)で犬を選択するときに、決済したいウォレットアドレスが選択できない。表示された画面上からも、「ウォレットの変更」のような選択方法もない。

上記例の「Test1ウォレット」には、ETHを入れていないため決済できない。

原因

選択したいウォレットのトリガーポイント(ウォレットが表示されるタイミング)が決まっているため、それにあわせる必要がある。

対応

アドオンのMetaMaskで決済したいウォレットを選択したあとに、サイト上の決済ボタンを押す。

ただし、これでもうまくいかない切り替わらないケースがあった。

その場合は、一度異なるウォレットを選択してから、再度決済したいウォレットを選択する。
以下の例だと、「Ganacheウォレット」を選択したい場合、「Test1ウォレット」を選択したあとに、再度「Ganacheウォレット」を選択する。

これで無事に決済できた。