Solidity環境の準備で手こずっている話
どうも、ぺろりんです。
前回のつづきとして、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」3章に入ってスマートコントラクトの開発環境として「Solidity」という言語の環境を整えようとしているんですが、案の定(笑)なかなか上手くいかず詰まりました。
さしあたっての妥協案として「Browser-Solidityをオンラインで使う」という方法が一応は上手くいきそうになってきたので、またすぐ詰まりそうだという不安は置いておいて、環境としてはしばらくこの方向で進んで行きたいかと思います。
ダメそうだったらまた考えますw
というわけで今回は、まずどんな感じで詰まっていたかという話と、「Browser-Solidityをオンラインで使う」やり方をここにまとめておきます。
Solidityの使い方に関しては、たぶんよくご存知の方からするとそれじゃダメだろってとこがあるのではと思っているので、そういう感想の方はぜひともメールフォームからご連絡いただけると非常に助かります。。
上手くいかないところ
理解が浅すぎてだいぶ色々問題が起こっていますw
棚卸ししてみるとだいたいこんな感じです。
コンパイルできない話
まず初めにやったのが、前回まで使っていたVM(仮想マシン)の環境で、いつもの教科書通りにSolidityのコンパイラをインストールしました。
で、本にある「Gethにsolcのパスをセット」するところまでは上手くいきました。
しかし、この次のコンパイルするところが上手くいかない。。
メモり損ねて記憶があいまいですが、たしか参考に挙げたリンク先にある以下のエラーが出てた気がします。
教科書の注意書きで、Gethのバージョンが1.6以降はコンパイルが上手くいかないと書いているのですが、この本ではGethをインストールするときにv1.5.5にバージョンを切り替えていて、この通りにやっているのでコンパイルも上手くいくかと思っていたのですが、ちょっとよくわからない。
これだと上手くいきそうにないのと、教科書の先を見るとBrowser-Solidityを使っていたので、Browser-Solidityが出てくるあたりまでスキップしてこの環境を整えることにしました。
(参考)
・go-ethereum(geth)でSolidityのコンパイルが出来ない場合(Qiita)
Browser-Solidityをローカルで上手く使えない話
さて、ここでも教科書べったりでやってみたのですが、まずはVM環境ではなく、VM Playerを載せているWindows 10でBrowser-Solidityをインストールしてみました。
が、「Environment」で「Web3 Provider」を選ぶところで無事死亡w


理解が浅いまま進んでいるのが原因ですが、「Web3 Provider Endpoint」がよくわからん。
どのIPアドレスを設定すべきかよくわからず、とりあえずlocalhostにしてみるも上手くいかず。

このあと「172.0.0.1」を試してみるも、やっぱりダメ。
参考に挙げたリンク先に「go-ethereum/gethがOS上にインストール済みであることを前提にしています。」と書いてあるのを見かけて、gethをインストールしたVM Player上のLinux(Ubuntu)ではなく、その外の(gethをインストールしていない)Windows 10でやっていたので「デスヨネー」となりました。
というわけで、VM Player上のLinux(Ubuntu)で再度同じことをやってみることにしました。
(参考)
・Etherum Browser-Solidityを利用したコントラクト開発・デプロイ・実行(Qiita)
VMを作り直したらgethをビルドできない話
VM Player上のLinux(Ubuntu)でやろうとしたら、Browser-Solidityをデフォルトで入っているFirefoxで開くと固まる……w
Firefoxだと重いのかなーと、Chromeを入れて試してみることに。
すると、Chromeさんがインストールできない!
色々試した結果、最新バージョン(今回はv18.04で、以前のは過去記事を見るとv16.04)のUbuntuで仮想マシンを作り直してみたら、Chromeのインストールはできました。
ついでに言うとVM Ware Toolsも上手く入らない……(こっちはVM Playerのバージョンの問題……?)
仮想マシンを作り直してしまったので再度Geth環境を整えて、その上でBrowser-Solidityをインストールする必要があります。
なのでGethをまたインストールしました。
ところが!今度は「make geth」でビルドできないw
(VM Ware Toolsが上手くいってないせいでゲストOSとの間でコピペができないっぽいため画像で)

