etherscanでのコントラクトベリファイにはLicense指定が必須でコメントは消してもよい


# はじめに

etherscanでソースコードのベリファイの動きを勉強しました。そのノートです。

TruffleとOpenZeppelinを使ってコントラクトを作成しました。

ソースはここにおいてあります。

https://github.com/planethouki/etherscan-verify-test

## コントラクトデプロイ１

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

こんなコントラクトをデプロイしました。

```javascript
pragma solidity >=0.4.21 <0.7.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";

contract PToken is ERC20, ERC20Detailed {
  constructor(uint256 initialSupply) ERC20Detailed("PToken", "PTN", 18) public {
    _mint(msg.sender, initialSupply);
  }
}
```

ではベリファイに進みます。

### etherscanにアップロードできるファイルの種類は4つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/f64560cd-4284-a15b-7f72-810607e33c80.png)


### Standard-Json-Inputって何？

#### truffleでコンパイルした後にできるjsonではない

`build/contracts/PToken.json`をアップロードしてみた

> Error! Unable to generate Contract ByteCode and ABI (General Exception, unable to get compiled [bytecode])
> エラー！コントラクトのByteCodeおよびABIを生成できません（一般例外、コンパイルされた[bytecode]を取得できません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c3f86594-ddb0-896b-3092-f0680d2841c1.png)

#### こういう形式らしい

https://solidity.readthedocs.io/en/v0.5.13/using-the-compiler.html#input-description

#### そのjsonのmetadataにあるやつがそれっぽい、でもダメだった

これ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/148293ba-40fe-4b15-0161-6fc9885c7061.png)

parseしてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/5a42c1bf-79a6-0123-9c15-e95d5fa4ccd7.png)

エラー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/6cb64945-070e-8e87-f967-8dd8762a1af9.png)

> Unable to process the standard-input-json you uploaded. ErrCode: Only literal contents of the source file, Source using URLS are not supported
> アップロードしたstandard-input-jsonを処理できません。 ErrCode：ソースファイルのリテラルコンテンツのみ、URLSを使用するソースはサポートされていません

以下のように、`sources[<file_name>].urls`ではなく、`sources[<file_name>].content`でなければならないということだと思った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/0e66bfa7-cfb4-4054-790c-3483c12bff7c.png)


### truffle-flattenerを使ってSingle fileを指定するとできた

これを使うと、インポートとかをさかのぼって一つのファイルにまとめられる

https://github.com/nomiclabs/truffle-flattener

無事ベリファイできた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/e4cb21c8-3542-06af-3b8b-ea4c830f251a.png)


### Contractタブにソースコードが表示された

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/8140d2e0-c565-97dc-c797-9dd15c80ca04.png)


## コントラクトデプロイ２

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

１とまったく同じSolidityをデプロイした

### etherscanではすでにベリファイされている

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

前のやつと同じバイトコードだから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/679678af-9d01-76ba-60d2-4ce91345a6a6.png)

## コントラクトデプロイ３

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

名前を一文字変えた。`PToken`から`LToken`にした。コンストラクタ引数は変えていない。

```javascript
pragma solidity >=0.4.21 <0.7.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";

contract LToken is ERC20, ERC20Detailed {
  constructor(uint256 initialSupply) ERC20Detailed("PToken", "PTN", 18) public {
    _mint(msg.sender, initialSupply);
  }
}
```

### コントラクトの名前を変えると同一ではなくなる

etherscanの画面がまだベリファイではない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/bcedd549-942b-e525-8bcf-cdcb2ffa8ab5.png)

### ベリファイではLicenseが必須項目、コメントの有無はベリファイに影響しない

Licenseは必須項目

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/0a26c6b6-4b78-ab7b-f1e2-34870eca2c04.png)

LicenseをNoneに指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/fde89fb2-bfc9-bc09-b1c3-97059980ed0e.png)

コメントを消してアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/128ca6e5-703c-25d2-1fbf-e523cd139d8f.png)

License Noneと表示される。Licenseの表記がないコントラクトは、昔の時代のものなのかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c16d639a-87dc-1e73-c9c7-799506d6d2cf.png)

# おわりに

コントラクトベリファイは、Single fileを選択する。

全く同じバイトコードのコントラクトは、自動的にベリファイされる。

Licenseの指定は必須。

コントラクトのコメントは消しても問題ない。