丸の内で働くブロックチェーンエンジニアのブログ

丸の内やその他でフリーのブロックチェーンエンジニアとして働いています。勉強している技術情報やニュースを紹介します。

DEXを動かす〜Etherdeltaのコントラクトをropstenネットワークにデプロイする〜

ERC20のトークンを交換できるDEXであるEtherdeltaについて、ropstenネットワークにデプロイして遊んでみます。 他のチェーンを触ることが多く、Ethereumからしばらく離れてしまっていたので手触り感を掴んでおく趣旨です。

この記事では、macOS High Sierra 10.13.4、node.jsをv9.4.0を使っています。

Etherdeltaの環境構築

# Etherdeltaのスマートコントラクトを落としてくる
git clone https://github.com/etherdelta/smart_contract

# pythonは2.xに変更しておく(pyenvなど)
# cloneしたフォルダに移動する
cd smart_contract

#node.jsの関連パッケージをインストール
npm install

ローカルでgethを立ち上げてデプロイ

ローカルでネットワークを立ち上げてにデプロイしてみます。gethを起動します。 ropstenネットワークにいきなりデプロイしたい人は飛ばして構いません。

gethの起動

gethの環境構築はこちら参考に。

www.blockchainengineer.tokyo

# geth起動
# テストなのでrpcaddrなどは適当だが、セキュリティ的に実際の環境ではきちんと設定する事
geth --networkid 42 --nodiscover --maxpeers 0 --datadir test_dir/ --rpc --rpcport 8545 --rpcapi "web3,eth,net,personal" -rpccorsdomain "*" --rpcaddr "0.0.0.0"  console

# gethでアドレス作成
personal.newAccount("XXX")

# マイニングスタート
miner.start(1)

deploy.js変更

deploy.jsではsolidityFileの場所が異なるので変更します。

# deploy.js書き換え
-  const solidityFile = './smart_contract/etherdelta.sol';
+  const solidityFile = './etherdelta.sol';

web3.providers.HttpProviderの向き先が「localhost:8545」になっている事を確認して、node.jsでdeploy.jsを動かします。

# localhostにdeploy
# deployのlocal addressにはgethで作成したアドレスを設定する事
node deploy.js --address="local address" --admin="local address" --feeAccount="local address" --accountLevelsAddr="local address"  --sendImmediately=True

ropstenネットワークへのデプロイ

ropstenネットワークのデプロイには、HDWalletProviderを使いました。 HDWalletProviderは、

mnemonic(ニーモニック)からウォレットを作成し、そのウォレットのアカウントを使ってプログラム上から簡単にトランザクションを発行できる仕組み

です。

(参考)

tomokazu-kozuma.com

事前準備

  • あらかじめ、ropstenネットワークでEthereumのアドレスを作っておく
  • 作ったアドレスにropstenネットワークのEtherを貯めておく(デプロイのgas代として)
  • アドレスのニーモニックフレーズを出力しておく
  • INFURAのアクセストークンを取得しておく
  • truffle-hdwallet-providerのインストール

が必要になります。上3件は検索すればすぐ出て来るので割愛します。

4件目のINFURAについては公式サイトの指示に従って登録すればアクセストークンを出力できます。 5件目はpackage.jsonに以下を書き足してnpm installをします。

+    "truffle": "^4.1.11",
+    "truffle-hdwallet-provider": "0.0.5",

deploy.jsのデプロイ先を変更

deploy.jsのデプロイ先をローカルホストからropstenに変更します。 変更内容はgitに載せていますのでこちら。

https://github.com/naomasabit-experiments/smart_contract/commit/ec407515dfbb1f360d210a7169024477e76de9ce#diff-7bce112a2436361628559f89e56eae6b

「var mnemonic」と「var accessToken」は自身のものに変更します。

ropstenにデプロイ

デプロイコマンドはこちら

# deployのyour addressにはropsetenで作成したアドレスを設定する事
node deploy.js --address="your address" --admin="your address" --feeAccount="your address" --accountLevelsAddr="your address"  --sendImmediately=True

こちらでデプロイした結果を見ることができます。

https://ropsten.etherscan.io/address/0x120f7826d29e414d8a47c19d5d2576c72f44eafe

トランザクションが生まれていれば成功です。

f:id:naomasabit:20180616154104p:plain

コントラクトアドレスも生まれており、

f:id:naomasabit:20180616154111p:plain

デプロイしたsolidityのコードも確認できます。

f:id:naomasabit:20180616154115p:plain

まとめ

HDWalletProviderでropstenネットワークへのデプロイを一通り実施しました。 デプロイは他にも楽な方法がありそうなので、色々試してみます。 また、Etherdeltaのソースコードを見て思いましたが、solidityよりも連携するフロントエンドの部分がかなり特殊に作り込まれており、こちらも合わせて開発して見る必要があるように思いました。