ERC721のサンプルコードを動かしてみる

Ethereum(イーサリアム)

以前ERC721を紹介しましたが今回はその際に紹介したサンプルコードを動かしてみようと思います。

Sponsored Link


サンプルにするコード

上記のソースを動かしてみます。ERC721に対応しています。
以下のプロジェクトのソースです。

環境構築

ubuntu16.04上を想定しています。
以下手順です。また別途Dockerファイルでも作成します。

# apt-get update && apt-get install -y \
    software-properties-common \
    curl \
    git \
    nodejs \
    npm

# npm cache clean
# npm install n -g
# n stable
# ln -sf /usr/local/bin/node /usr/bin/node
# apt-get purge -y nodejs npm
# bash   ←-------- npm が使えるようにする。これがないとpathが通らない

サンプルソースのインストール

# git clone https://github.com/dharmaprotocol/NonFungibleToken.git
# cd NonFungibleToken
# npm install

動作確認

READMEにのっているテスト行なってみます。

2つTerminalを立ち上げて、片方で testrpcを立ち上げます。
testrpcは以前にも使いましたが、Ethereumノードのダミーなレスポンスを返してくれます。

# npm run testrpc

> NonFungibleToken@0.0.1 testrpc /token
> ganache-cli --networkId 50

Ganache CLI v6.0.3 (ganache-core: 2.0.2)

Available Accounts
==================
(0) 0x525ede924c4cbb441c334872fe6aad9264727e85
(1) 0x4c20b1acdf1ec582095d0db537241d945fe49232
(2) 0x577a5233396708a08da688a201eb9f7426a8d782
(3) 0xaf5af566305de500e39abe705bcd4fb99340b0e2
(4) 0x752edc07b5ae8a1dcad9e9953a9768b33ca89e27
(5) 0xc1da3510be856c4ffca3728b3609758563e6074a
(6) 0x0e39137b590696280cf59de0a0dca26168a07780
(7) 0x1d8629d7dacaf76a6632f6fd0b6e0d78a1f81c7a
(8) 0x353fb3b4bf4cdbdb41d4d66926b3aa305ff9341d
(9) 0x7be4bc1782e6c8e2f74d599df90422943be69e79

Private Keys
==================
(0) a336301e3425efbe6b2faf67a52ecec07f3a76cb8d6eee906e2d81c52d97da2e
(1) 813d71b9fb6e1d64d1178241953fa8e79b171cc265217130354e9cfd4f4e249f
(2) 1814cf06de2004beb0fe99f9d07a45b5102f1d29d867004d509419bd408cba16
(3) 8b89ab8c0b38c0cbfcf23c66da68f7412b3ec70799f62cd31cc9fdb2e0ae52cb
(4) 71ec5e10fd060af85c0bf3edf6278fdbff8ed4d05d65899e5e9d737659697288
(5) 3b075038b6c8ebdb19983c7d9211542f322dd1661ab99535bd975dab65e92593
(6) c3125a5f6d393858ca875afe5100acd7010124648d2f78f6f3f735efaaefa23d
(7) d2b6cc518b07554fdb19d9c2f97c566172f8bb7d59e171732c5a0dc5f319459d
(8) 639100bce9f3f51ef51d6bfb3f8b3cfe739fa609e4440d830da7fe92fc0a1c5c
(9) 5c783203da1a22eb77fdd391115c1236e6c02c0bb28b9c078ddda16cd82a74f4

HD Wallet
==================
Mnemonic:      wisdom emotion stove grace emotion motion outdoor loyal thumb chapter analyst column
Base HD Path:  m/44'/60'/0'/0/{account_index}

Listening on localhost:8545

migration

migration(要はブロックチェーン上にコードをのっける)が動くか試してみます。

まず、少しソースをいじります。

https://github.com/dharmaprotocol/NonFungibleToken/tree/master/contracts
にあるスマートコントラクトのソースを全て

