Posted at

Ethereum[CryptoZombies][ハッシュ関数・キャスト・イベント]


ハッシュ関数

ランダムにuintで返すハッシュ関数にkeccak256があります。

ハッシュ関数は基本的には、文字列をランダムな256ビットの16進数にマッピングします。


型キャスト

場合によっては、データ型を変更する必要があるときがあります。


contract.sol

uint8 a = 5;

uint b = 6;
// a * b はuint8ではなくuintで返すので、エラーになります
uint8 c = a * b;
// 正しく動作させるために、bをuint8に型キャストさせます
uint8 c = a * uint8(b);

この例ではa * bはuintを返し、uint8で格納しようとしているので、問題が発生することになります。

uint8にキャストすることで、正常に動作する上にコンパイラもエラーを吐き出すことがなくなります。


イベント

Eventは、ブロックチェーンで何かが生じたときに、コントラクトがアプリのフロントエンドに伝えることができるものです。しかも特定のイベントを'listening'状態(接続待ち)にして、何かあった時にアクションを起こすこともできます。


contract.sol

// イベントの宣言

event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
uint result = _x + _y;
// 関数が呼ばれたことをアプリに伝えるためにイベントを発生させる:
IntegersAdded(_x, _y, result);
return result;
}


アプリのフロントエンドをlistening状態にできる。JavaScriptで実装すると次のように書けます。


example.sol

YourContract.IntegersAdded(function(error, result) { 

// 結果について何らかの処理をする
}


Web3.js

イーサリアムにはWeb3.jsというJavascriptライブラリがあります。

Web3.jsがどういう風にコントラクトとやり取りするのか、サンプルコードを以下に書きます。


// これがコントラクトにアクセス:
var abi = /* abi generated by the compiler */
var ZombieFactoryContract = web3.eth.contract(abi)
var contractAddress = /* our contract address on Ethereum after deploying */
var ZombieFactory = ZombieFactoryContract.at(contractAddress)
// ZombieFactoryはコントラクトのpublic関数とイベントにアクセスできる。

// 入力テキストを取得するイベント
$("#ourButton").click(function(e) {
var name = $("#nameInput").val()
// createRandomZombie関数を呼び出す部分
ZombieFactory.createRandomZombie(name)
})

// NewZombieイベントをlisteningしてUIを更新
var event = ZombieFactory.NewZombie(function(error, result) {
if (error) return
generateZombie(result.zombieId, result.name, result.dna)
})

// ゾンビのdnaを取得して画像を更新
function generateZombie(id, name, dna) {
let dnaStr = String(dna)
// 16桁未満の場合はDNAの先頭に0をつける
while (dnaStr.length < 16)
dnaStr = "0" + dnaStr

let zombieDetails = {
// 最初の2桁は頭の部分だ。頭部は7種類用意してあるから、% 7して
// 0から6の番号を取得したら、そこに1を足して1から7にする。
// これを基にして、"head1.png" から"head7.png"までの
// 画像ファイルを用意する
headChoice: dnaStr.substring(0, 2) % 7 + 1,
// 次の2桁は目の部分だ。11種類用意してあるぞ:
eyeChoice: dnaStr.substring(2, 4) % 11 + 1,
// シャツの部分は6種類用意してある:
shirtChoice: dnaStr.substring(4, 6) % 6 + 1,
// 最後の6桁は色の部分だ。 CSSのフィルタを使用して更新できる。
// 360度の色相回転(hue-rotate)を使う
skinColorChoice: parseInt(dnaStr.substring(6, 8) / 100 * 360),
eyeColorChoice: parseInt(dnaStr.substring(8, 10) / 100 * 360),
clothesColorChoice: parseInt(dnaStr.substring(10, 12) / 100 * 360),
zombieName: name,
zombieDescription: "A Level 1 CryptoZombie",
}
return zombieDetails
}

以上です。