クリプト

ALISのICOスマートコントラクトを読む⑤

kenjiszk's icon'
  • kenjiszk
  • 2018/05/14 16:35
Content image

過去4回つづけてきましたが、今回がラストになります。

ALISのICOスマートコントラクトを読む①

ALISのICOスマートコントラクトを読む②

ALISのICOスマートコントラクトを読む③

ALISのICOスマートコントラクトを読む④

最後はやっぱりちゃんとテストを読もうと思います。


Alisトークンテスト

TestRPCで書かれています。js出かけますね。

https://github.com/AlisProject/ico-contracts/tree/master/test

ちなみに見たらわかりますが、本体のコードよりもテストの方が長いのではないかと思います。通常の開発でもテストは重要ですが、スマートコントラクトの場合デプロイしてしまうと修正ができないのでテストは基本カバレッジ100%にしておくのが吉とのこと。

全部読むと長いのでテストの中から面白いところだけピックアップして紹介します。

advanceToBlock

import advanceToBlock from './helpers/advanceToBlock';

ブロックを今の位置から進める処理が書かれています。内部的にはブロックをマイニングして進める、という形です。

まずadvanceBlockですが、内部でevm_mineというmethodを一回呼び出しています。これはマイニングをしているので一つブロックが生成されます。つまり一つブロックが前に進む。advanceToBlockで引数に渡した数だけブロックを前に進めることができます。

export function advanceBlock() {
  return new Promise((resolve, reject) => {
    web3.currentProvider.sendAsync({
      jsonrpc: '2.0',
      method: 'evm_mine',
      id: Date.now(),
    }, (err, res) => (err ? reject(err) : resolve(res)));
  });
}
// Advances the block number so that the last mined block is `number`.
export default async function advanceToBlock(number) {
  if (web3.eth.blockNumber > number) {
    throw Error(`block number ${number} is in the past (current is ${web3.eth.blockNumber})`);
  }
  while (web3.eth.blockNumber < number) {
    await advanceBlock();
  }
}

advanceToBlock使用例

以下はalis_crowdsale_finalizable.jsに書かれている簡単な使用例です。advanceToBlockでわざとクラウドセールを終了させたあと、ownerがクラウドセールをfinalizedできることをテストしています。

describe('finalize', () => {

  it('can be finalized by owner after ending', async function () {

    await advanceToBlock(this.endBlock);

    await this.crowdsale.finalize({ from: owner }).should.be.fulfilled;

  });


increaseTime

こちらは時間を進める処理です。

import increaseTime from './helpers/increaseTime';

durationで渡した数だけincreaseTimeによって時間が進められます。evm_increaseTimeで時間を進めてからevm_mineでブロックをマイニング。こうすることで時間を進めていきます。

export default function increaseTime(duration) {
  const id = Date.now();
  return new Promise((resolve, reject) => {
    web3.currentProvider.sendAsync({
      jsonrpc: '2.0',
      method: 'evm_increaseTime',
      params: [duration.asSeconds()],
      id,
    }, (err1) => {
      if (err1) return reject(err1);
      web3.currentProvider.sendAsync({
        jsonrpc: '2.0',
        method: 'evm_mine',
        id: id + 1,
      }, (err2, res) => (err2 ? reject(err2) : resolve(res)));
    });
  });
}

increaseTime使用例

Alisのトークンセールは時間経過によって変換レートが変化していたのでそのテストのために使われています。increaseTimeで1週間後の2分前のように強化条件でのテストをしていることがわかります。

it('should rate of week1 be 2,900 ALIS when 1 minute before ended', async function () {
  const duration = (60 * 60 * 24 * 7) - 120; // 1 week - 2 minute.
  await increaseTime(moment.duration(duration, 'second'));
  const expect = 2900;
  await advanceToBlock(this.endBlock - 1);
  const actual = await this.crowdsale.getRate();
  await actual.should.be.bignumber.equal(expect);
});

トークンのテストにはブロックを進めたりタイムスタンプを進めたりと色々な工夫をしてあらゆるパターンのテストを実行していました。

他にも色々なテストが書かれていて面白いですが今回はここまでです。

公開日:2018/05/14
獲得ALIS:11.73
kenjiszk's icon'
  • kenjiszk
  • @kenjiszk
エンジニア。ブロックチェーン勉強中。

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

【DeFi】複利でトークンを運用してくれるサイト

Like token Tip token
54.01 ALIS
Eye catch
クリプト

17万円のPCでTwitterやってるのはもったいないのでETHマイニングを始めた話

Like token Tip token
46.60 ALIS
Eye catch
クリプト

【第8回】あの仮想通貨はいま「テレグラム-TON/Gram」

Like token Tip token
69.90 ALIS
Eye catch
クリプト

NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

Like token Tip token
120.79 ALIS
Eye catch
クリプト

Uniswap v3を完全に理解した

Like token Tip token
18.92 ALIS
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

Like token Tip token
61.20 ALIS
Eye catch
クリプト

クリプトスペルズで入手したMCHCを引き出す方法

Like token Tip token
196.20 ALIS
Eye catch
クリプト

【初心者向け】JPYCを購入して使ってみました!

Like token Tip token
30.03 ALIS
Eye catch
クリプト

Eth2.0のステークによるDeFiへの影響を考える。

Like token Tip token
43.10 ALIS
Eye catch
クリプト

コインチェックに上場が決まったEnjin Coin(エンジンコイン)コインを解説

Like token Tip token
21.49 ALIS
Eye catch
クリプト

【初心者向け】$MCHCの基本情報と獲得方法

Like token Tip token
31.32 ALIS
Eye catch
クリプト

バイナンスの信用取引(マージン取引)を徹底解説~アカウントの開設方法から証拠金計算例まで~

Like token Tip token
3.50 ALIS