EthereumとRemixでスマートコントラクトを作って動かしてみよう!
前提
この記事を実践するには下記の環境ができている必要があります。
RemixとEthereumの準備が必要です。
Remixを下準備
前回の記事の部分は省きます。なのでこれだけでOK!
$ cd /home/ubuntu/remix-ide
$ npm start
> remix-ide@0.6.3 start /home/ubuntu/remix-ide
> npm-run-all -lpr serve watch onchange remixd
[onchange]
[onchange] > remix-ide@0.6.3 onchange /home/ubuntu/remix-ide
[onchange] > onchange build/app.js -- npm-run-all lint
[onchange]
[watch ]
[watch ] > remix-ide@0.6.3 watch /home/ubuntu/remix-ide
[watch ] > watchify src/index.js -dv -p browserify-reload -o build/app.js
[watch ]
[serve ]
[serve ] > remix-ide@0.6.3 serve /home/ubuntu/remix-ide
[serve ] > execr --silent http-server .
[serve ]
[remixd ]
[remixd ] > remix-ide@0.6.3 remixd /home/ubuntu/remix-ide
[remixd ] > ./node_modules/remixd/bin/remixd -s ./contracts
[remixd ]
[watch ] WS server listening on 44863
[remixd ] example: --dev-path /home/devchains/chain1 --mist --geth --frontend /home/frontend --frontend-port 8084 --auto-mine
[remixd ]
[remixd ] Usage: remixd -s <shared folder>
[remixd ]
[remixd ] Provide a two ways connection between the local computer and Remix IDE
[remixd ]
[remixd ] Options:
[remixd ]
[remixd ] -s, --shared-folder <path> Folder to share with Remix IDE
[remixd ] -m, --mist start mist
[remixd ] -g, --geth start geth
[remixd ] -p, --dev-path <dev-path> Folder used by mist/geth to start the development instance
[remixd ] -f, --frontend <front-end> Folder that should be served by remixd
[remixd ] -p, --frontend-port <front-end-port> Http port used by the frontend (default 8082)
[remixd ] -a, --auto-mine mine pending transactions
[remixd ] -r, --rpc <cors-domains> start rpc server. Values are CORS domain
[remixd ] -rp, --rpc-port rpc server port (default 8545)
[remixd ] -h, --help output usage information
[remixd ] [WARN] Any application that runs on your computer can potentially read from and write to all files in the directory.
[remixd ] [WARN] Symbolinc links are not forwarded to Remix IDE
[remixd ]
[remixd ] [WARN] Symbolic link modification not allowed : ./contracts | /home/ubuntu/remix-ide/contracts
[remixd ] Shared folder : ./contracts
[remixd ] Sun May 13 2018 18:17:01 GMT+0900 (JST) Remixd is listening on 127.0.0.1:65520
Ethereumを下準備
$ cd /home/ubuntu/eth_private_net
//gethの起動
$ geth --networkid "15" --nodiscover --datadir "/home/ubuntu/eth_private_net" console 2>> /home/ubuntu/eth_private_net/geth_err.log
//accountの作成
//hogehoge01はアカウントのパスワードです。あとで使うので忘れないようにしましょう。
> personal.newAccount("hogehoge01")
"0x9e14489b93a30f0acd621d048828093891cca012"
> personal.newAccount("hogehoge02")
"0x05786fbbfe1a10fdbb2ba09a7d694f6821a6ad59"
> eth.accounts
["0x9e14489b93a30f0acd621d048828093891cca012", "0x05786fbbfe1a10fdbb2ba09a7d694f6821a6ad59"]
//コンソールから抜けましょう
> exit
RemixとEthereumの連携
それぞれの起動はできました。では次は連携をしていきましょう。
$ cd /home/ubuntu/eth_private_net
//--unlockの後ろに作成したhogehoge01のアドレスを張りつけます。
//※「rpc~」は、JSON-RPCサーバを起動させ、連携させる為に必要な設定。この設定がないと外部からアクセスできません。
//※コントラクトのデプロイ時や実行時に、accountのアンロック化が必要です。「--unlock」オプションを使用して、任意のアカウントをgeth起動時にunlockしておきましょう。
$ geth --networkid 15 --datadir . --nodiscover --rpc --rpccorsdomain "*" --rpcport 8545 --rpcaddr "0.0.0.0" --rpcapi "web3,eth,net,personal" --unlock 0x9e14489b93a30f0acd621d048828093891cca012 console 2>> err.log
Unlocking account 0x45dfb16e0e04d4063bd512ec7448744c7d5c5f2c | Attempt 1/3
Passphrase:
//パスワードが要求されましたね。では先ほどのhogehoge01を入力しましょう。
//すると。。
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.7-stable-66432f38/linux-amd64/go1.10
coinbase: 0x45dfb16e0e04d4063bd512ec7448744c7d5c5f2c
at block: 359 (Sun, 13 May 2018 18:15:06 JST)
datadir: /home/ubuntu/eth_private_net
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
consoleに入れるようになりました。これで準備は完了!
いざ画面から動かしてみましょう!
Runタブを選択します。EnvironmentをWeb3 Providerに変更します。
OKを押してUbuntuのIPアドレスを入力します。
お、入れない?エラー?やんのかやんのか?
Not possible to connect to the Web3 provider. Make sure the provider is running and a connection is open (via IPC or RPC).
見てみると接続ができないっぽいですね。port関連な気がします・・・。
というわけでportを開放しに行きましょう。
$ cd /
$ sudo vi /etc/iptables/iptables.rules
----------------------------
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 8080 -j ACCEPT ←これはsolidityの構築の際に開放したものです。
//8545でportを開放するために追記
-A INPUT -p tcp --dport 8545 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
----------------------------
//設定した内容を適用
$ sudo /sbin/iptables-restore < /etc/iptables/iptables.rules
いざ再チャレンジ!!!
できた!!!
スマートコントラクトを作って動かそう!
というわけで新たにファイルを作りますか。左にある⊕ボタンを押します。HelloWorld.solと名前を付けてOKボタンを押します。
ではいよいよContractを書きましょう!ということで簡単なcontractを用意しました。呼び出したら"Hello World!!"と返してくれます。
pragma solidity ^0.4.0;
contract HelloWorld {
function get() constant returns (string retVal) {
return "Hello World!!";
}
}
CompileタブでStart to compileしましょう!
※コンパイルとは、プログラミング言語で書かれた文字列(ソースコード)を、コンピュータ上で実行可能な形式(オブジェクトコード)に変換することです。
次はデプロイです!
Runタブに移動してHelloWorldの下にあるDeployボタンを押しましょう!
※デプロイとは、システムを利用可能な状態にすることです。
pending=保留中,つまり処理されいない?
Ethereumが働いていませんね。マイニングさせましょう!
> miner.start(1)
null
画面を見てみると!お、デプロイされているっぽいぞ!
ではgetをしてみましょう。右にあるgetボタンを押してみます。
"Hello World!!"が返ってきていますね!自分の書いたContractが動くことが確認できました。これで作って、コンパイルして、デプロイして、動かすの一通りができました。ここまでどうだったでしょうか?うまくいきましたか?もし詰まるようでしたら、コメントください!環境さえできてしまえばあとはひたすら書くだけですね!(´ー`)
この記事が気に入ったらサポートをしてみませんか?