본문 바로가기
Blockchain

[Blockchain] getTransactionsByAccount() 함수 구현하기

by 개발자 염상진 2022. 8. 4.

 

이더스캔을 보면 지갑 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] Web3란?

이더리움 블록체인 네트워크를 사용한 Dapp을 만든다는 것은 다른 말로 하면 솔리디티 언어로 스마트 컨트랙트를 개발하는 것과, 블록체인과 상호작용할 수 있는 클라이언트(노드)를 개발하는

about-tech.tistory.com

 

 

[Blockchain] W3C 데이터 탈중앙화 표준 DID란?

DID란 무엇인가? DID(Decentralized Identity)는 데이터의 주권을 개개인이 가지고 있고, 중앙집중화된 시스템을 거치지 않고 신원을 증명할 수 있는 기술입니다. DLT(Distributed Ledger Technology, DLT) 기술을..

about-tech.tistory.com

 

 

[Blockchain] 가위바위보 스마트 컨트랙트 개선하기

가위바위보 스마트 컨트랙트 게임을 배포하고 난 후 문제점이 발견됩니다. 새로운 방을 생성한 방장이 입력한 조건값이 트랜잭션에 그대로 노출된다는 점입니다. 스마트 컨트랙트에서 발생한

about-tech.tistory.com

 

댓글