체인의정석

이벤트 로그에 구조체 데이터 넣기, 이벤트 로그 작성하기 본문

블록체인/Solidity

이벤트 로그에 구조체 데이터 넣기, 이벤트 로그 작성하기

체인의정석 2022. 7. 13. 17:02
728x90
반응형

https://ethereum.stackexchange.com/questions/48896/is-it-possible-to-have-a-struct-within-an-event

 

Is it possible to have a struct within an Event?

I have something like this in solidity: struct Bid { ... } event BidEvent(Bid bid) but when I try to read this event in Javascript, there's no data inside that I can access — no bid variable, ...

ethereum.stackexchange.com

최신버전에서는 이벤트 로그에 구조체 데이터를 넣을 수 있는것 같다.

 

내가 지금 만들고 있는것은 오픈씨의 atomiMatch와 유사한 함수의 이벤트이기 때문에 wyvernExchange가 이벤트를 어떻게 기록하고 있는지도 체크하였다.

 

먼저 이벤트의 경우

    event OrdersMatched           (bytes32 buyHash, bytes32 sellHash, address indexed maker, address indexed taker, uint price, bytes32 indexed metadata);

그리고 emit의 경우

        /* Log match event. */
        emit OrdersMatched(buyHash, sellHash, sell.feeRecipient != address(0) ? sell.maker : buy.maker, sell.feeRecipient != address(0) ? buy.maker : sell.maker, price, metadata);

아무래도 오더북 자체인 struct를 전체로 올리지는 않는걸 확인할 수 있었다. 

그리고 보니 3항 연산자 처럼 보이는 문법도 알 수 있었다. 보니까 상황에 따라서 이벤트를 다르게 남기는데 

판매오더 해시, 구매오더 해시, 그리고 판매자, 구매자 , 가격 등을 남긴다.

이정도 기록이 적당한거 같아서 비슷한 값을 로그로 남기기로 했다.

 

  event OrdersMatched(
    address indexed seller,
    address indexed buyer,
    bytes32 buyHash,
    bytes32 sellHash,
    uint256 tokenId,
    uint256 price
  );

일단은 이런식으로 주소 에는 인덱싱을 하고 로그가 잘 남도록 해시값 정도와 가격 정보만 업데이트 하였다.

 

일단 와이번익스체인지에서는 해시값이 개별 오더북의 인덱스와 비슷하기 때문에 이런 인덱스로 활용가능한 지표와

유저들이 스캔에서 이벤트로그를 볼 수 있기에 이를 고려한 주요 정보, 그리고 인덱싱으로 검색할 정보 정도만 기록하면 될거 같다.

 

참고로 이번 프로젝트에서는 로그 값을 인터페이스에 정의하고 컨트렉트가 이벤트 로그를 가지고 있는 인터페이스를 상속하는 식으로 구현을 하는 중이다. 이는 오픈제플린과 같은 방향인데 오픈씨의 컨트렉트는 인터페이스 상속 없이 내부적으로 사용하였다.

 

개인적으로 오픈씨와 오픈제플린의 중간 정도 수준으로 분리를 해서 코드를 쓰는게 좋은거 같다고 느낀다.

 

 

 

728x90
반응형
Comments