web3 - filter

molly·2022년 12월 25일
0

Web3

목록 보기
1/2

나중에 이더스캔을 만들어보려고 하는데 전에 블록전체를 다 스캔해서 가져와 그 데이터를 다시 for문을 돌리는 방식으로 만들었던 적이 있는데 filter함수를 통해서 조금 더 최적화하여 만들어 볼 수 있을 거 같고, 뭔가 관련 내용들도 인터넷에 깔끔하게 정리된 문서가 없는거 같아서 포스팅 해봤다.

filter함수는 무엇인가요?

filter함수는 블록이 생성될 때 또는 생성된 블록을 모니터링할 수 있는 객체입니다.

그럼 무엇을 모니터링 하나요?

생성된 객체에 watch 함수를 호출하여 이벤트들을 모니터링합니다

watch함수는 새로운 블록이 생성될 때마다 호출되고요

그렇다면 하나의 컨트랙트에서 특정 어카운트가 일어킨 모든 거래의 객체 목록을 filter함수를 통해서 얻을 수가 있나요?

네, filter와 get함수를 통해 알 수 있어요. 아래는 geth에서 실행 예시입니다.

var options = {
  fromBlock: 1,
  toBlock: 400,
  address: "0x32420FE7033b825Cc8a7aF160744d9856B205627", //CA
  from: "0x5f8c4e838d2fd3c089455b7d30c4ab34a133c2bd" //EOA
};
var filter = eth.filter(options)
filter.get(function(error, result){
  if (!error)
    console.log(JSON.stringify(result, null, 2));
});

오, 좋은 기능이고 잘 쓰면 편리하게 트랜잭션 스캔기능에 구현할 수 있을 것이라는 생각이 드네요. 그럼 filter에서 get과 watch의 차이는 뭔가요??

get은 이미 생성된 블록의 필터링 정보를 보여주는 것이고 watch는 새 블록이 발견된다면 watch안의 명령을 실행하는 차이가 있습니다.

아래는 이해를 돕기 위한 filter.watch()의 예입니다.

var filter = web3.eth.filter('latest');
filter.watch(function(error, block_hash) {
	web3.eth.getBlock(block_hash, false, function(err, block) {
            console.log(block);
	});
});

이해가 가는 거 같네요, 그렇다면 로그를 받아오는 방법 중에 필터를 생성해서 getFilterChanges()로 가져올 수 있다고 하는 데 그것은 어떻게 진행하는 건가요?

나중에 생성되는 블록에 로그값이 변화할 때는 ****getFilterChanges(필터 id)를 입력하면 됩니다.

geth에서는 getFilterChanges() 해당 함수 대신 filter를 선언한 후 filter.implementation.getLogs(필터 id)를 입력하면 아래와 같이 컨트랙트에서 일어난 로그들을 확인 할 수 있어요.

오! 그렇군요, 그렇다면 filter를 선언하고 옵션에서 마지막 블록을 어떻게 선언하냐에 따라서 펜딩이나 생성된 블록의 정보들도 빠르게 가져올 수 있겠네요?

네, 맞습니다. 옵션을

eth.filter("earliest","latest”) 와 같이 지정하면 되요, 펜딩옵션도 추가할 수 있구요 .

도움을 준 사이트

https://ethereum.stackexchange.com/questions/22954/mistake-when-using-web3-eth-filter-and-filter-get

profile
BlockChain R&D

0개의 댓글

관련 채용 정보