기존의 Random Function

  • 기존의 randomness creation function은 semi-random이다. 그래서 keccak256에 msg.sender, block.difficulty, block.timestamp를 넣어서 돌리는데 각 parameter별 문제는 다음과 같다
    • msg.sender: sender가 알고 있다
    • block.difficulty: miner의 영향을 받아 결정된다
    • block.timestmapl: 유추 가능하다(predictable)
  • 그래서 사용하는 것이 VRF, (Chainlink) Verifiable Randomness Function이다

VRF

  • VRF: Verifiable Randomness Function
    • off-chain API를 따오는 경우 single point of failure가 발생한다
    • 그러니까 cryptographic manner에서 추출할 수 있는 randomness를 따르자

Basic Request Model

  • original contract에서 oracle node에게 contract를 요청하는 것은 1개의 tx에서 실행된다
  • oracle node(contract)에서 실행된 결과를 original contract에 반환하는 것은 또 다른 1개의 tx에서 실행된다
  • 따라서 2 tx architecture를 이루게 되며, randomness에 대한 brute force attack은 무의미해진다.
  • 동작 순서
    • Callee contract가 1개의 tx에서 request를 실행시킨다
    • Callee contract가 event를 발생시킨다
    • Chainlink node(Off-chain)이 해당 event를 listen한다
    • Cahinlink node에 의해 생성된 tx에서 callee contract에 언급된 function에게 on-chain data를 반환한다