Geth(2) - NFT 이벤트 리스닝(ERC-721, ERC-1155)

박근원·2023년 2월 1일
0

깃허브 참고
based on Window11

Geth 실행

  • 이전 글 참고

Geth (1) - 설치 및 실행

  • 아래 사항은 Geth를 실행한 상태에서 진행해야한다.

Web3.js 설정

  • 설치는 npm으로.
  • 디렉토리 하나 만들어서
npm init -y
npm install web3
  • 해당 코드 실행하고 js파일이 없다면 index.js 생성

1. 버전 확인

  • index.js 에서
var Web3 = require('web3');
console.log(Web3.version);
  • 다시 터미널에서
node index.js
  • 실행하면 버전 정보가 나온다. 이때 나오는 버전에 맞는 docs를 참고할 것. (위가 1.x 버전, 아래가 4.x버전, 나는 1.8.1 버전을 사용했다.)

web3.js - Ethereum JavaScript API - web3.js 1.0.0 documentation

Web3.js - Javascript Ethereum API

2. 프로바이더 설정 (setProvider)

  • 프로바이더는 4가지 있음
    • web3.Provider;
    • web3.eth.Provider;
    • web3.shh.Provider;
    • web3.bzz.Provider;
  • 만약 Alchemy와 같은 프로바이더를 사용한다면 간단하게 설정 가능.
var Web3 = require('web3');
var web3 = new Web3("http://eth-mainnet.alchemyapi.io/v2/your-api-key");
  • 프로바이더는 Object 파라미터를 가짐.
  • Object에는 3가지 종류가 있음.
    • HttpProvier - subscription을 지원하지 않음. 고로 이벤트 리스닝 예제는 부적합.

    • WebSocketProvider - legacy browsers에서 표준임.

    • IpcProvider - 가장 보안성 있는 연결을 지원함. 로컬 노드를 돌릴때 씀.

      HTTPWSIPC
      Event subscriptionNYY
      Remote connectionYYN
      Per-message metadata overheadhighlowlow
  • Ipc로 설정했을때 코드 (geth.ipc의 경로는 조금씩 다를 수 있으나 Window의 기본 설정값은 아래와 같다.)
var Web3 = require('web3');
var net - require('net');
var web3 = new Web3(new Web3.providers.IpcProvider('\\\\.\\pipe\\geth.ipc',net));

ERC-721, ERC-1155 subscribe

  • ERC-721와 ERC-1155구조에 맞는 transaction이 발생했을때 인식하고 해당 transfer를 출력할 수 있도록 해 주어야 한다.
  • topic의 수로 구분할 수 있다.
  • ERC-1155는 TransferSingle만 본다고 하면 topic 갯수를 따질 필요가 없다.
let options721 = {
    topics: [
        web3.utils.sha3('Transfer(address,address,uint256)')
    ]
};

let subscription721 = web3.eth.subscribe('logs',options721);
let options1155 = {
    topics: [
        web3.utils.sha3('TransferSingle(address,address,address,uint256,uint256)')
    ]
};

let subscription1155 = web3.eth.subscribe('logs', options1155);

전체 코드

  • 터미널에서 실행
node index.js
  • ERC-721
var Web3 = require("web3");

var net = require('net');

const web3 = new Web3(new Web3.providers.IpcProvider('\\\\.\\pipe\\geth.ipc',net));

let options721 = {
    topics: [
        web3.utils.sha3('Transfer(address,address,uint256)')
    ]
};

let subscription721 = web3.eth.subscribe('logs',options721);

subscription721.on('data',event => {
    if(event.topics.length == 4) {
        let transaction = web3.eth.abi.decodeLog([{
            type: 'address',
            name: 'from',
            indexed: true
        }, {
                type: 'address',
                name: 'to',
                indexed: true
            }, {
                type: 'unit256',
            name: 'tokenId',
            indexed: true
        }],
            event.data,
            [event.topics[1], event.topics[2], event.topics[3]]);

            if (transaction.from == '0xc486f5B5bE145A7CBe467A09f032D461A41F2F5C') { console.log('Specified address sent an NFT!') };
            //특정 account에서 보낸 transaction 
						if (transaction.to == '0xB79111ba38eFF0415926ac11bc6f56d087F81E5a') { console.log('Specified address received an NFT!') };
						//특정 account에서 받은 transaction            
						if (event.address == '0x00000000006c3852cbEf3e08E8dF289169EdE581' && transaction.tokenId == 23090) { console.log('Specified NFT was transferred!') };
						//특정 이벤트 transaction
   
						//블록당 발생하는 전체 ERC-721 transaction 출력
						//만약 from부분이 0이라면 새로 mint된 것으로 판단.
            console.log(`\n` +
            `New ERC-712 transaction found in block ${event.blockNumber} with hash ${event.transactionHash}\n` +
            `From: ${(transaction.from === '0x0000000000000000000000000000000000000000') ? 'New mint!' : transaction.from}\n` +
            `To: ${transaction.to}\n` +
            `Token contract: ${event.address}\n` +
            `Token ID: ${transaction.tokenId}`
        );
    }
});

