Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ハッシュ関数

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

以上です。

kagami-r0927
都内に住む大学生 機械学習/業務効率化/フロント/バックエンドに興味があります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away