Transfer Gateway (LoomNetwork)  @Rinkeby

#はじめに

##TransferGateway
前回 https://qiita.com/oggata/items/698cee81c60985cebc57
で、TransferGatewayのexampleを試してみました。
今回は、testnet(rinkeby)などを使って、複数の環境でtokenやcoinをTransferさせてみた覚書です。

##TransferGatewayとは
普段使っているEthereumの世界(mainnetやtestnet)と、Loomnetworkの世界をつなぐための"玄関"となるのがTransferGatewayです。
馴染みのopenzeppelin-solidityなどから作ったERCのコントラクトに下記のような関数を付加し、これまでのEtereum環境と、Loomの環境それぞれにdeployすることで簡単に接続することが可能となります。

```
    function depositToGateway(address _gateway, uint256 _uid) public {
        safeTransferFrom(msg.sender, _gateway, _uid);
    }
```

![alt](https://loomx.io/developers/img/transfer-gateway-erc721-to-dappchain.png)

##Network

(memo)
https://loomx.io/developers/docs/en/testnet-plasma.html

| Name | Url | Type | Detail |
|:--|:--|:--|:--|
| loom_dapp_chain | 127.0.0.1:46658 | local | ローカルチェーンネットワーク |
| extdev_plasma_us1 | extdev-plasma-us1.dappchains.com:80 | testnet | Loomテストネットのplasmaチェーン(安定的開発者β) |
| Dev Plasma Test | test-z-asia1.dappchains.com | testnet | 実験的ベータ |
| Validator Test | test-z-validator1.dappchains.com | testnet| バリデーターベータ |
| Plasma Chain | plasma.dappchains.com | mainnet | エンドユーザーベータ (Loom MarketPlace) |
| Mainnet | ユーザーベータ |  |  |
| Social Chain | Block Explorer | メインネット | DelegateCall |

(memo)
(※Karmaをもらえる https://faucet.dappchains.com/ が動かなかったが、Karmaなしでもextdev_plasma_us1というネットワークを指定してdeploy可能。)


| Name | Ethereum Link | TransferGateway Address |
|:--|:--|:--|
| Devnet Plasma (extdev-plasma-us1) | Rinkeby | 0xb73C9506cb7f4139A4D6Ac81DF1e5b6756Fab7A2 |
| Devnet Plasma (test-z-asia1) | Rinkeby | 0x3c826a09DF9ad39B9acF550b1bf35C9b6AfCd943 |
| Plasma Chain | Mainnet | 0x223CA78df868367D214b444d561B9123c018963A |
| Validator Test | Rinkeby | n/a |

(参考)https://loomx.io/developers/docs/ja/testnet-plasma.html

#Setup
##1.loomのインストール
```
$ curl https://raw.githubusercontent.com/loomnetwork/loom-sdk-documentation/master/scripts/get_loom.sh | sh
$ ./loom 
$ ./loom init
$ ./loom run
$ history
$ ./loom genkey -k priv_key -a pub_key
local address: 0xF6337F78a0AF189d5ee9Ba4314364f8658B4A745
local address base64: 9jN/eKCvGJ1e6bpDFDZPhli0p0U=
```

##2.explorerを開く

```
https://blockexplorer.loomx.io/
を開き、下記のloomが起動しているローカルのaddress+IPを入力する
http://127.0.0.1:46658
```

##3.sampleのインストール
```
$ git clone https://github.com/loomnetwork/truffle-dappchain-example
$ cd truffle-dappchain-example/
$ cp ../priv_key extdev_private_key
$ npm install -g yarn
$ yarn
//yarn deployはデフォルトで、loom_dapp_chainにdeployする.
//package.jsonに　    "deploy:extdev": "truffle deploy --network extdev_plasma_us1",
//と記載されているのでこの場合は、extdev_plasma_us1にdeployする

$ yarn deploy

Starting migrations...
======================
> Network name:    'loom_dapp_chain'
> Network id:      13654820909954
> Block gas limit: 0

$ yarn deploy:extdev

Starting migrations...
======================
> Network name:    'extdev_plasma_us1'
> Network id:      9545242630824
> Block gas limit: 0
```

この2つの環境についてtruffle-configに記述されている。

```truffle-config.js
    loom_dapp_chain: {
      provider: function() {
        const privateKey = readFileSync(path.join(__dirname, 'private_key'), 'utf-8')
        const chainId = 'default'
        const writeUrl = 'http://127.0.0.1:46658/rpc'
        const readUrl = 'http://127.0.0.1:46658/query'
        const loomTruffleProvider = new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey)
        loomTruffleProvider.createExtraAccountsFromMnemonic("gravity top burden flip student usage spell purchase hundred improve check genre", 10)
        return loomTruffleProvider
      },
      network_id: '*'
    },

    extdev_plasma_us1: {
      provider: function() {
        const privateKey = readFileSync(path.join(__dirname, 'extdev_private_key'), 'utf-8')
        const chainId = 'extdev-plasma-us1'
        const writeUrl = 'http://extdev-plasma-us1.dappchains.com:80/rpc'
        const readUrl = 'http://extdev-plasma-us1.dappchains.com:80/query'
        return new LoomTruffleProvider(chainId, writeUrl, readUrl, privateKey)
      },
      network_id: '9545242630824'
    },
```

```
$ yarn gen:rinkeby-key
#Rinkeby 
https://faucet.rinkeby.io/
```

```
$ export INFURA_API_KEY=1234567890
$ yarn deploy:rinkeby
```

#ExtDevコインとRinkebyトークンの交換

##アドレスを紐付ける
```
node ./gateway-cli.js map-contracts token
//(MyTokenContractAddress)->(MyRinkebyTokenContractAddress)
Submitted request to map 0x2A7B63620AEd6DF6cE3447e20E58cAcCFD6538D3 to 0xE2759F793AFf841B49Dc97a26819109491F0403D

node ./gateway-cli.js map-contracts coin
//(MyCoinContractAddress)->(MyRinkebyCoinContractAddress)
Submitted request to map 0xD41fB46DFD4a4e5f73Ac6F18339ec87465Cb86aA to 0x3A37F91077c0BEb27089e7B7E8383CF7E25405B8

//rinkebyのコントラクトaddress <-> rinkebery-Address From
//(MyRinkebyToken address(wallet address))<->(LoomLocalAddress)
mapping eth:0x2210d424a2cf814fc9d78dd094b52a7a0edbed14 to extdev-plasma-us1:0xf6337f78a0af189d5ee9ba4314364f8658b4a745
Mapped extdev-plasma-us1:0xf6337f78a0af189d5ee9ba4314364f8658b4a745 to eth:0x2210d424a2cf814fc9d78dd094b52a7a0edbed14
```
##tokenをmint
```
//idを指定してRinkebyでtokenをmintする
$ node ./gateway-cli.js mint-token 1
Token 1 minted, Rinkeby tx hash: 0x1421e67f0be56fb37196258b52c7c83401765ae65db651d78bdaa9d57bfe9863
$ node ./gateway-cli.js mint-token 2
Token 2 minted, Rinkeby tx hash: 0xcf11f7ab25d3ff71aa962d119a0b3f8a8e499e878caac44fa8a8ff907a94bcbe
$ node ./gateway-cli.js mint-token 3
Token 3 minted, Rinkeby tx hash: 0x85740398d62c9c2a95e1a6fc91abbb5be999f6a60645d799c19e1b8719dd691a
```

##tokenの転送例
```
//token1をrinkeby->ext-devに転送する
$ node ./gateway-cli.js deposit-token 1
Token 1 deposited, Rinkeby tx hash: 0x475079d79de98bc9baa642eb41321a50ef7f0f1955844af891fc3ded91e38df8

//Rinkebyのtoken残高
$ node ./gateway-cli.js token-balance -c eth
0x2210d424A2cf814fC9d78DD094b52a7A0EDbEd14 owns 2 tokens.
First 2 token(s): 3,2

//ext-devのtoken残高
$ node ./gateway-cli.js token-balance
0xf6337f78a0af189d5ee9ba4314364f8658b4a745 owns 1 tokens.

Gateway(Rinkeby)の保有残高
node ./gateway-cli.js token-balance -a gateway -c eth
0xb73C9506cb7f4139A4D6Ac81DF1e5b6756Fab7A2 owns 1 tokens.

```

##coinの転送例

```
$ node ./gateway-cli.js deposit-coin 120
120 tokens deposited to Ethereum Gateway.
Rinkeby tx hash: 0x34fc4f092cfe7bd9846d7c5119455b1752b5e121d0d81d1ff0683abd228d7a8b

// Rinkebyの残高
$ node ./gateway-cli.js coin-balance -c eth
0x2210d424A2cf814fC9d78DD094b52a7A0EDbEd14 balance is 999999880

// extdevの残高
$ node ./gateway-cli.js coin-balance
0xf6337f78a0af189d5ee9ba4314364f8658b4a745 balance is 0

// Gateway(Rinkeby)の残高
$ node ./gateway-cli.js coin-balance -a gateway -c eth
0xb73C9506cb7f4139A4D6Ac81DF1e5b6756Fab7A2 balance is 120
```


##ext-devからRinkebyにtokenを戻す
```
# Rinkebyに戻す
node ./gateway-cli.js withdraw-token 1

# Rinkeby残高
node ./gateway-cli.js token-balance -c eth

# extdev残高
node ./gateway-cli.js token-balance
```

##ext-devからRinkebyにcoinを戻す
```
node ./gateway-cli.js token-balance -a gateway -c eth

# Rinkebyに60戻す
node ./gateway-cli.js withdraw-coin 60

# Rinkeby残高
node ./gateway-cli.js coin-balance -c eth

# extdev残高
node ./gateway-cli.js coin-balance

# Gateway(Rinkeby)残高
node ./gateway-cli.js coin-balance -a gateway -c eth
```


#参考
(一連のtestnetでの流れ)
https://loomx.io/developers/docs/en/extdev-transfer-gateway.html