subscription721.on('error', err => {throw err});
subscription721.on('connected', nr => console.log('Subscription on  ERC-721 started with ID %s',nr));
  • ERC-1155
const Web3 = require('web3');

var net = require('net');

const web3 = new Web3(new Web3.providers.IpcProvider('\\\\.\\pipe\\geth.ipc',net));

let options1155 = {
    topics: [
        web3.utils.sha3('TransferSingle(address,address,address,uint256,uint256)')
    ]
};

let subscription1155 = web3.eth.subscribe('logs', options1155);

subscription1155.on('data', event => {
    let transaction = web3.eth.abi.decodeLog([{
        type: 'address',
        name: 'operator',
        indexed: true
    }, {
        type: 'address',
        name: 'from',
        indexed: true
    }, {
        type: 'address',
        name: 'to',
        indexed: true
    }, {
        type: 'uint256',
        name: 'id'
    }, {
        type: 'uint256',
        name: 'value'
    }],
        event.data,
        [event.topics[1], event.topics[2], event.topics[3]]);

		//블록당 발생하는 전체 ERC-1155 transaction 출력
		//만약 from부분이 0이라면 새로 mint된 것으로 판단.
    console.log(`\n` +
        `New ERC-1155 transaction found in block ${event.blockNumber} with hash ${event.transactionHash}\n` +
        `Operator: ${transaction.operator}\n` +
        `From: ${(transaction.from === '0x0000000000000000000000000000000000000000') ? 'New mint!' : transaction.from}\n` +
        `To: ${transaction.to}\n` +
        `id: ${transaction.id}\n` +
        `value: ${transaction.value}`
    );
})

subscription1155.on('error', err => { throw err });

subscription1155.on('connected', nr => console.log('Subscription on ERC-1155 started with ID %s', nr));

결과

  • 이더리움 블록이 생성되는 평균 시간(12초)

Ethereum Average Block Time

  • 이더리움 블록이 생성될 때 마다 해당 블록에 있는 ERC-721과 ERC-1155를 전부 출력한다.

  • 그리고 지정된 특정 account의 transaction이 생기면 출력한다.

  • geth에서 싱크 메시지

  • 16530719번 블록에서 발생한 ERC-721 transaction.

New ERC-721 transaction found in block 16530719 with hash 0xfff968f82c641577ee11f63101591c160b4125de02a2aed682ca5c17d8362c60
From: 0x19913e368870eA484fE361cb294Dfe83ac364721
To: 0xbe3d1FFD2A7bEa5f91b46a6320f5CeEa53b73f1C
Token contract: 0x5Af0D9827E0c53E4799BB226655A1de152A425a5
Token ID: 9138

New ERC-721 transaction found in block 16530719 with hash 0xb4dd221217f085b4dc0bf9cf70403e4eb83bd96be48320ed2b885badab193a93
From: New mint!
To: 0x47a317fe641e2A450f41d49842F78e8bf9113F97
Token contract: 0x066E1f00B845366E474199004a697deCC471A048
Token ID: 146

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 597

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 598

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 599

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 600

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 601

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 602

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 603

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 604

New ERC-721 transaction found in block 16530719 with hash 0xe72cc0dae3538bd8428f93f461f9949dd60911573083f0806b6f9e821a4e7319
From: New mint!
To: 0x4bC515Dd64C267E04be2269FdB4Bd4803B7558E1
Token contract: 0x26928019AD7EeF0093FC9eFBd2B00e542dF98918
Token ID: 605

New ERC-721 transaction found in block 16530719 with hash 0x62c5d37f20ed216081a074980c3fbf2ea14b547a784a4e1163cbbeab83415c61
From: 0xaC77B446128cE9bB3de67f3F26Db332F8B6816b7
To: 0x8844D5cE1b9f88B55184Aa225b26Fa38A302EA2A
Token contract: 0x231d3559aa848Bf10366fB9868590F01d34bF240
Token ID: 5625

New ERC-721 transaction found in block 16530719 with hash 0x823848537a762c5be68f4e4567ec119b24bfc2a2d036a746038ab2e2bd436de4
From: 0x7817946035C3dF3e3FEe461642fd575908d6Ea54
To: 0x8fc15971E43588F2d9936be8CAd323f0Ac023126
Token contract: 0xbD275ce24f32d6cE4e9d9519C55ABe9Bc0ed7fCf
Token ID: 5504