pragma solidity 0.4.18;

pragma solidity 0.4.19;

に変えます。自分の環境ではこちらの変更をしないとコンパイル時にエラーになりました。
solidityのコンパイルバージョンとソースのバージョンが一致していないためです。

また、以下修正で一部テストが通らない、かつ、migrate時にもエラーがでているようなので

https://github.com/dharmaprotocol/NonFungibleToken/commit/97690a94416f841d6b69d33cf1d764a09b5d5f0b

これを元に戻します。(internal -> public)

    function mint(address _owner, uint256 _tokenId)
        public
        onlyNonexistentToken(_tokenId)

そして別Terminalでmigration(要はブロックチェーン上にコードをのっける)をしてみます。

# npm run migrate

> NonFungibleToken@0.0.1 migrate /token
> npm run transpile; truffle migrate


> NonFungibleToken@0.0.1 transpile /token
> rm -rf ./transpiled; copyfiles ./build/**/* ./transpiled; tsc

Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xbb94a84d63879002dd28755a87edf03eb05ac81df9a29a82c70162d3fb60aced
  Migrations: 0xb5df479f7aaebd1974c5d5475a7b81d9d38afeb1
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying NonFungibleToken...
  ... 0x00427c3a734076b75100a09455a0174c866b2768d93ae0210d4d0d2ae2a2f43a
  NonFungibleToken: 0x04f8484f344097f0102c918220621d212007e683
Saving artifacts...

一方で testrpc を動かした方は以下のようなログが出力されているはずです。

net_version
eth_accounts
eth_accounts
net_version
net_version
eth_sendTransaction

  Transaction: 0x86d06cf15fbe9e96175e8017f026a3a4ad6f300070e2d5c580b8a4b08ded29f1
  Contract created: 0x49d4c218c95b900512d88c23baf8d7cfc228c5c3
  Gas usage: 269671
  Block Number: 1
  Block Time: Tue Feb 20 2018 07:13:36 GMT+0000 (UTC)

eth_newBlockFilter
eth_getFilterChanges
eth_getTransactionReceipt
eth_getCode
eth_uninstallFilter
eth_accounts
net_version
net_version
eth_sendTransaction

  Transaction: 0x0956001982473959f011ac303b72ae8757a0aaf7cdc0fce54cbe4f4013f41d1c
  Contract created: 0xf138424caf019514196fe0b0db303150a6dab0ab
  Gas usage: 1403673
  Block Number: 2
  Block Time: Tue Feb 20 2018 07:13:37 GMT+0000 (UTC)

eth_newBlockFilter
eth_getFilterChanges
eth_getTransactionReceipt
eth_getCode
eth_uninstallFilter

test

それではtestcodeを動かしてみます。

# npm test

> NonFungibleToken@0.0.1 test /token
> npm run compile; npm run generate-typings; npm run transpile; truffle test


> NonFungibleToken@0.0.1 compile /token
> rm -rf build/contracts; truffle compile

Compiling ./contracts/DetailedERC721.sol...
Compiling ./contracts/ERC721.sol...
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/MintableNonFungibleToken.sol...
Compiling ./contracts/NonFungibleToken.sol...
Compiling ./contracts/test/TestMintableNFT.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Writing artifacts to ./build/contracts


> NonFungibleToken@0.0.1 generate-typings /token
> abi-gen --abiGlob './build/contracts/*.json' --templates ./types/contract_templates --output ./types/generated

Found 7 ABI files
Processing: DetailedERC721...
Created: ./types/generated/detailed_e_r_c721.ts
Processing: ERC721...
Created: ./types/generated/erc721.ts
Processing: Migrations...
Created: ./types/generated/migrations.ts
Processing: MintableNonFungibleToken...
Created: ./types/generated/mintable_non_fungible_token.ts
Processing: NonFungibleToken...
Created: ./types/generated/non_fungible_token.ts
Processing: SafeMath...
Created: ./types/generated/safe_math.ts
Processing: TestMintableNFT...
Created: ./types/generated/test_mintable_n_f_t.ts

