Ethereum入門　〜Etherscanにコードを登録する方法〜

#はじめに

Etherscanにスマートコントラクトのコードを登録する方法です。Testnetも登録対応しているのでデプロイした際はコード登録を習慣付けて置くと、後から見返した時にどのコントラクトが何の内容か把握しやすいのでオススメです。

#Etherscanにコードを登録する

#truffle-flattenerのインストール
OpenZepplinなどライブラリを使用している場合、使用しているimportを全て1つのファイルに記述しないといけません。
そのため、1つのファイルに生成してくれる便利なツールがあります。


solidity(solc)をインストール

```
$ brew update
$ brew upgrade
$ brew tap ethereum/ethereum
$ brew install solidity
```

truffle-flattenerをインストール

```
$ npm install truffle-flattener -g

```

例えばこのようなコントラクトがあるとして、

```MyToken.sol
pragma solidity ^0.5.0;

import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";

contract MyToken is ERC20, ERC20Detailed {

string public _name = "KTcoin";
string public _symbol = "KTC";
uint8 public _decimals = 18;

address account = msg.sender;
uint initialSupply = 100*(10**18);

constructor() ERC20Detailed( _name, _symbol, _decimals) public {
    _mint(account, initialSupply);
    }
}
```



このように使用します。

```
$ truffle-flattener contracts/MyToken.sol > contracts/Output.sol
```

このように出力されます。

```Output.sol
pragma solidity ^0.5.0;

// File: /Users/code/erc20_sample/node_modules/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

...省略

// File: contracts/MyToken.sol

contract MyToken is ERC20, ERC20Detailed {

string public _name = "KTcoin";
string public _symbol = "KTC";
uint8 public _decimals = 18;

address account = msg.sender;
uint initialSupply = 100*(10**18);

constructor() ERC20Detailed( _name, _symbol, _decimals) public {
    _mint(account, initialSupply);
    }
}

```

#Ethescanに登録

デプロイしたコントラクトのコードから Verify and Publishをクリックします。

<img width="996" alt="Rinkeby Accounts, Addresses and Contracts 2019-05-04 20-19-31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200669/0b8c48c5-7cf8-3568-b23c-9f13a026904f.png">

コンパイラタイプ、コンパイラバージョン、ライセンスをデプロイした時のものに選択します。

<img width="870" alt="Screen Shot 2019-07-24 at 12.02.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200669/e9e8f3a0-b3d0-fe76-12e5-be3475fed01b.png">

Enter the Solidity Contract Code below にデプロイしたコードを入力します。


<img width="1050" alt="Screen Shot 2019-07-24 at 12.12.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200669/3bc60755-5499-5a2b-67ac-55a43a676be7.png">


デプロイ時、コンストラクターに引数を入れている場合は、ABIエンコードした引数をConstructor Arguments ABI-encoded欄に入力します。

ABI-encodedはこちらで変換可能です。
https://abi.hashex.org/

Publishを押し、コードが一致すれば登録が完了します。

<img width="1017" alt="Screen Shot 2019-05-04 at 20.27.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200669/e298227d-8e98-e096-5f80-f58aae162aed.png">


https://rinkeby.etherscan.io/address/0x7fccCf63954b7CEc1fE1E9d81A0064Ea8aB7Da82#code

#参考にさせて頂きました

https://m0t0k1ch1st0ry.com/blog/2017/12/08/etherscan-token-verification/