1/12 오후. 난수 만드는 법, Event emit

심재원·2024년 1월 12일
1

블록체인의 난수

솔리디티에서 난수 만드는 게 되게 어려움

난수는 비결정론적인데 그걸 해내기 위한 자원이 부족했음
최대한 탈중앙화스럽게 기능은 충족하게끔 도와주곤 했다 but 오라클 문제

Chainlink : 블록체인 안에서 난수를 만들게끔 도와줌

체인링크 VRF: 온체인에서 검증가능한 무작위성 (랜덤 펑션)

https://blog.chain.link/verifiable-random-functions-vrf-random-number-generation-rng-feature-korean/

1. 웹드 실시간 정보 받아오기

웹드 ether
https://etherscan.io/token/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code

준비물

contract address, abi 메모장에 복사해놓기
Infura.io에서 mainnet websockets 받아오기

Terminal

node
var {Web3} = require('web3')

var web3 = new Web3('wss://mainnet.infura.io/ws/v3/apiKey')

var acc = '웹드contract 주소'
var abi = abi
acc
abi
var contract = new web3.eth.Contract(abi, acc)
contract.events
contract.events.Transfer().on('data',function(events){console.log(events)})

``잡 끄적끄적“”
await

var subscription = await web3.eth.subscribe('newHeads')

subscription.on('data',async blockHead => {console.log("New Block Header : ", blockHead)})
‘’ 잡 끄적끄적 ’‘

2. 웹소켓 이용해서 실시간 정보를 받고 -> 이벤트함수 사용해서 코드 작성해주기

Remix에서 event1.sol에 아래 code 작성

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract EVENT1 {
    event ADD(string name, uint result);
    event SUB(string name, uint result);
    event MUL(string name, uint result);
    event DIV(string name, uint result);

    function add(uint _a, uint _b) public returns(uint) {
        emit ADD("Plus", _a+_b);
        return _a + _b;
    } // 얘를 누르면 저 이벤트의 알람이 울린다

    function sub(uint _a, uint _b) public returns(uint) {
         emit SUB("Minus", _a-_b);
        return _a - _b;
    }

    function mul(uint _a, uint _b) public returns(uint) {
        emit MUL("Times", _a*_b);
        return _a * _b;
    }

    function div(uint _a, uint _b) public returns(uint) {
        emit DIV("divide", _a/_b);
        return _a / _b;
    }
}
contract EVENT2 {
    event higherThanTen(uint a);

    function add(uint _a, uint _b) public {
        uint _c = _a + _b;
        if(_c >=10) {
                emit higherThanTen(_c);
        }
    }
}

contract CHAINID {
    function getChainID() public view returns(uint) {
        return block.chainid;
    }
} // 전역변수

0개의 댓글