일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- erc4337 contract
- 스마트컨트렉트 예약어 함수이름 중복
- 오블완
- Vue
- ethers
- ethers typescript
- 러스트 기초 학습
- multicall
- 러스트기초
- chainlink 설명
- 스마트컨트렉트테스트
- 스마트컨트렉트 함수이름 중복 호출
- 계정추상화
- Vue.js
- 스마트 컨트렉트 함수이름 중복
- 러스트 기초
- 머신러닝기초
- 티스토리챌린지
- ambiguous function description
- 컨트렉트 배포 자동화
- rust 기초
- 체인의정석
- 컨트렉트 동일한 함수이름 호출
- erc4337
- ethers type
- git rebase
- ethers v6
- SBT표준
- ethers websocket
- vue기초
- Today
- Total
체인의정석
이벤트 로그에 구조체 데이터 넣기, 이벤트 로그 작성하기 본문
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
);
일단은 이런식으로 주소 에는 인덱싱을 하고 로그가 잘 남도록 해시값 정도와 가격 정보만 업데이트 하였다.
일단 와이번익스체인지에서는 해시값이 개별 오더북의 인덱스와 비슷하기 때문에 이런 인덱스로 활용가능한 지표와
유저들이 스캔에서 이벤트로그를 볼 수 있기에 이를 고려한 주요 정보, 그리고 인덱싱으로 검색할 정보 정도만 기록하면 될거 같다.
참고로 이번 프로젝트에서는 로그 값을 인터페이스에 정의하고 컨트렉트가 이벤트 로그를 가지고 있는 인터페이스를 상속하는 식으로 구현을 하는 중이다. 이는 오픈제플린과 같은 방향인데 오픈씨의 컨트렉트는 인터페이스 상속 없이 내부적으로 사용하였다.
개인적으로 오픈씨와 오픈제플린의 중간 정도 수준으로 분리를 해서 코드를 쓰는게 좋은거 같다고 느낀다.
'블록체인 > Solidity' 카테고리의 다른 글
Solidity 0.8.0 버전에서 HashStruct안에 UUID 넣는 법 (0) | 2022.07.21 |
---|---|
Solidity에서 자주 만나는 에러 "CompilerError: Stack too deep, try removing local variables." 그리고 에러에 대한 해결 방안 정리 , 이벤트 로그와 함수 입력값 구조체로 개수 줄이기 (0) | 2022.07.13 |
delegateCall에서의 상태변화 가능여부 및 사용하면 안되는 이유 (0) | 2022.07.08 |
DelegateCall에서 값을 가져오는 케이스 (0) | 2022.07.08 |
하나의 컨트렉트를 여러개로 분리해서 만들 때의 주의 사항 (0) | 2022.07.07 |