New ERC-721 transaction found in block 16530719 with hash 0x823848537a762c5be68f4e4567ec119b24bfc2a2d036a746038ab2e2bd436de4
From: 0xa5Ee8dfb17Fa8526E801D9b6F36045aF330dAEaD
To: 0x8fc15971E43588F2d9936be8CAd323f0Ac023126
Token contract: 0xbD275ce24f32d6cE4e9d9519C55ABe9Bc0ed7fCf
Token ID: 4674

New ERC-721 transaction found in block 16530719 with hash 0x823848537a762c5be68f4e4567ec119b24bfc2a2d036a746038ab2e2bd436de4
From: 0x499797b181cd8A2c4298E182dd6887Aa7a233A13
To: 0x8fc15971E43588F2d9936be8CAd323f0Ac023126
Token contract: 0xD73ACd7F5099fdd910215Dbff029185F21ffBCf0
Token ID: 4169

New ERC-721 transaction found in block 16530719 with hash 0x76c62fc9d498dc709369dbb2a68e52706fc128abfe523bbec688ae26d0c39112
From: 0x45F6A6A3b4F1ec4de84Ff74fEd1EF393F3e47294
To: 0x6f0d97D07453c330b8652567536DB8cf5bb2a5E6
Token contract: 0xF775fc978969CeF018bAFF9fA20C62eb6C9EC8BB
Token ID: 7348

New ERC-721 transaction found in block 16530719 with hash 0xf395449488cc5e1a010abce0ec76ad3090a43dcc1107d55238c332ba077b3c5b
From: 0x1e2ab2c1ee48aA5C705E6a638087bf7fc1877095
To: 0xdA7568175Bf0528E9E609374aaEc2267a8EB0Fdf
Token contract: 0x91A5d4F6e691432a58d5579ae45955210eC6a2f1
Token ID: 292

New ERC-721 transaction found in block 16530719 with hash 0x7dc8e1d9c878c7f271f50997e43c4efd3526dd32589f211e85f4727ca58146af
From: 0xE6F45376f64e1F568BD1404C155e5fFD2F80F7AD
To: 0xfF0E3CFc2bFB25A8950144280995a2f565A84ae8
Token contract: 0x31fe9d95ddE43cf9893b76160F63521a9e3D26B0
Token ID: 8842

New ERC-721 transaction found in block 16530719 with hash 0xb838d6923a6abc74ee838a5f6410b21e4e86ef94dc487bdd4c33a02e0b2de76b
From: 0x599Aa2fEAEEC1c4CAA33Da6b7fBd0E6578953c96
To: 0x197456c54349ccedf39889667FDD094ACC06445E
Token contract: 0x60E4d786628Fea6478F785A6d7e704777c86a7c6
Token ID: 16526

New ERC-721 transaction found in block 16530719 with hash 0xb838d6923a6abc74ee838a5f6410b21e4e86ef94dc487bdd4c33a02e0b2de76b
From: 0x599Aa2fEAEEC1c4CAA33Da6b7fBd0E6578953c96
To: 0x197456c54349ccedf39889667FDD094ACC06445E
Token contract: 0xba30E5F9Bb24caa003E9f2f0497Ad287FDF95623
Token ID: 8604

New ERC-721 transaction found in block 16530719 with hash 0x18ea738573685348d8d9e295ec9e0c63eb212bc49effc55e35237fade39c7400
From: 0x82E7A8417BC00c984B7FCCfaBD95dBdc00c3CD33
To: 0x51a8B04E69B1E8AEc0A110A9E9Ff9870377b1993
Token contract: 0xc99B3837813B43d93c41bc5706AE0B22c3fa3CCb
Token ID: 986

New ERC-721 transaction found in block 16530719 with hash 0xdfbf0fe0619a77e1e6fd0ed761de6a6514a1d54f9f2f3ed3cfb5a2672d394679
From: New mint!
To: 0x5acB576E310B13a19a5CD0c473feB97957F0761a
Token contract: 0x764AeebcF425d56800eF2c84F2578689415a2DAa
Token ID: 24614

New ERC-721 transaction found in block 16530719 with hash 0x10688cb7a42553655d5f71b85424d5b807e5cacaecb1507274651efd7bc144fa
From: New mint!
To: 0x0e26b2Af0cAd6eda72Fd0D2b39CFb4d71bAB4A36
Token contract: 0x1a65Fa4E896a5fB0F3942E698DB13B87a9c15b52
Token ID: 1049

New ERC-721 transaction found in block 16530719 with hash 0x10688cb7a42553655d5f71b85424d5b807e5cacaecb1507274651efd7bc144fa
From: New mint!
To: 0x0e26b2Af0cAd6eda72Fd0D2b39CFb4d71bAB4A36
Token contract: 0x1a65Fa4E896a5fB0F3942E698DB13B87a9c15b52
Token ID: 1050

