LoginSignup
2
0

More than 5 years have passed since last update.

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

Posted at

ハッシュ関数

ランダムに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
}

以上です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0