Browser-Solidity(Remi)で既存コントラクトにアクセスしてみる
どうも、ぺろりんです。
前回は、かなり手こずりながらもオンライン版のBrowser-Solidity(Remix)をなんとか動かすことができました。
この環境の使い方を知るために、もう少しいじってみようかと思います。
ひとまず、教科書として使っている「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でやっている「既存コントラクトへのアクセス」をやるのが今回の目標です。
つまづきながらも一応は目標を達成したので、その紆余曲折をおたのしみくださいw
既存コントラクトへのアクセス
既存コントラクトの作成と警告の対処
既存コントラクトにアクセスするための事前準備として、まずは前回と同じ要領で、アクセス先のコントラクトとして1つコントラクトを作ってみましょう。
……というわけでブラウザのキャッシュを消して前回と同じことをやってみたら、また別の警告が!

警告内容は以下のようなものです。
ググってみると、どうも上の画像にある記法は非推奨だとか。
参考サイトによれば、コントラクトと同じ名前の関数名でコントラクタを定義するのはだめで、constructorと書きなさいってことみたいです。
まだコンストラクタなどがよくわかってないですが、やってみるとうまくいきました。

ためしにデプロイしてsetGreetingに文字を入れ、greetingとかsayとかをポチポチ押してみます。

とりあえずうまくいったっぽい……。
これでアクセス先のコントラクトは用意できました。
(参考)
・Ethereum: Solidity v0.4.23〜 の新しいコンストラクタの書き方(Qiitta)
既存コントラクトにアクセスしてみる
さて、教科書と微妙に違う環境で教科書通りに進もうとしてるので探り探りですが、次は既存コントラクトにアクセスしてみます。
既存コントラクトにアクセスするためには、アクセス先の既存コントラクトのアドレスを知る必要があります。
まずコントラクトアドレスってどれだってことで、半分勘に頼りながら探ってみます。。
同じHelloWorldさんをもう一つデプロイして、別の文字「へろー」をsetGreetingに入れたものを作ってみました。

先ほどの図の右下の赤枠で、いかにもこの2つ目(setGreetingに「へろー」と入れた方)のアドレスをコピーできそうなところがあります。
で、プロンプト的な画面のなかで、こいつをデプロイした行がどれかと探るわけですが、「creation of HelloWorld pending...」というデプロイ中っぽい行の後に、「HelloWorld」の文字が。
三角マークを押して開いてみて、「contractAddress」にある値と、先ほど右下の赤枠でコピーした内容(上の画像のメモ帳参照)を比べてみると一致します。
なのでまぁ、、さっきの右下の赤枠でコピーできるのが、その時デプロイしたコントラクトのアドレスっぽいかな、という予想のもとすすんでみます。
先ほどは2つ目のコントラクトアドレスを見ていましたが、今度は3つ目のHelloWorldをデプロイして1つ目のコントラクト(HelloWorld)にアクセスすることを目指してみます。
例によって、1つ目のHelloWorld(setGreetingに「Helloはろー」と入れた方)で、コントラクトアドレスをコピーします。

ここでコピーした内容を、Deployボタンの下にあるボックスにペーストして、「At Address」ボタンを押してみます。

「At Address」を押して出てきた(デプロイされた)3つ目のHelloWorldで、setGreetingに“何も入力せず”にgreetingとsayを押してみます。
すると、1つ目のHelloWorldでsetGreetingにあった「Helloはろー」というのが出てきました。

