### contractでの宣言
pragma solidity ^0.4.19; contract ZombieFactory { uint dnaDigits = 16; }
uintは符号なし256ビットinteger(正のみ)、uint8、uint16、 uint32などもある
### 構造体
contract ZombieFactory { uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; struct Zombie { string name; uint dna; } }
### 配列
solidityには固定長配列と可変長配列がある
uint[2] fixedArray; string[5] stringArray; uint[] dynamicArray; ``` publicな配列にすれば、他のコントラクトもこの配列を読める ``` contract ZombieFactory { uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; struct Zombie { string name; uint dna; } Zonbie[] public zombies; }
### 関数
function eatHumburgers(string _name, uint _amount) { } eatHamburgers("vitalink", 100)
実例
function createZombie(string _name, uint _dna){ }
### 新しい構造体
Person satoshi = Person(20, "Satoshi"); people.push(satoshi) people.push(Person(15, "akemi"));
関数の中に書く
function createZombie(string _name, uint _dna) { // ここから始めるのだ zombies.push(Zombie(_name, _dna)); }
### Private/Public
publicの関数は誰でもコントラクトの関数を呼び出して実行できる
以下の様に書くと、contract内の他の関数からのみ読み出せる
uint[] numbers; function _addToArray(uint _number) private { numbers.push(_number); }
privateの関数はアンダーバー(_)で始めるのが通例
function _createZombie(string _name, uint _dna) private { zombies.push(Zombie(_name, _dna)); }
### 関数の戻り値
string greeting = "what's up dog"; function sayHello() public returns (string) { return greeting; }
関数で変更するにはviewを使う
function sayHello() public view returns (string) { return greeting; }
テスト
function _generateRandomDna(string _str) private view returns(uint){ }
### Keccak256
ランダムな256ビットの16進数
function _generateRandomDna(string _str) private view returns (uint) { uint rand = uint(keccak256(_str)); return rand % dnaModulus; }
### 統合
function createRandomZombie(string _name) public { uint randDna = _generateRandomDna(_name); _createZombie(_name, randDna); }
### event
ブロックチェーンで何かが生じた時にフロントエンドに伝えることができる
何かあったときにアクションを実行する
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; }
js側
YourContract.IntegersAdded(function(error, result) { // 結果について何らかの処理をする })
テスト
event NewZombie(uint zombieId, string name, uint dna); function _createZombie(string _name, uint _dna) private { uint id = zombies.push(Zombie(_name, _dna)) - 1; NewZombie(id, _name, _dna); }
### フロントエンド
var abi = "" var ZombieFactoryContract = web3.eth.contract(abi) var ZombieFactory = ZombieFactoryContract.at(contractAddress) #("ourButton").click(function(e) { var name = $("#nameInput").val() ZombieFactory.createRandomZombie(name) }) var event = ZombieFactory.NewZombie(function(error, result){ if(error) return generateZombie(result.zombieId, result.name, result.dna) }) function generateZombie(id, name, dna){ let dnaStr = String(dna) while(dnaStr.length < 16) dnaStr = "0" + dnaStr let zombieDetails = { headChoice: dnaStr.substring(0, 2) % 7 + 1, eyeChoice: dnaStr.substring(2, 4) % 11 + 1, shirtChoice: dnaStr.substring(4, 6) % 6 + 1, 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 }
なるほど、ゾンビとかふざけ気味だが、中々のものだな