New ERC-721 transaction found in block 16530719 with hash 0xa01337c96c3c472ef996e0d8f04f9664d5074a84dc85681b9c7d4ca00f1bcd13
From: New mint!
To: 0x283Af0B28c62C092C9727F1Ee09c02CA627EB7F5
Token contract: 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85
Token ID: 7123685114471840110634334834797876959061543128660866142983137550849695452922

New ERC-721 transaction found in block 16530719 with hash 0xa01337c96c3c472ef996e0d8f04f9664d5074a84dc85681b9c7d4ca00f1bcd13
From: 0x283Af0B28c62C092C9727F1Ee09c02CA627EB7F5
To: 0x49A1564c41B1D7a369850fD43Eca03b9BBd4E8D4
Token contract: 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85
Token ID: 7123685114471840110634334834797876959061543128660866142983137550849695452922

New ERC-721 transaction found in block 16530719 with hash 0x0e94d4723d10228270a0b0d9a8417b54bb37a3a288f9799d08f636ca94eba4d9
From: 0xA327809AC3d50591f7eF92643DCA126d71617209
To: 0x1110DC141A7A2F53fFff4D62e8fbe5df34532DCe
Token contract: 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85
Token ID: 2911898109985982297074412993827229221856301344503589508226141352653778886282
  • 16530719번 블록에서 발생한 ERC-1155 transaction.
New ERC-1155 transaction found in block 16530719 with hash 0x5b9e65cfc9d5e334ffa945701b775d6e11050b90e58401968231b94fde3ce66b
Operator: 0x44e94034AFcE2Dd3CD5Eb62528f239686Fc8f162
From: New mint!
To: 0x55caC8c88C84723eB8Df4D9054EcF030Cc82A774
id: 4
value: 1

New ERC-1155 transaction found in block 16530719 with hash 0x5a633913c41fb5fc5bb01e08b1bfd4d7170c0721f3e6497a46741db076255b04
Operator: 0xadbCC0C01d9A67275a4d782b54adEA67621aC33f
From: 0xadbCC0C01d9A67275a4d782b54adEA67621aC33f
To: 0xa4fb4bfbd70Ae8C81eCe9E0FCCefFa9953e120cB
id: 1
value: 6

New ERC-1155 transaction found in block 16530719 with hash 0x5a633913c41fb5fc5bb01e08b1bfd4d7170c0721f3e6497a46741db076255b04
Operator: 0xa4fb4bfbd70Ae8C81eCe9E0FCCefFa9953e120cB
From: New mint!
To: 0xadbCC0C01d9A67275a4d782b54adEA67621aC33f
id: 5
value: 3

New ERC-1155 transaction found in block 16530719 with hash 0x5a633913c41fb5fc5bb01e08b1bfd4d7170c0721f3e6497a46741db076255b04
Operator: 0xa4fb4bfbd70Ae8C81eCe9E0FCCefFa9953e120cB
From: 0xa4fb4bfbd70Ae8C81eCe9E0FCCefFa9953e120cB
To: 0x0000000000000000000000000000000000000000
id: 1
value: 6

New ERC-1155 transaction found in block 16530719 with hash 0x960590acd465c00c295cc92108b7404bbb34a7833e0e14c864bc1743a756eea5
Operator: 0x83Fd16c2882cb18E3777A68A6d4A158571608d38
From: New mint!
To: 0xffC15eF23f4Ba7Faf4B4d3c28a35A28f126BCc0D
id: 4
value: 1

New ERC-1155 transaction found in block 16530719 with hash 0x9cc6a7af72ec48ad429a9702e5bb9c4219e2f24b7f7144768b33eb01a7309ede
Operator: 0x44e94034AFcE2Dd3CD5Eb62528f239686Fc8f162
From: New mint!
To: 0x6B8194b040a0ef103d070A037A523B47997A312A
id: 2
value: 2

New ERC-1155 transaction found in block 16530719 with hash 0x849078485395af6ccb6c48aa3d15e28853903bb9d3189ab0c58b91f07870cd28
Operator: 0x44e94034AFcE2Dd3CD5Eb62528f239686Fc8f162
From: New mint!
To: 0xcdB1d02bC1dA07e8D166241D339E645D1466579c
id: 1
value: 1

New ERC-1155 transaction found in block 16530719 with hash 0x057b625ef0eb9ed9fd83730033c88f67ab223c219b975d438c3e35b2018b5bda
Operator: 0x44e94034AFcE2Dd3CD5Eb62528f239686Fc8f162
From: New mint!
To: 0x61560Fb79242A875408667353998db29153DaAFD
id: 1
value: 65535

0개의 댓글