これで、既存コントラクトへのアクセスができた……気がしますw
まとめ
今回は、Browser-Solidity(Remix)をオンライン上で使い、あらかじめデプロイしたコントラクトに(紆余曲折のすえ)アクセスする(既存コントラクトへのアクセス)ということをやってみました。
既存コントラクトの準備中「Defining constructors as functions with the same name as the contract is deprecated.」という警告に出くわしたので、その対処もしました。
一応なりとも目標だった「既存コントラクトへのアクセス」はできましたが、だいぶのんびり進んでいますねw
まぁまったりとやっていきます。では今回はこのへんで。
また次回~。
前回は、かなり手こずりながらもオンライン版のBrowser-Solidity(Remix)をなんとか動かすことができました。
この環境の使い方を知るために、もう少しいじってみようかと思います。
ひとまず、教科書として使っている「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でやっている「既存コントラクトへのアクセス」をやるのが今回の目標です。
つまづきながらも一応は目標を達成したので、その紆余曲折をおたのしみくださいw
既存コントラクトへのアクセス
既存コントラクトの作成と警告の対処
既存コントラクトにアクセスするための事前準備として、まずは前回と同じ要領で、アクセス先のコントラクトとして1つコントラクトを作ってみましょう。
……というわけでブラウザのキャッシュを消して前回と同じことをやってみたら、また別の警告が!

警告内容は以下のようなものです。
browser/sample.sol:6:2: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
function HelloWorld(string _greeting) public {
^ (Relevant source part starts here and spans across multiple lines).
ググってみると、どうも上の画像にある記法は非推奨だとか。
参考サイトによれば、コントラクトと同じ名前の関数名でコントラクタを定義するのはだめで、constructorと書きなさいってことみたいです。
まだコンストラクタなどがよくわかってないですが、やってみるとうまくいきました。

ためしにデプロイしてsetGreetingに文字を入れ、greetingとかsayとかをポチポチ押してみます。

とりあえずうまくいったっぽい……。
これでアクセス先のコントラクトは用意できました。
(参考)
・Ethereum: Solidity v0.4.23〜 の新しいコンストラクタの書き方(Qiitta)
既存コントラクトにアクセスしてみる
さて、教科書と微妙に違う環境で教科書通りに進もうとしてるので探り探りですが、次は既存コントラクトにアクセスしてみます。
既存コントラクトにアクセスするためには、アクセス先の既存コントラクトのアドレスを知る必要があります。
まずコントラクトアドレスってどれだってことで、半分勘に頼りながら探ってみます。。
同じHelloWorldさんをもう一つデプロイして、別の文字「へろー」をsetGreetingに入れたものを作ってみました。

先ほどの図の右下の赤枠で、いかにもこの2つ目(setGreetingに「へろー」と入れた方)のアドレスをコピーできそうなところがあります。
で、プロンプト的な画面のなかで、こいつをデプロイした行がどれかと探るわけですが、「creation of HelloWorld pending...」というデプロイ中っぽい行の後に、「HelloWorld」の文字が。
三角マークを押して開いてみて、「contractAddress」にある値と、先ほど右下の赤枠でコピーした内容(上の画像のメモ帳参照)を比べてみると一致します。
なのでまぁ、、さっきの右下の赤枠でコピーできるのが、その時デプロイしたコントラクトのアドレスっぽいかな、という予想のもとすすんでみます。
先ほどは2つ目のコントラクトアドレスを見ていましたが、今度は3つ目のHelloWorldをデプロイして1つ目のコントラクト(HelloWorld)にアクセスすることを目指してみます。
例によって、1つ目のHelloWorld(setGreetingに「Helloはろー」と入れた方)で、コントラクトアドレスをコピーします。

ここでコピーした内容を、Deployボタンの下にあるボックスにペーストして、「At Address」ボタンを押してみます。

「At Address」を押して出てきた(デプロイされた)3つ目のHelloWorldで、setGreetingに“何も入力せず”にgreetingとsayを押してみます。
すると、1つ目のHelloWorldでsetGreetingにあった「Helloはろー」というのが出てきました。

これで、既存コントラクトへのアクセスができた……気がしますw
まとめ
今回は、Browser-Solidity(Remix)をオンライン上で使い、あらかじめデプロイしたコントラクトに(紆余曲折のすえ)アクセスする(既存コントラクトへのアクセス)ということをやってみました。
既存コントラクトの準備中「Defining constructors as functions with the same name as the contract is deprecated.」という警告に出くわしたので、その対処もしました。
一応なりとも目標だった「既存コントラクトへのアクセス」はできましたが、だいぶのんびり進んでいますねw
まぁまったりとやっていきます。では今回はこのへんで。
また次回~。