シンタックスの簡約化
TruffleのマイグレーションによるアドレスとコントラクトのABIで、インスタンスを作成し、それによってシンタックスが関数の処理をより簡単にできるようにします。そのためにはこれをデプロイした後、次のコードを記入します:
1 2 |
truffle(rsk)> var cfToken = web3.eth.contract(CoinFabrikToken.abi).at(CoinFabrikToken.address) |
コントラクトがすでにデプロイされており、そのアドレスとABIが分かっている場合は下のコードを入力してください:
1 2 |
truffle(rsk)> var cfToken = web3.eth.contract(‘Contract_ABI’).at(‘Contract_ADDRESS’) |
Contract_ABIは圧縮されたインラインABIであり、Contract_ADDRESSの説明は不要です。
前に作成した2つのアカウントを、見やすくするために名前を変更しましょう。
1 2 3 |
truffle(rsk)> var acc0 = web3.eth.accounts[0] truffle(rsk)> var acc1 = web3.eth.accounts[1] |
acc0 がコントラクトをデプロイしたものです。truffle.jsとnode.confのコンフィグファイルにAcc0が追加されました。
オーナーシップコントロール
すでに言及したライブラリを使用しているコントラクトのオーナーシップ機能をテストしてみましょう。
任意のアカウントからgetON関数をコールすると、パブリックでありオーナーシップ問題がない場合、このように表示されます。
1 2 3 |
truffle(rsk)> cfToken.getON() '' |
これで、setON関数がオーナーシッププロパティを持つことになります。別のアカウントから生成されたトランザクションがすべて却下されることになります。例えば、acc1から自分の名前でコントラクトに署名しようとしても、数値を変えることはできません。
1 2 3 |
truffle(rsk)> cfToken.setON('Andres Bachfischer', {from: acc1}) 0x5f115190b60238240bedf36d1c5bb69a443a0f8ee971b0fc40fe5ca9c727d47c |
トランザクションのハッシュでは、戻り値がオフであり、関数が正しく実行されていないことを見ることができます。getON関数をもう一度コールし、変数の値が変わっていないことを確認します。
今度はオーナーアカウントのacc0から先ほどと同じトランザクションを署名してみましょう。「0x01」の状態を取得し関数が正しく実行されています。
1 2 3 |
truffle(rsk)> cfToken.setON('Andres Bachfischer', {from: acc0}) 0x0c894fa7e5369573fb14addeaed4cd9d5b6cd1425cb4eeeae16cb4e1fa8e0364 |
getON関数をもう一度コールし、オーナーシップライブラリが思った通りに機能しているのを確認します。
1 2 |
truffle(rsk)> cfToken.getON() |
Ownable.solには、コントラクトのオーナーを別のアドレスに変更できる機能もあります。ここでは使用しませんが、使用法は次の通りです。
1 2 |
truffle(rsk)> cfToken.transferOwnership(acc1, {from: acc0}) |
これによって、acc1 がコントラクトの新たなオーナーになります。
今度はトークンの方に移りましょう。
トークンオペレーション
まず最初に、トークンの残高がコントラクト作成時に正しく割り当てられたかどうかを確認しましょう。
それぞれのアカウントの残高は次のように確認します。
1 2 3 |
web3.fromWei(cfToken.balanceOf(acc0).toString(10)) // = ‘1000’ web3.fromWei(cfToken.balanceOf(acc1).toString(10)) // = ‘0’ |
したがって、すべてのトークンが最初のアカウントに正しく割り当てれたことがわかります。
最初に行うトランザクションは、いくらかのトークンを2番目のアカウントである、acc1に3回ほど転送することです。
最初のトランザクションは次の手順に従います。
1 2 3 |
truffle(rsk)> cfToken.transfer(acc1, web3.toWei(88.8), {from: acc0}) 0xd45437b777f1430e7cec57bd80b261ce8f87bf8a3f9a113fecd20563403c4d9c |
1 2 3 |
truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc0).toString(10)) // = '733.6' truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc1).toString(10)) // = '266.4' |
デプロイアカウントから取得したトークンは、acc1We seで受け取ったトークン量と同じであることがわかります。
StandardTokenコントラクトでは、特定のアカウント(この場合acc1)に代わってトークンを使用するための許可権限も取得します。権限の取得前にこれを行うと、トランザクションは処理されません (status ‘0x00’)。
1 2 3 |
truffle(rsk)> cfToken.transferFrom(acc1, acc0, web3.toWei(5), {from: acc0}) 0x5cee7cf60849283a0088d71483a606ba2101b500e13f972abada4f75781596bf |
acc0がacc1からの送信を許可されていないことを確認した後、
1 2 |
truffle(rsk)> web3.fromWei(cfToken.allowance(acc1, acc0, {from: acc0}).toString(10)) // = '0' |
acc1が生成したトランザクションから、acc0がacc1の名前で10個のトークンを使用することを許可します。
1 2 3 |
truffle(rsk)> cfToken.approve(acc0, web3.toWei(10), {from: acc1}) 0x6e1a202f4ca7f43dfb28034952d54a572993b986a55857790aa51854afbc1fb4 |
アウトプットのログで、関数がtrueで正常に完了したことがわかります。ロクには、acc0による利用が許可されている額が表示されます。
1 2 |
truffle(rsk)> web3.fromWei(cfToken.allowance(acc1, acc0, {from: acc0}).toString(10)) // = '10' |
使用トランザクションをもう一度実行してみると、
1 2 3 |
truffle(rsk)> cfToken.transferFrom(acc1, acc0, web3.toWei(5), {from: acc0}) 0x41f750eabb6e0d3ab576aac0333b0d337ca61808aae1eeafa9d8e2a0b81b979b |
status ‘0x01’でトランザクションが成功します。
残高をもう一度確認しましょう。
1 2 3 |
truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc0).toString(10)) // = '738.6' truffle(rsk)> web3.fromWei(cfToken.balanceOf(acc1).toString(10)) // = '261.4' |
最後に、利用できない関数をコールするトランザクションに署名すると、フォールバックバック関数がコールされます。次のようにトランザクションに署名します。
1 2 3 |
truffle(rsk)> web3.eth.sendTransaction({from: acc0, to: cfToken.address}) 0x4106a287fc60669bf9682a73ec4c457b094c086ec7408a5dea95d200688c4ee9 |
データが16進数の文字列「Error 404: Function not found」を示すログをリターンします。
(‘0x00…00204572726f72203430343a2046756e6374696f6e206e6f7420666f756e64203a50’).
最後の関数は自殺関数ですが、明らかな理由で実行しません。トランザクションを表示するためには、コントラクトが破棄されないようにする必要があるからです。
1 2 |
truffle(rsk)> cfToken.destroy({from: acc0}) |
さらなる詳細はこちらを参照してください。