이더스캔을 보면 지갑 Account(EOA)나 컨트랙트 Account(CA)를 통해 해당 계정에서 발생한 트랜잭션을 모니터링 할 수 있습니다. 이더스캔의 경우 독립적인 데이터베이스를 두고, 트랜잭션이 발생할 때 마다 DB에 기록하는 방식으로 보여줍니다.
Account를 통해 트랜잭션을 확인하는 getTransactionsByAccount 함수를 직접 구현할 수 있습니다. 이 함수를 구현하기 위해 web3.eth.getBlock()와 web3.eth.getTransaction() 함수를 사용합니다.
기본 설정
우선 Web3 모듈을 import 한 후 공급자를 주입해줍니다. 저의 경우는 Infura를 사용해서 엔드포인트 URL을 받아왔습니다. 함수가 작동하는 네트워크는 Ropsten 네트워크 입니다.
const Web3 = require('web3');
const rpcURL = "https://ropsten.infura.io/v3/{Infura Endpoint API}";
const web3 = new Web3(rpcURL);
getTransactionsByAccount() 함수 구현
특정 Account에서 발생한 트랜잭션을 조회하는 순서는 다음과 같습니다.
1. 우선 블록을 특정합니다.
제네시스 블록 부터 최근 블록까지 조회하면 좋겠지만, 상당히 많은 시간이 걸립니다. Ropsten의 경우 현재 최신 블록 번호는 12719587 인데, 블록당 통상 30개 정도의 트랜잭션이 담긴다는 걸 가정하면 약 3.8억번 연산해야 하기 때문입니다.
2. 블록에 담긴 트랜잭션을 가져옵니다.
web3.eth.getBlock();
위 함수로 Block 정보를 다음과 같이 가져옵니다. 여기서 우리가 가져와야 할 정보는 transactions 입니다.
{
"baseFeePerGas": 8,
"difficulty": "0",
"extraData": "0x",
"gasLimit": 30000000,
"gasUsed": 6486563,
"hash": "0x65bce6a370e3d881dd72c63991b71ac49a7d6f27579539ec6b23f4235688127d",
"logsBloom": "0x0a28000000400004000000408000000000200000000200000081000000000010004040400000000810000000040000080800000002000004000000020020000100011000000000000000000a000000200001000000000000400000000000400000000000020000000000000010010800028010000000080000000010008000400000004040040000004080000000003000000800008000080000084004000400020010000000400000400000000080200000020204800044008000004000400000000002000000000000200900050c000020000020008010000000001040a2004010400000200000000000001100102004000000000800440000000000010000",
"miner": "0x0000000000000000000000000000000000000000",
"mixHash": "0x1893c136671857bb9851027f41bd4416ae87cba38bd1792a7bc49fc128173c48",
"nonce": "0x0000000000000000",
"number": 12719291,
"parentHash": "0xb4a7f0ad0ddaf8066330f552c29d6f56a50ceb2386cb5578dd36f731ad2d05d3",
"receiptsRoot": "0x11b85b4d622ab5b17faa725363e0b6e64994d64de57d046ce1a0c531e90229e1",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": 27658,
"stateRoot": "0xb3fd12e03217aa99af1399839f1e7c25dffbd433987d5fd76479763c31b0e5a8",
"timestamp": 1659598440,
"totalDifficulty": "50000820485795157",
"transactions": [
"0x5aae6ca04a1e2e4fd9895fdd8019141d4c4b2bb6d5e06631c9e2354139dc56c1",
"0x509493ed1be9f4d7e8c19954b19645db1852cf363b1c110038d09858708f65bf",
"0xca215a488f357d55bd282b2a2a254bdaad93a4b0d6677a6ca40a6c80ffbefc19",
"0xf8d727ee24e48b7b5e58fe5249075d50ac5ee89ce2a2fad34d1006bb9de986ad",
"0xe3d4e90523c94f986ae3da5cba655e9cd406a409a32dc8d6eb0f6271d75aa912",
"0x847a0ffc1969179143d1501d432fd1686b46a2cd1031e6ff8f7d08c09c561e4f",
"0xb0737f99964f9061b28827944acb446df2590122eaeb5fd97f078079b382dbb6",
"0x1e7f672b7786202588853a4492544c84323db276abea7993b29397e05aa51753",
"0x9e599890b9341e5b7e2728c86b9cf975a66d4f8c590d670ddecc05d449169d64",
"0x5f2490074d1ae9cbed7c807d4e53cc5076f87a079403e327f67622eb87a23afb",
"0x95bbd38dab95d377b1e01493ce195971e9827bd2f6a290acd03f79003771be20",
"0x5011eddf00a419fbb5c96d607fd1850a20d94c3b01f0de2d18bbd67057af457c",
"0x0fb1b7dc1d0a5278094de336a33f651750e006e3162b230658d8de51669d2d46",
"0xda432282e073f16c45a55b687273eb73002128d7af4792e1db5cf4a0af4b83b0",
"0xd964002dbdd6b13cd5e8fb036c1d5ce08c51f0a6f91e7d286598d40296fbaf10",
"0x54275aa135c451ab076157694b8f1650844ccc0102d22728e3833a8bb8b0d078",
"0x5fff825f787d8ccd02a3afefca5fe22df1c86215751a88ebc039dd0e1a3294c9",
"0x692ea014f45576aa750c28bd7c75aa688c4045b9dfa98a53947e0ec2bd11247a",
"0xd7340ead92033b7b08f3652ff9fa452417f35b12a01f7c5e8ffba948a9676e37",
"0x7846ce91aa4a81cd37142e42702b4506dd5fad297d0429e924e18b111cc56867",
"0x0e8decac36792fbeb302ea75791178b6cdd8a8e943e96e3a6377aa2ce1bb6925",
"0xa096f8d3a7ede84692bae1c2d96db171d6be6146e54ab6ccd83761747f6ba720",
"0x7e872c7bccef8b9f6f8df5a1b5468f32e487f0f1d6bdd1ecf0f5c61c8a730794",
"0x30d4704cd8aee005db6cf3118950295479b3456be9ff29345bb321c0297cc44c",
"0xbd06ab25d6b79126b5209aaa6553debb9d49b3b9f763a9d2684edf56138b512a",
"0xa55b1a4ea319741ba7fb54072abb79529c9556d0425baf698dcf5965bbcae049",
"0xe790883d523028c18a3db7a3b5639a2df56f2d067cfda6f64ced06581e93f6f2",
"0xef69b5e7b9c280b2f3f588c246a2009f2ae4c7398d355f5d62b3a2541573e12e",
"0x952cc0327b0d5efb5e710456538b021004a84630ed67ed9ae4002d88dcddb07b",
"0xe91db48b4e39cfb3dc229c885bfb8e3cb67ebda157c3d8546d4f469fbeb4c8c0",
"0x484a9ef76a41fd85afa8498ba645d91ddce3ef2c5a9d2a28ee35fb1dabdbefc9",
"0x2d688f8e29714474171b882993a793578b01a7d9fefe6d6a434151d1258775a7",
"0xef4515289f794242bb810d28c318e2122552889bb382ea96b568cecdf60bc47b",
"0x2e048650b845d639d5e09b2f77e155e5f8f623fb131419a6210eb763a785f4cf",
"0x7b558080cb01aee775c15e76764d7bcb9ff94889fba6c0acf2ebbb55a111a342",
"0x1fd7401d5522d646ff40e3dcb7dd4baabcc640ec6a63368c1c6d8a93eda6eea1",
"0x325f5d16b233e9594646d4359a99386ff663e338599305444e3cbf913b111e36",
"0x16c808d3bab9cf521379f812a3d2ca9c33fb4c73425b746bd7b799db7e5e5122",
"0x4e525be7fc0b0430e69dbc9317ca0805130d6693db9df813d14985731948a733",
"0x7487cfcaa68bd5ae2036810e405671955c948200dce2c4de01b349e1b84eb11f",
"0x6e9eda9444c49406f91e21e6d72321998971883a94ce91617d2770256d9bc79a",
"0x0f1bca9df9273fce54a97cc477a666e8b247ebf42c7b6bdd53116326355457eb",
"0xf3f4d85a60f34b390f872747c2a25b352a7eaf3f6bde83965aef7238d749f166",
"0xf29045658706ee227bce4a10b69017c26095a1494c5eec622430ed50a8eeb0b3",
"0xed668ab1e808dba50f82507c1230013f71c39743cdd8cad0d81dc331010544d1",
"0x0bb636ac1badc8fed1190019d8fa5a3172d8dc08f40e5332a30a4c7c5f368452",
"0xb1aa490cdf8dd21592177cec5a71de36f45beb39b227361d8263793ca2af49fd",
"0xd0d1131b39ca29948f976eca95b757eee33d808bd1226a2184799e29880af7be",
"0x3e6f19f0488f5ed1b72012995bb6eeb49bdc596a592415d5260bb56b6c3b9a09",
"0x1917e7ce5a9471119353e585a9f7d27125105abd46fbb9ca294427611e29c4af",
"0x68a3c8c11b898525eab497146b0e850a9093afb960339e876a33ef2c4fda0c69",
"0xc89f4dfff41cf2f3aee799a84d2863669c2d8af98476c67ac7d0969e7d67fcfa",
"0x21fb48771ba87dd1cbce92e8c08c02f4be5217de20d0780429daa5169da8f865",
"0x70e0f12c35c655b033ce368672c2c8aa4abdb86c1e8faf04669b3befb553d804",
"0x56b85a64be6e69623ba58b6f101b07c282a9eaa6577c6fcfa3b0da2a85a11ec3",
"0x472b7565c72f8691d899d539e9b9f592c8229ddcbcf2b71a0b427d2afaa45ba2",
"0x0cf21bd9d0c6fbadb895e098e5c3e1fae7d885fc3d30361a207135bc96eaa423",
"0x6b6de852a1ec4866ec23708a627db6beaa34822f1bc41107f7d36d958c3beaf4",
"0xfce59d448af9b173e85b91228f87495aedb46ed41c23bca745493c5b09ee9300",
"0xf5e2b73cebeec22ad862628c3b5b2365d90c17db06256c1fd3aa81a683f487f3",
"0x4967ed0716521f0a96525ff4ba2e9b23bb6986fd1c78ffcfc33337a20814d459",
"0x0681f445bff956f9eae8b357ed99f274cd51f49e5bda6fa9928cc8c5c0c07678",
"0xfc73208316998d0e1c4c93a2e0351d0a7919d017425cffa944402757536708b6",
"0xc3beadb1acf547f00b326383958d2f57f35ed0d841bc12dc0cb2b1b44f8632a8",
"0x02533e12c9a5a1bd0dd0ed7599c92551b8f06a60c530341e7fe220e78b62b2f7",
"0xb911325bc9d4fd1ad4a6acfe9cc955b555ef46999a0b57fbd440ebbfa3f5c844"
],
"transactionsRoot": "0x2878f3dbdaf71146db52939d26f2bb23014d13d4aa2e8eb0dbb6b4a183c4313a",
"uncles": []
}
3. 트랜잭션 정보를 가져옵니다.
web3.eth.getTransaction()
위 함수는 트랜잭션의 정보를 가져옵니다. 트랜잭션은 FROM과 TO에 계정 정보가 담기게 되고, 이 정보를 활용해서 Account가 포함된 트랜잭션 정보를 확인할 수 있습니다.
getTransactionsByAccount() 함수
async function getTransactionByAccount(account, startBlock, endBlock){
const res = [];
for(let i=startBlock; i<endBlock; i++){
const blockInfo = await web3.eth.getBlock(i);
const transactionsList = blockInfo.transactions;
transactionsList.forEach(async (item)=>{
const txInfo = await web3.eth.getTransaction(item);
if(txInfo.to == account || txInfo.from == account){
res.push(txInfo.hash);
}
})
}
return res;
}
'Blockchain' 카테고리의 다른 글
[회고록] 첫번째 프로젝트(Opensea) 시작 (0) | 2022.08.08 |
---|---|
[Blockchain] 이더스캔 서비스 구축하기 (0) | 2022.08.04 |
[Blockchain] Web3.js 사용 방법 (0) | 2022.07.29 |
[Blockchain] Infura 사용하는 이유 방법 (0) | 2022.07.29 |
[Blockchain] Web3란? (0) | 2022.07.29 |
댓글