Go言語のバージョンが低いと怒られている感じがするんですが、実際バージョン確認するとこんな感じ。

これだけ見ると1.10みたいにも見えるんですが、「.」の後ろは「じゅう」ではなくて「いちぜろ」なのかな……?
というわけでGo言語のバージョンを変えたいんですが、この辺の扱いが不慣れすぎてまったく上手くできず(;´Д`)
これは参考リンクあたりを見ながら上手くいかないかなぁ。
ひとまず、仕方ないので代替案として、オンライン上でBrowser-Solidityを動かしてみることにしました。
(参考)
・PINE64(Ethereumのマイニング、geth導入成功)(ねこめも)
Browser-Solidityをオンラインで使う
これはようやく上手くいきました(少なくとも、目的のコードが動いた)。
そんなわけで、途中のトラブルシューティングをはさみつつ、上手くいったところまでの手順を書いておきます。
まず、Browser-Solidity (Remix) のページに行きます。

とりあえずデフォルトで入っているballot.solはいらないのでファイル名横の「×」ボタンで消して、「+」ボタンからSample.solという名前のファイルを作ってみます。



ためしに教科書に載っていたテストコードを入れてコンパイルしてみます。

このままコンパイルすると、警告が4つ出てきます。

内容としては次の2種類です。
警告は出ていてもデプロイはできるようですが、気持ち悪いので対応したいところ。
調べてみると、「Warning: No visibility specified.」の方はどうも「visibility」という設定がないと警告が出るようです。(エラー内容そのままですが)
よくわからないままですが、調べた先の情報を参考に「visibility」として「public」(入れる位置は画像の位置が正しそう)というのを入れて再度コンパイル。
3つあった「Warning: No visibility specified.」という警告は消えましたが、残り1つが消えない。。

内容的に、「Warning: No visibility specified.」が消えたら消えるのかと思ったのですが。
これもよくわからないのでいったん放置。
「Run」タブの「Environment」で「JavaScript VM」を選びます。
これを選ぶことで、オンライン上で仮想環境を作ってデプロイできるようです。

「Deploy」を押してみます。

この状態でデプロイ成功みたいです。

下のプロンプトを見てみると(エディタ部分との境目くらいに広げるための矢印が出てくる)、contractAddress とかが割り当てられていることがわかります。(左の三角を押すと詳細が見られます)



文字入力部分に「"Hello, World!"」(「"」は必須のようです)を入れて「setGreeting」を押すと、プロンプトのところがさらに進みます。


「greeting」と「say」も押してやると、プロンプトにもこいつらに関する処理結果が返されて、「greeting」と「say」のところにも「Hello, World!」が出てきます。


ここまでで、場当たり的(というか力ずく?)にではありますが、一応は教科書にあるコードをBrowser-Solidity上で動かせました。
(参考)
・手軽に“Solidity”言語でスマートコントラクト開発、開発環境「Remix」ってどう使う?(@IT)
・Ethereum のスマートコントラクト実行環境を整える(Qiita)
・【堅牢なスマートコントラクト開発のためのブロックチェーン】エラー改善メモ”No visibility specified. Defaulting to “public”.”(ICG -I can't graduate-)
・Remixとbrowser-solidityの使い方(たったひとりのIT事業部。)
まとめ
紆余曲折のすえ、さしあたりローカルのオフライン環境でSolidityを使うことはあきらめ、オンライン上でBrowser-Solidityを使って勉強を続けることにしました。
オンライン上でVM環境を動かすには、Browser-Solidityの「Run」タブにある「Environment」で「JavaScript VM」を選べばいけそうです。
この環境でできそうなところを、前回のつづきとして、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」に沿ってすすんでみたいと思います。
またすぐ詰まりそうな気がしますが……w
Solidityの公式ドキュメントも読みつつちゃんとできるといいな。。
次回は「既存コントラクトへのアクセス」をBrowser-Solidity(Remix)からやってみます。
前回のつづきとして、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」3章に入ってスマートコントラクトの開発環境として「Solidity」という言語の環境を整えようとしているんですが、案の定(笑)なかなか上手くいかず詰まりました。
さしあたっての妥協案として「Browser-Solidityをオンラインで使う」という方法が一応は上手くいきそうになってきたので、またすぐ詰まりそうだという不安は置いておいて、環境としてはしばらくこの方向で進んで行きたいかと思います。
ダメそうだったらまた考えますw
というわけで今回は、まずどんな感じで詰まっていたかという話と、「Browser-Solidityをオンラインで使う」やり方をここにまとめておきます。
Solidityの使い方に関しては、たぶんよくご存知の方からするとそれじゃダメだろってとこがあるのではと思っているので、そういう感想の方はぜひともメールフォームからご連絡いただけると非常に助かります。。
上手くいかないところ
理解が浅すぎてだいぶ色々問題が起こっていますw
棚卸ししてみるとだいたいこんな感じです。
コンパイルできない話
まず初めにやったのが、前回まで使っていたVM(仮想マシン)の環境で、いつもの教科書通りにSolidityのコンパイラをインストールしました。
で、本にある「Gethにsolcのパスをセット」するところまでは上手くいきました。
しかし、この次のコンパイルするところが上手くいかない。。
> sourceCompiled = eth.compile.solidity(source)
メモり損ねて記憶があいまいですが、たしか参考に挙げたリンク先にある以下のエラーが出てた気がします。
Error: The method eth_getCompilers does not exist/is not available
at web3.js:3104:20
at web3.js:6191:15
at web3.js:5004:36
at:1:1
教科書の注意書きで、Gethのバージョンが1.6以降はコンパイルが上手くいかないと書いているのですが、この本ではGethをインストールするときにv1.5.5にバージョンを切り替えていて、この通りにやっているのでコンパイルも上手くいくかと思っていたのですが、ちょっとよくわからない。
これだと上手くいきそうにないのと、教科書の先を見るとBrowser-Solidityを使っていたので、Browser-Solidityが出てくるあたりまでスキップしてこの環境を整えることにしました。
(参考)
・go-ethereum(geth)でSolidityのコンパイルが出来ない場合(Qiita)
Browser-Solidityをローカルで上手く使えない話
さて、ここでも教科書べったりでやってみたのですが、まずはVM環境ではなく、VM Playerを載せているWindows 10でBrowser-Solidityをインストールしてみました。
が、「Environment」で「Web3 Provider」を選ぶところで無事死亡w


理解が浅いまま進んでいるのが原因ですが、「Web3 Provider Endpoint」がよくわからん。
どのIPアドレスを設定すべきかよくわからず、とりあえずlocalhostにしてみるも上手くいかず。

このあと「172.0.0.1」を試してみるも、やっぱりダメ。
参考に挙げたリンク先に「go-ethereum/gethがOS上にインストール済みであることを前提にしています。」と書いてあるのを見かけて、gethをインストールしたVM Player上のLinux(Ubuntu)ではなく、その外の(gethをインストールしていない)Windows 10でやっていたので「デスヨネー」となりました。
というわけで、VM Player上のLinux(Ubuntu)で再度同じことをやってみることにしました。
(参考)
・Etherum Browser-Solidityを利用したコントラクト開発・デプロイ・実行(Qiita)
VMを作り直したらgethをビルドできない話
VM Player上のLinux(Ubuntu)でやろうとしたら、Browser-Solidityをデフォルトで入っているFirefoxで開くと固まる……w
Firefoxだと重いのかなーと、Chromeを入れて試してみることに。
すると、Chromeさんがインストールできない!
色々試した結果、最新バージョン(今回はv18.04で、以前のは過去記事を見るとv16.04)のUbuntuで仮想マシンを作り直してみたら、Chromeのインストールはできました。
ついでに言うとVM Ware Toolsも上手く入らない……(こっちはVM Playerのバージョンの問題……?)
仮想マシンを作り直してしまったので再度Geth環境を整えて、その上でBrowser-Solidityをインストールする必要があります。
なのでGethをまたインストールしました。
ところが!今度は「make geth」でビルドできないw
(VM Ware Toolsが上手くいってないせいでゲストOSとの間でコピペができないっぽいため画像で)

Go言語のバージョンが低いと怒られている感じがするんですが、実際バージョン確認するとこんな感じ。

これだけ見ると1.10みたいにも見えるんですが、「.」の後ろは「じゅう」ではなくて「いちぜろ」なのかな……?
というわけでGo言語のバージョンを変えたいんですが、この辺の扱いが不慣れすぎてまったく上手くできず(;´Д`)
これは参考リンクあたりを見ながら上手くいかないかなぁ。
ひとまず、仕方ないので代替案として、オンライン上でBrowser-Solidityを動かしてみることにしました。
(参考)
・PINE64(Ethereumのマイニング、geth導入成功)(ねこめも)
Browser-Solidityをオンラインで使う
これはようやく上手くいきました(少なくとも、目的のコードが動いた)。
そんなわけで、途中のトラブルシューティングをはさみつつ、上手くいったところまでの手順を書いておきます。
まず、Browser-Solidity (Remix) のページに行きます。

