見出し画像

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が動くことが確認できました。これで作って、コンパイルして、デプロイして、動かすの一通りができました。ここまでどうだったでしょうか?うまくいきましたか?もし詰まるようでしたら、コメントください!環境さえできてしまえばあとはひたすら書くだけですね!(´ー`)


この記事が気に入ったらサポートをしてみませんか?