Truffle チュートリアル

今回はEthereumのフレームワークであるTruffleの使い方についてご説明します。

開発環境は以下です。

- NodeJS 5.0以上
- Windows, Linux or Mac OS X

## インストール
以下のコマンドでTruffleをインストールします。

```
$ npm install -g truffle
```

続いてプロジェクトを作りましょう。

```
$ mkdir myproject
$ cd myproject
$ truffle init
```

初期化が完了したら、以下のフォルダ/ファイルが出来ているはずです。

-  `app/`
- `contracts/`
- `environments/`
- `test/`
- `truffle.js`

## コントラクトのコンパイル
Solidityファイルは`./contracts`に置いてください。


solidityファイルをコンパイルするには、以下のコマンドを打ちます。

```
$ truffle compile
```

１点contract fileを書くときの注意として、ファイル名と同一のコントラクトを準備する必要があります。

```
contract MyContract {
  ...
}
// or
library MyContract {
  ...
}
```

##デプロイ
デプロイする前に`http://localhost:8545`のポートを空けてください。
Ethereumクライアントにコントラクトをデプロイするためには、以下のコマンドを実行してください。

```
$ truffle deploy
```

## テスト
TruffleはMochaとChaiをテストツールとして用いてます。テストファイルは`./tests`に置きます。

テストの実行は以下のコマンドを実効するだけで大丈夫です。

```
$ truffle test
```

特定のfileをtestしたい場合は、以下のように行う。

```
$ truffle test ./path/to/test/file.js
```

## コントラクトとの接続
Ethereumのネットワークと接続するためには[web3.js](https://github.com/ethereum/web3.js)を使うのが一般的ですが、Truffleでは[Ether Padding](https://github.com/ConsenSys/ether-pudding)を使います。これはWeb3の上に作られたライブラリであり、コントラクトとより簡単に接続できます。


###データの書き込み/読み込み
Ethereumでは、データの書き込みはTransaction、読み込みはCallと言います。

**書き込み(Transaction)**

- Cost gas (Ether)
- Change the state of the network
- Aren't processed immediately
- Won't expose a return value (only a transaction id).

**読み込み(Call)**
- Are free (do not cost gas)
- Do not change the state of the network
- Are processed immediately
- Will expose a return value (hooray!)

**概要**
理解しやすくするために参考となるファイルを作ります。このコントラクトは初期化メソッドの他に、3つのファンクションを含みます。(`sendCoin`, `getBalanceEth`, `getBalance`です)

```
import "ConvertLib.sol";

contract MetaCoin {
  mapping (address => uint) balances;

  function MetaCoin() {
    balances[tx.origin] = 10000;
  }

  function sendCoin(address receiver, uint amount) returns(bool sufficient) {
    if (balances[msg.sender] < amount) return false;
    balances[msg.sender] -= amount;
    balances[receiver] += amount;
    return true;
  }

  function getBalanceInEth(address addr) returns(uint) {
    return ConvertLib.convert(getBalance(addr), 2);
  }

  function getBalance(address addr) returns(uint) {
    return balances[addr];
  }
}
```


**Transaction作成**
Transactionは以下のようにして作成します。

```
var account_one = "0x1234..."; // an address
var account_two = "0xabcd..."; // another address

var meta = MetaCoin.deployed();
meta.sendCoin(account_two, 10, {from: account_one}).then(function(tx_id) {
  // If this callback is called, the transaction was successfully processed.
  // Note that Ether Pudding takes care of watching the network and triggering
  // this callback.
  alert("Transaction successful!")
}).catch(function(e) {
  // There was an error! Handle it.
})
```

**Call作成**
Callは以下のようにして作成します。

```
var account_one = "0x1234..."; // an address

var meta = MetaCoin.deployed();
meta.getBalance.call(account_one, {from: account_one}).then(function(balance) {
  // If this callback is called, the call was successfully executed.
  // Note that this returns immediately without any waiting.
  // Let's print the return value.
  console.log(balance.toNumber());
}).catch(function(e) {
  // There was an error! Handle it.
})
```

##コンソール

コンソールを使うには、以下のコマンドを打ちます。

```
$ truffle console
```

##まとめ
以上がTruffleの基本的な使い方です。次回はTruffleを使ったアプリケーションについて詳しく説明して参ります。

##参考資料
http://truffle.readthedocs.io/en/latest/getting_started/workflow/