[シナリオゾンビゲーム]-ゾンビ工場を作る

42090 ワード

クリプトンゾンビゲーム:https://cryptozombies.io/ko/
1.ゾンビ工場を作る
完全なコード
pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        NewZombie(id, _name, _dna);
    }

    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);
    }

}

コード解釈
1.1契約
pragma solidity ^0.4.19;
// 모든 솔리디리 코드는 pragma solidity '버전' 으로 시작함.
// solidity는 버전업이 빨라 버전을 함께 명시해 줌으로써 추후에 
					// 버전업이 맞지 않아 발생하는 오류를 줄여줌.
// 즉 쓰여진 솔리디티 언어를 어떤 버전으로 컴파일 할 것인지에 대한 명시.

contract ZombieFactory{
// ZombieFactory 컨트랙트를 생성한다는 의미
// 솔리디티 코드는 컨트랙트 안에 담김.
// 클래스와 비슷한 개념.

}
コンパイルとは?
   コンピュータで理解できるプログラミング言語で書かれたコード.   げんごへんかん
1.2状態変数&整数
pragma solidity ^0.4.19;

contract ZombieFactory{
  uint dnaDigits = 16;
  // 부호없는정수의 자료형인 uint로 dnaDigits를 선언하고 16이라는 값을 저장.
  // uint -> 부호없는 정수의 자료형 즉 값이 음수가 아니어야 함
  // int -> 부호있는 정수의 자료형
}
ステータス変数?       --- state variable ---
  契約リポジトリに永続的に保存されます.
  これは、イーサブロックチェーンに永遠に格納されるコンテンツを意味する.
1.3数学演算
pragma solidity ^0.4.19;

contract ZombieFactory{
	uint dnaDigits = 16;
  	uint dnaModulus = 10 ** dnaDigits;
  // uint형으로 dnaModules 변수를 생성하고 10의 danDigits 승을 값으로 담음.
}
solidity数学演算子
--加算:+
--減算:-
--乗数:*
--分割:/
--残り:%
--平方:**
1.四構造体
pragma solidity ^0.4.19;

contract ZombieFactory{
	uint dnaDigits = 16;
  	uint dnaModulus = 10 ** dnaDigits;
  
  	struct Zombie{
      // Zombie라는 구조체 생성
      // 구조체 생성시에는 struct '변수명'
    	      string name;
      	      uint dna;
      	     // Zombie구조체는 string형의 name과 uint형의 dna 두가지 특성을 가짐.
    }
}
構造体         --- struct type ---
  ユーザー定義のタイプで、異なるタイプの変数を組み合わせます.
1.5シナリオ(静的/動的)
pragma solidity ^0.4.19;

contract ZombieFactory{
    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;
    
    struct Zombie{
    	string name;
        uint dna;
    }
}
1.5-1静的アレイ
:アレイサイズが固定され、メモリを節約するために固定サイズのメモリ領域のみが割り当てられます.
--アレイ宣言時の固定サイズ
uint[2] fixedArray
// 정적배열에서는 배열안에 준 원소값 만큼의 원소만 가짐.
1.5-2ダイナミックアレイ
:配列のサイズが不明です.
--実行時に配列のサイズを決定します.
uint dynamicArray
// 배열내 원소 수의 제약 없이 원소를 자유롭게 가짐. 
***構造体アレイの作成も可能
Zombie[] zombies;
pragma solidity ^0.4.19;

