
KittyCore 컨트랙트를 requestable 하도록 변경하기 위해서는 다음과같은 기능들이 필요합니다.
1. Pseudo-random Kitty ID as uint256
자식 키티의 ID는 auto-incrementing sequence 입니다. 따라서 자식 체인과 부모 체인에서 동시에 생성된 키티는 동일한 ID를 가지는 충돌이 발생할 수 있기에 키티의 유전자 정보, 부모 키티의 ID 등을 이용해 unique ID를 부여할 필요가 있습니다.
2. uint256 for matronId, sireId, siringWithId for Kitty struct
KittyCore의 Kitty 구조체는 부모 키티의 ID를 uint32 자료형으로 저장합니다. 생성 가능한 키티의 갯수가 32 비트를 초과하지 않는다는 가정과 auto-incrementing id를 이용할 경우 Kitty 구조체를 최적할 수 있기 때문입니다. 하지만 Pseudo-random Kitty ID as uint256을 적용할 경우 키티의 ID가 uint32 자료형으로 표현될 수 없기 때문에마찬가지로 Kitty.matronId, Kitty.sireId, Kitty. siringWithId 또한 uint256 자료형으로 변경이 필요합니다.
3. Randomness for Child Kitty Gene
GeneScience.mixGene(uint256 _genes1, uint256 _genes2, uint256 _targetBlock) 함수는 특정 이더리움 블록(_targetBlock) 해시에서 랜덤성을 가져옵니다. _targetBlock는 matron의 cooldownBlock-1 으로 지정되는데, 해당 이더리움 블록 해시를 플라즈마에서도 사용할 수 있어야 합니다.
따라서 부모 블록 해시를 사용하는 기존 로직을 그대로 활용한다면, 별도의 이더리움 블록 해시를 자식 체인으로 복사하는 기능이 필요합니다. 부모 블록 해시는 여러 Requestable 컨트랙트에서 공통적으로 사용될 여지가 있기 때문에 Plasma EVM의 내부 프로토콜에서 구현되는 것이 바람직합니다.
GeneScience.mixGene함수는 부모 체인에서는 BLOCKHASH opcode를 사용하고 자식 체인에서는 다른 컨트랙트에서 부모 블록 해시를 읽어오도록 수정이 필요합니다. 따라서 pure하지 않고 특정 컨트랙트를 읽어야하는 view 함수가 되어야 합니다.
4. withdrawBalance() with specific amount
pregnantKitties * autoBirthFee만큼의 이더를 항상 KittyCore 컨트랙트가 보유하고 있어야하기 때문에 경매 수수료로 생긴 이익금을 전액 출금한다면 다른 체인에서 임신한 키티가 request를 통해 이동하였을 때 autoBirthFee를 지불하지 못할 수 있습니다.
CFO가 withdrawBalance() 함수를 통해 가능한 모든 금액을 인출할 경우 따라서 CFO는 부모체인과 자식체인의 모든 임신한 키티의 수를 고려하여 인출할 금액을 지정해야 합니다.
Published at Tue, 14 May 2019 06:26:43 +0000