ERC721のサンプルコード上を使ってデータを譲渡してみる

Dapps

前回の記事からの続きです。

テストまで前回通したので、いよいよ送金をやってみます。

Sponsored Link


送金準備

rpcサーバーを動かしておきます。

# npm run testrpc

別ターミナルでmigrateしてソースをデプロイしておきます。

# npm run migrate

コンソール上で動作確認

package.json を少し修正して truffle console を動かせるようにします。

{
  "name": "NonFungibleToken",
  "version": "0.0.1",
  "description": "A generic implementation of the ERC721 Standard for non-fungible tokens",
  "scripts": {
	:
	"console": "truffle console"   ←================= 追加
  },

そしてconsoleから色々試してみます。

トークン定義

migrateファイルを1つ追加しました。

3_deploy_token.ts

const TestMintableNFT = artifacts.require("TestMintableNFT");

module.exports = (deployer: any) => {
    deployer.deploy(TestMintableNFT, "Example NFT", "NFT");
};

TestMintableNFTというテスト用のコントラクトがあるのですがこちらを使用します。

その後再度、 npm run migrate してdeployしておきます。

独自トークン作成

truffleコンソールからトークンにアクセスしてみます。

# npm run console
truffle(development)> myToken = TestMintableNFT.at(TestMintableNFT.address)
TruffleContract {
  constructor:
   { [Function: TruffleContract]
     _static_methods:
      { setProvider: [Function: setProvider],
 :
 :
truffle(development)> myToken.name()
'Example NFT'

これで名前まで表示できたので、しっかりdeployされていることが確認できました。

特定アドレスにトークンを付与

アドレスを取得します。ちなみに取得するアドレスは testrpc コマンド実行時にテスト用アドレスが自動的に作成されています。

truffle(development)> account1 = web3.eth.accounts[1]
'0x1b52605231a6e4f52ccc76dd28353cddd7f96d44'

https://github.com/dharmaprotocol/NonFungibleToken/blob/master/contracts/MintableNonFungibleToken.sol#L23

上記ソースにあるmintメソッドを使用して、トークンを作成します。
以下コンソールでは account1 に トークンID:0 のトークンを作成しています。

truffle(development)> myToken.mint(account1, 0)
{ tx: '0x83f21ed5cf75a74d6ce6815929cb044096f252f7eec8d061a134d8b53da9c4b1',
  receipt:
   { transactionHash: '0x83f21ed5cf75a74d6ce6815929cb044096f252f7eec8d061a134d8b53da9c4b1',
     transactionIndex: 0,
     blockHash: '0xa86f7d149788aa913eb2833eefb3830d2a491e0fecd78b4d117e80ab3a85a6e6',
     blockNumber: 6,
     gasUsed: 97007,
     cumulativeGasUsed: 97007,
     contractAddress: null,
     logs: [ [Object] ],
     status: 1 },
  logs:
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0x83f21ed5cf75a74d6ce6815929cb044096f252f7eec8d061a134d8b53da9c4b1',
       blockHash: '0xa86f7d149788aa913eb2833eefb3830d2a491e0fecd78b4d117e80ab3a85a6e6',
       blockNumber: 6,
       address: '0x90859fdba4e9d35aeaa042285fabfff4563fb42c',
       type: 'mined',
       event: 'Mint',
       args: [Object] } ] }

これで特定のアドレスにトークンが割り当てられているはずです。
確認をするためにERC721で定義されている tokenOfOwnerByIndex を使います。

truffle(development)> myToken.tokenOfOwnerByIndex(account1, 0)
BigNumber { s: 1, e: 0, c: [ 0 ] }

ちゃんと結果がかえってきました。cの部分がトークンIDです。ここでは0ですね。

おなじトークンIDを付与しようとすると、、、

truffle(development)> myToken.mint(account1, 0)
Error: VM Exception while processing transaction: revert
    at XMLHttpRequest._onHttpResponseEnd (/token/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
    at XMLHttpRequest._setReadyState (/token/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
    at XMLHttpRequestEventTarget.dispatchEvent (/token/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
    at XMLHttpRequest.request.onreadystatechange (/token/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
    at /token/node_modules/truffle/build/webpack:/~/truffle-provider/wrapper.js:134:1
    at /token/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
    at Object.InvalidResponse (/token/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)

こちら実行できないことがわかります。

特定アドレス同しでトークン譲渡

今度は特定のアドレス同しでトークンを譲渡してみようと思います。
アドレス1のトークンID:0のトークンをアドレス2に譲渡します。

ここでは transfer(address _to, uint _tokenId)メソッドを使います。
このメソッドはトークンの保有者がこのメソッドを使わないと、トークンが譲渡できないので { from: } を使います。

truffle(development)> myToken.transfer(account2, 0, { from: account1 })
{ tx: '0xa727f05f7d38d6476dd9fca42fe4218efbe3a88653efda2dc9266d6d4113fa83',
  receipt:
   { transactionHash: '0xa727f05f7d38d6476dd9fca42fe4218efbe3a88653efda2dc9266d6d4113fa83',
     transactionIndex: 0,
     blockHash: '0xe128539ee612191807d9f4387964874037df862387de1635b38eb76d760bb7d4',
     blockNumber: 18,
     gasUsed: 82797,
     cumulativeGasUsed: 82797,
     contractAddress: null,
     logs: [ [Object], [Object] ],
     status: 1 },
  logs:
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0xa727f05f7d38d6476dd9fca42fe4218efbe3a88653efda2dc9266d6d4113fa83',
       blockHash: '0xe128539ee612191807d9f4387964874037df862387de1635b38eb76d760bb7d4',
       blockNumber: 18,
       address: '0x90859fdba4e9d35aeaa042285fabfff4563fb42c',
       type: 'mined',
       event: 'Approval',
       args: [Object] },
     { logIndex: 1,
       transactionIndex: 0,
       transactionHash: '0xa727f05f7d38d6476dd9fca42fe4218efbe3a88653efda2dc9266d6d4113fa83',
       blockHash: '0xe128539ee612191807d9f4387964874037df862387de1635b38eb76d760bb7d4',
       blockNumber: 18,
       address: '0x90859fdba4e9d35aeaa042285fabfff4563fb42c',
       type: 'mined',
       event: 'Transfer',
       args: [Object] } ] }

これでトークンの譲渡ができたので確認をすると、以下のようにcの値が0なのでトークンID:0がaccount2の所有にかわりました。
* 以下メソッドで3番目のトークン指定していますが、テストでいくつかトークンを譲渡していたためです。

truffle(development)> myToken.tokenOfOwnerByIndex(account2, 3)
BigNumber { s: 1, e: 0, c: [ 0 ] }

account1が所持しているトークンを全て調べると

truffle(development)> myToken.tokenOfOwnerByIndex(account1, 0)
BigNumber { s: 1, e: 2, c: [ 101 ] }
truffle(development)> myToken.tokenOfOwnerByIndex(account1, 1)
BigNumber { s: 1, e: 0, c: [ 1 ] }
truffle(development)> myToken.tokenOfOwnerByIndex(account1, 2)
BigNumber { s: 1, e: 2, c: [ 100 ] }
truffle(development)> myToken.tokenOfOwnerByIndex(account1, 3)
Error: VM Exception while processing transaction: invalid opcode
    at XMLHttpRequest._onHttpResponseEnd (/token/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
    at XMLHttpRequest._setReadyState (/token/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
    at XMLHttpRequestEventTarget.dispatchEvent (/token/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
    at XMLHttpRequest.request.onreadystatechange (/token/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
    at /token/node_modules/truffle/build/webpack:/~/truffle-provider/wrapper.js:134:1
    at /token/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
    at Object.InvalidResponse (/token/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)

のように、1, 100, 101のトークンIDしか保持していないことがわかります。3番目のindexを指定した時点でエラーがでたのでこれ以上トークン保持していないためです。

トークンに固有の情報を埋め込む

これやろうと思ったんですが
tokenMetadata
の実装が、こちらのサンプルにもなく結構時間がかかりそうなのでまた別途調べようと思います。

まとめ

今回は、ERC721のトークンの生成、譲渡までの簡単な流れをおってみました。
あとは、トークン固有の情報をトークンに混ぜ込めれば、いよいよERC721のサイトでも作ろうと思います。

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

コメントを残す

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

CAPTCHA


仮想通貨全般
TendermintをDocker使って起動してみる

以前、勉強会に行ってきた際にTendermintの事を聞いて ブロックチェーンプロトコルが実装できる …

仮想通貨全般
Bitcoinのdifficultyを決めるnBitsを理解する

マイニングする際の理解を深めようと思い、マイニング難易度(difficulty)を決めるnBitsに …

仮想通貨全般
EOS Night Meetupにいってきた

今回は、以前からEOSに興味があったので EOS Night Meetupにいってきました。 暗号通 …