contract ZombieFactory{
   uint dnaDigits = 16;
   uint dnaModulus = 10 ** dnaDigits;
  
   struct Zomble {
      string name;
      uint dna;
   }
  
   Zombie[] public zombies;
  // Zombie 구조체의 배열을 public으로 선언후 이름을 zombies로 함. 
}
***publicと宣言された場合、getter関数が自動的に作成されます.
  • getter   :
  • let MyMeMine = {
    	name:'mihee',
        age:26,
        get I(){
        	return `이름 : ${this.name} 나이 : ${this.age}`
        }
    }
    // console.log(MyMeMine.I)   // 이름 : mihee 나이 : 26
  • setter
  • 1.6関数宣言
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
    	uint dnaDigits = 16;
      	uint dnaModulus = 10 ** dnaDigits;
      
      	struct Zombie {
        	    string name;
          	    uint dna;
        }
      	Zombie[] public zombies;
      
      	function createZombie(string _name, uint _dna) {
        // string형의 _name과 uint형의 _dna 두 인자를 받는 createZombie함수
        }
    } 
    1.7構造体と配列の利用
    pragma solidity  ^0.4.19;
    
    contract ZombieFactory{
    	uint dnaDigits = 16;
      	uint dnaModulus = 10 ** dnaDigits;
      
      	struct Zombie {
        	    string name;
          	    uint dna;
        }
      	Zombie[] public zombies;
      
      	function createZombie(string _name,uint _dna) {
        	zombies.push(Zombie(_name,_dna));
            // createZombie 함수를 만들고, 
            // 함수내용으로 동적배열인 zombies에 인자값인 
            			//_name과 _dna을 통해 구조체 Zombie를 새롭게 생성
        }
    }
    1.8 private/public関数
    **エンティティでは、関数は基本的に共通として宣言されます.
    pragma solidity ^0.4.19;
    
    contract ZombieFactory{
    	uint dnaDigits = 16;
        uint dnamodulus = 10 ** dnaDigits;
        
        struct Zombie{
        	string name;
            uint dna;
        }
        Zombie[] public zombies;
        
        function _createZombie(string _name, uint _dna) private {
         	zombies.push(Zombie(_name,_dna));
            // private으로 선언하는 함수명은 _로 시작하는 것이 관례.
        }
    }
    アクセス制御者
  • private
    :契約の範囲内でのみ使用できます.
  • public
    :見積書から呼び出すことも、他の見積書から呼び出すこともできます.
  • 1.9関数の戻り値/関数コントロール
    pragma solidity ^0.4.19;
    
    contract ZombieFactory{
    	uint dnaDigits = 16;
      	uint dnaModulus = 10 ** dnaDigits;
      
      	struct Zombie {
        	    uint name;
          	    uint dna;
        	}
      	Zombie[] public zombies;
      
      	function _createZombie(string _name, uint _dna) private{
          		zombies.push(Zombie(_name,_dna);
        	}
      	function _generateRandomDna(string _str) private view returns(uint){
        	// _generateRandomDna함수는 uint형 값을 반환함.
          	// view로 선언
            }
    }
    関数の戻り値
    :戻り値を持つ関数について、戻り値を指定し、戻り値の後に(資料型)、戻り値を加算します.
    function sayHello() public returns (string){
    	return "Hello"
      	// 주의!! 함수 선언에서 선언하는 것은 return이 아닌 returns이다.
      	// sayHello함수는 string형태의 값을 반환하여줌
    }
    関数の制御者
  • view
    :他のデータにアクセスし、ステータスを変更せずに既存のデータのみを読み込みます.=>>
  • string greeting = "what's up dog";
    function sayHello() public view returns (string) {
    	return greeting;
      // sayHello함수에서 string형태의 greeting데이터에 접근,
      // 해당 데이터의 상태 변화없이 그대로 읽고 데이터를 반환함.
    }
  • pure
    :データを読み込んだり変更したりせず、他の見積書のデータにもアクセスしません.=>>パラメータ値を純粋に使用します.
    //パラメータ値を受け入れ、パラメータ値を使用して値
  • を返します.
    function _multply(uint a, uint b) private pure returns (uint) {
    	return a * b;
      // 다른 데이터를 받는 것 없이 인자값만을 받아 이용하여 반환.
    }
    **viewとpureは警告メッセージで区別できます.
    1.10 Keccak 256と変換
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
      uint dnaDigits = 16;
      uint dnaModulus = 10 ** dnaModulus;
      
      struct Zombie {
      	string name;
            uint dna;
      }
      
      Zombie[] public zombies;
      
      function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
      }
      function _generateRandomDna(string _str) private view returns (uint) {
      	uint rand = uint(keccak256(_str));
        	return rand % dnamodulus;
        // _str을 솔리디티의 내장해시함수인 keccak256함수를 이용하여 난수를 생성하고
        // 생성된 난수를 uint형으로 변환하고 이를 다시 uint형 rand에 담음
        // rand에 담아진 결과값에 % dnamodulus 하여 return함
      }
    }
    keccak256()
    :イーサネット内蔵ハッシュ関数、ランダム生成関数
    せいけいかん
    :変換するデータ型を指定し、変換する値を()に配置します.
    uint8 a = 5;
    uint b = 6;
    // 위의 a와 b는 현재 자료형이 같지 않아서 연산에 함께 이용할 경우 오류 유발
    // 그러므로 형 변환 필요
    uint c = a * uint8(b);
    // uint형인 b를 uint8로 감싸서 형변환시킴.
    1.11活動
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
      event NewZombie(uint zombieId, string name, uint dna);
      //이벤트 선언
      // 이벤트 => 내가 생성한 컨트랙트가 블록체인 상에서 앱의 사용자 단에서 액션이
      //          발생하면 의사소통하는 방법.
      
      uint dnaDigits = 16;
      uint dnaModulus = 10 ** dnaDigits;
      
      struct Zombie {
      	string name;
        	uint dna;
      }
      
      zombie[] public zombies;
      
      function _createZombie(string _name, uint _dna) private {
       	uint id = zombies.push(Zombie(_name, _dna)) - 1;
        	NewZombie(id, _name, _dna);
        //이벤트가 실행되는 부분
      }
      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, rnaDna)
      }
    
    }
    
    ≪イベント|Events|ldap≫
    :特定の条件を満たす場合、予めプログラミングされた特定の機能を実行します.
    //イベントはフロントエンドに関連付けられ、特定の条件を満たすと、出力結果はフロントエンドに対応するコンテンツと一致します.
    // 프론트단 코드 예시)
    myContract.NewZombie(function(error,result)=>{
       // 사전에 명시된 조건이 충족된 경우 발생할 이벤트내용
    })
    1. 12 web3
    :完了したコンテンツとインタラクティブなJavaScriptコードを簡単に作成できるライブラリです.
    //web 3の詳細…!!!
    // 아래의 코드는 해당 cryptozombies사이트에서 완전히 복사 붙여넣기 한 내용
    // 아직 온전히 이해는 하지 못했음
    // 나중에 이해를 돕기 위한 참고용
    var ZombieFactoryContract = web3.eth.contract(abi)
    var contractAddress = /* 배포된 이후 컨트랙트 주소 */
    var ZombieFactory = ZombieFactoryContract.at(contractAddress)
    // `ZombieFactory`는 우리 컨트랙트의 public 함수와 이벤트에 접근할 수 있다.
    
    // 일종의 이벤트 리스너가 텍스트 입력값을 취한다:
    $("#ourButton").click(function(e) {
      var name = $("#nameInput").val()
      // 우리 컨트랙트의 `createRandomZombie`함수를 호출한다:
      ZombieFactory.createRandomZombie(name)
      // createRandomZombie함수 안에는 _createZombie() 함수가 존재
    })
    
    // `NewZombie` 이벤트가 발생하면 사용자 인터페이스를 업데이트한다
    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)
      // DNA 값이 16자리 수보다 작은 경우 앞 자리를 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자리는 색깔을 결정하며, 360도(degree)까지 지원하는 
        //CSS의 "filter: 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
    }