とりあえずデフォルトで入っているballot.solはいらないのでファイル名横の「×」ボタンで消して、「+」ボタンからSample.solという名前のファイルを作ってみます。



ためしに教科書に載っていたテストコードを入れてコンパイルしてみます。

このままコンパイルすると、警告が4つ出てきます。

内容としては次の2種類です。
Static Analysis raised 3 warning(s) that requires your attention.
browser/Sample.sol:<何行目か>:<何文字目か>: Warning: No visibility specified. Defaulting to "public".
function <関数名>(<引数>){
^
Spanning multiple lines.
警告は出ていてもデプロイはできるようですが、気持ち悪いので対応したいところ。
調べてみると、「Warning: No visibility specified.」の方はどうも「visibility」という設定がないと警告が出るようです。(エラー内容そのままですが)
よくわからないままですが、調べた先の情報を参考に「visibility」として「public」(入れる位置は画像の位置が正しそう)というのを入れて再度コンパイル。
3つあった「Warning: No visibility specified.」という警告は消えましたが、残り1つが消えない。。

内容的に、「Warning: No visibility specified.」が消えたら消えるのかと思ったのですが。
これもよくわからないのでいったん放置。
「Run」タブの「Environment」で「JavaScript VM」を選びます。
これを選ぶことで、オンライン上で仮想環境を作ってデプロイできるようです。

「Deploy」を押してみます。

この状態でデプロイ成功みたいです。

下のプロンプトを見てみると(エディタ部分との境目くらいに広げるための矢印が出てくる)、contractAddress とかが割り当てられていることがわかります。(左の三角を押すと詳細が見られます)



文字入力部分に「"Hello, World!"」(「"」は必須のようです)を入れて「setGreeting」を押すと、プロンプトのところがさらに進みます。


「greeting」と「say」も押してやると、プロンプトにもこいつらに関する処理結果が返されて、「greeting」と「say」のところにも「Hello, World!」が出てきます。


ここまでで、場当たり的(というか力ずく?)にではありますが、一応は教科書にあるコードをBrowser-Solidity上で動かせました。
(参考)
・手軽に“Solidity”言語でスマートコントラクト開発、開発環境「Remix」ってどう使う?(@IT)
・Ethereum のスマートコントラクト実行環境を整える(Qiita)
・【堅牢なスマートコントラクト開発のためのブロックチェーン】エラー改善メモ”No visibility specified. Defaulting to “public”.”(ICG -I can't graduate-)
・Remixとbrowser-solidityの使い方(たったひとりのIT事業部。)
まとめ
紆余曲折のすえ、さしあたりローカルのオフライン環境でSolidityを使うことはあきらめ、オンライン上でBrowser-Solidityを使って勉強を続けることにしました。
オンライン上でVM環境を動かすには、Browser-Solidityの「Run」タブにある「Environment」で「JavaScript VM」を選べばいけそうです。
この環境でできそうなところを、前回のつづきとして、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」に沿ってすすんでみたいと思います。
またすぐ詰まりそうな気がしますが……w
Solidityの公式ドキュメントも読みつつちゃんとできるといいな。。
次回は「既存コントラクトへのアクセス」をBrowser-Solidity(Remix)からやってみます。