> NonFungibleToken@0.0.1 transpile /token
> rm -rf ./transpiled; copyfiles ./build/**/* ./transpiled; tsc

Using network 'development'.



  Contract: Non-Fungible Token
    Flags
      ✓ should expose implementsERC721 method
    General NFT Metadata
      ✓ should expose name variable (48ms)
      ✓ should expose symbol variable
    #totalSupply()
      ✓ should return 0 for initial supply
      ✓ should return correct current supply after each mint (181ms)
    #balanceOf()
      ✓ should return 1 for each owner's balance (74ms)
    #tokenOfOwnerByIndex()
      ✓ should return current token at index 0 for each user (38ms)
      ✓ should throw if called at index > balanceOf(owner) (41ms)
    #transfer()
      user transfers token he doesn't own
        ✓ should throw
      user transfers token that doesn't exist
        ✓ should throw
      user transfers token he owns
        ✓ should emit transfer log
        ✓ should belong to new owner
        ✓ should update owners' token balances correctly (81ms)
        ✓ should update owners' iterable token lists (128ms)
      user transfers token he no longer owns
        ✓ should throw
      user transfers token he owns to 0
        ✓ should throw
      user transfers token he owns to himself
        ✓ should emit transfer log
        ✓ should belong to same owner
        ✓ should maintain owners' token balances correctly (55ms)
        ✓ should not modify owners' iterable token lists (98ms)
      user transfers token with outstanding approval
        ✓ should emit approval clear log
        ✓ should emit transfer log
        ✓ should belong to new owner
        ✓ should update owners' token balances correctly (38ms)
        ✓ should update owners' iterable token lists (89ms)
    #approve()
      user approves transfer for token he doesn't own
        ✓ should throw
      user approves transfer for nonexistent token
        ✓ should throw
      user approves himself for transferring token he owns
        ✓ should throw
      user owns token
        user clears unset approval
          ✓ should NOT emit approval event
          ✓ should maintain cleared approval
        user sets new approval
          ✓ should return newly approved user as approved
          ✓ should emit approval log
        user changes token approval
          ✓ should return newly approved user as approved
          ✓ should emit approval log
        user reaffirms approval
          ✓ should return same approved user as approved
          ✓ should emit approval log
        user clears set approval
          ✓ should return newly approved user as approved
          ✓ should emit approval log
    #transferFrom()
      user transfers token from owner w/o approval...
        ✓ should throw
      user transfers non-existent token
        ✓ should throw
      user transfers token from owner w/ approval...
        ...from himself to himself
          ✓ should throw
        ...to null address
          ✓ should throw
        ...from other owner to himself
          ✓ should emit approval clear log
          ✓ should emit transfer log
          ✓ should belong to new owner
          ✓ should update owners' token balances correctly (43ms)
          ✓ should update owners' iterable token lists (92ms)


  47 passing (4s)

無事とおりました。

まとめ

ここまでで、無事ERC721のコードが動く環境が整いました。
次は実際に送金をしてみようと思います。

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならZaifがおすすめです。

特に国内でETHを購入するなら、アルトコインでも板取引に対応しているZaif(ザイフ)が割安なのでよいですよ。

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Ethereum(イーサリアム)
Ethereumの開発用ツールリストが公開されていた!

ALISのCTO石井さんがつぶやいてたんですが とてもありがたい #Ethereum 開発ツールの一 …

技術メモ
Counterpartyの環境構築が大変という話

暗号通貨の独自通貨を作ろうとするとEthereumが有名で簡単ですが、BitcoinでもCounte …

Ethereum(イーサリアム)
Web3.0 dApps Browser の Brave & BAT(Basic Attention Token)

以前話題になったWeb3.0 dAppsの例ですが web 2.0 Apps -> web 3 …