본문 바로가기
Block Chain

web3.js(HttpProvider)

by Coarti 2023. 10. 20.

이더리움 네트워크의 특정 노드에 연결하여 트랜잭션을 발생시키고 데이터를 조회할 수 있도록 지원하는 Web3 기반 JS 라이브러리이다.

 

가나슈 CLI가 실행된 상태에서 사용법을 진행하겠다.

ganache-cli
npm install --save web3@1.6.1

dependencies를 보면 다운이 정상적으로 됐다는 것을 확인 할 수 있다. 버전도 중요하니 한번 쯤은 봐두자

 

앞서 IPFS 파일 업/다운로드 환경에서 런타임 환경, 웹 브라우저 환경이 있었다. web3도 마찬가지이다.

 

런타임 환경

 

런타임 환경에서 모듈을 가져오는 방식은 2가지이다.

방식 예시 기본 제공 여부
CommonJS const web3 = require('web3'); O
ESM import web3 from 'web3'; X

Node.js 모듈 시스템 이해 : https://blog.naver.com/pjt3591oo/222574553721

 

[javascript] module system(모듈 시스템) 이해하기

안녕하세요 멍개입니다. 이번 글에서는 Javascript의 모듈 시스템을 다룹니다. ● Javascript 모듈 시스...

blog.naver.com

코드작성은 런타임 환경 기준으로 할 것이다.

웹 브라우저 환경

CDN(Content Delivery Network) 기술을 통해 URL로 콘텐츠를 다운받는다. 웹 작업 시 JQuery, Bootstrap 등을 이용해봤다면 쉽게 이해될 것이다. 아래 주소에서 버전을 확인할 수 있다.

 

CDN : https://cdnjs.com/libraries/web3

 

web3 - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers

Ethereum JavaScript API - Simple. Fast. Reliable. Content delivery at its finest. cdnjs is a free and open-source CDN service trusted by over 12.5% of all websites, serving over 200 billion requests each month, powered by Cloudflare. We make it faster and

cdnjs.com

<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.6.1/web3.min.js"></script>

트러플로 만든 프로젝트 안에 web3라는 디렉토리를 만들어 학습을 위한 코드를 기록하겠다.

네트워크 연결

라이브러리의 사용법은 다음과 같다. WebSocket 프로토콜 || HTTP 프로토콜을 사용하여 노드에서 발생한 이벤트를 수신한다. 중요한 것은 프로토콜에 따라 다른 생성자를 제공한다. 블록 발생, 트랜잭션 발생, 스마트 콘트랙드에서 발생한 이벤트 등을 받으려면 WebSocket 프로토콜을 사용하자 이외의 기능은 동일하다.

const Web3 = require('web3');
let web3FromWS = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8545'));
let web3FromHTTP = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));

 

주소, 개인키, 키스토어 생성
// address.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

// 해당 파일을 실행 할 때마다 해로운 주솟값이 생성됨
// 개인키, 주소 생성
let createdAddress = web3.eth.accounts.create();
console.log(createdAddress);

// 개인키 -> 키스토어 파일 (암호화)
let password = 'test';
let keystore = createdAddress.encrypt(password);
console.log(keystore);

// 키스토어 파일 복구 (복호화)
let private = web3.eth.accounts.decrypt(keystore, password);
console.log(private);

console.log(createdAddress)의 결과

address : 주소 생성

privatekey : 개인키 생성

signTransaction  : signTransaction() 함수는 트랜잭션 객체를 전달하면 해당 정보를 개인키로 서명한다.

sign : sign() 함수는 데이터를 개인키로 서명

encrypt : encrypt() 함수는 비밀번호를 인자로 전달 받아 키스토어에 파일을 만든다.

console.log(keystore)의 결과

encrypt() 함수로 만들어진 키스토어의 내용이다.

console.log(private)의 결과

decrypt() 함수로 키스토어의 내용과 원래의 비밀번호를 받아 복구한 내용이다. 

스프링 시큐리티의 비밀번호 암호화 과정과 비슷하다.

 

만약, 개인키만 알고 있다면 다음으로 복구할 수 있다.

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
// 가나슈 CLI로 생성한 개인키 입력
let PK = '0x8bf6ada38d25824997935701ab5db46fceb94f65af494534e5e33b2869f1064c';
let account = web3.eth.accounts.privateKeyToAccount(PK);
console.log(account);

 


이더리움 전송 트랜잭션(0x0, 0x02)

EIP-1559가 적용된 이더리움은 2가지 형태로 트랜잭션을 발생시킨다. EOA가 지불할 수수료 계산방식의 차이이다.

타입 수수료 계산
0x0 gas * gasPrice
0x02 gas * (maxFeePerGas || maxPriorityFeePerGas)

 

0x0

 

// send_transaction_0x0.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
async function main() {
	// 가나슈 CLI로 생성한 주소
	const from = '0x057E81759BaEe41e3947175695cE32460788E782';
	// from에 대응하는 개인키
	const pk = '0x8bf6ada38d25824997935701ab5db46fceb94f65af494534e5e33b2869f1064c';
	const to = '0xf2Af0bc77a08Ea45C8ce2f6F902048680489A073'; // 그대로 입력
	const tx = {
		from,
		to,
		gas : 21000, // 그대로 입력, 너무 낮은 값은, gasLimiti is too low 에러 발생
		gasPrice : '21000000000', // 그대로 입력
		value : '10' // 원하는 이더 전송 수량
	};
	// 개인키를 account 객체로 복구
	const account = web3.eth.accounts.privateKeyToAccount(pk);
	// 개인키로 트랜잭션 서명
	const signedTx = await account.signTransaction(tx);
	// 서명된 트랜잭션을 노드에 전달
	const sentTx = await web3.eth.sendSignedTransaction(
	signedTx.raw || signedTx.rawTransaction
	);
	console.log(sentTx);
};

main();

개인키만 알면 해당 주소를 찾아 다른 주소로 이더를 전송할 수 있기때문에 개인키 관리가 굉장히 중요하다.

0x02

변수 tx를 수정하면 된다.

// send_transaction_0x02.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
async function main() {
	// 가나슈 CLI로 생성한 주소
	const from = '0x057E81759BaEe41e3947175695cE32460788E782';
	const to = '0xf2Af0bc77a08Ea45C8ce2f6F902048680489A073'; // 그대로 입력
	// from에 대응하는 개인키
	const pk = '0x8bf6ada38d25824997935701ab5db46fceb94f65af494534e5e33b2869f1064c';
	const tx = {
		from : from,
		to : to,
		gas : 25000,
		maxFeePerGas : "0xb2d05e00",		 // 3000000000 == 3Gwei
		maxPriorityFeePerGas : "0xb2d05e00", // 3000000000 == 3Gwei
		value : '10' // 원하는 이더 전송 수량
	};
	// 개인키를 account 객체로 복구
	const account = web3.eth.accounts.privateKeyToAccount(pk);
	// 개인키로 트랜잭션 서명
	const signedTx = await account.signTransaction(tx);
	// 서명된 트랜잭션을 노드에 전달
	const sentTx = await web3.eth.sendSignedTransaction(
	signedTx.raw || signedTx.rawTransaction
	);
	console.log(sentTx);
};

main();

그러나 현재 가나슈 CLI는 EIP-1559가 적용되지 않았기에 트랜잭션이 정상적으로 발생하지 않는다.

 

maxFeePerGas, maxPriorityFeePerGas의 의미만 파악해보자

maxFeePerGas : 사용자가 사용할 수 있는 최대 수수료, 초과시 트랜잭션 취소 남으면 환급함

maxPriorityFeePerGas : 트랜잭션을 블록에 포함시킨 마이너 계정에서 보상할 수수료, 지정한 만큼만 마이너 계정이 가져감 / EIP-1559 이전에는 모두 마이너 계정에서 가져갔음

 

스마트 콘트랙트 배포 트랜잭션

web3.js로도 스마트 콘트랙트를 배포하는 트랜잭션을 생성할 수 있다. 컴파일한 스마트 콘트랙트의 ABI와 Bytecode가 필요하다. 트러플로도 만들었으니 dapp/build/contracts/ 디렉토리 안에 Mung.json파일을 확인할 수 있지만 리믹스에서 Mung.sol에 대한 ABI와 Bytecode를 가져오겠다.

오른쪽 아래에 보면 조그마한 글자를 클릭하면 복사가 된다. 이 두 값을 다음 코드에 입력해주자

// deploy_contract.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

async function main(){
	// 가나슈 CLI로 생성한 주소
	const from = '0x057E81759BaEe41e3947175695cE32460788E782';
	const ABI = [
	{
		"inputs": [
			{
				"internalType": "string",
				"name": "_text",
				"type": "string"
			}
		],
		"stateMutability": "nonpayable",
		"type": "constructor"
	},
	{
		"inputs": [
			{
				"internalType": "uint256",
				"name": "a",
				"type": "uint256"
			}
		],
		"name": "errorOccur",
		"outputs": [
			{
				"internalType": "uint256",
				"name": "",
				"type": "uint256"
			}
		],
		"stateMutability": "pure",
		"type": "function"
	},
	{
		"inputs": [],
		"name": "say",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	},
	{
		"inputs": [
			{
				"internalType": "string",
				"name": "_text",
				"type": "string"
			}
		],
		"name": "setText",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	},
	{
		"inputs": [],
		"name": "text",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	}
];
	const mungContract = new web3.eth.Contract(ABI);
	const Bytecode = '60806040523480156200001157600080fd5b5060405162000a4938038062000a498339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b50506200035a565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b60208210811415620003545762000353620002f5565b5b50919050565b6106df806200036a6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631f1bd692146100515780632404129d1461006f5780635d3a1f9d1461009f578063954ab4b2146100bb575b600080fd5b6100596100d9565b604051610066919061039b565b60405180910390f35b61008960048036038101906100849190610407565b610167565b6040516100969190610443565b60405180910390f35b6100b960048036038101906100b49190610593565b6101b3565b005b6100c36101cd565b6040516100d0919061039b565b60405180910390f35b600080546100e69061060b565b80601f01602080910402602001604051908101604052809291908181526020018280546101129061060b565b801561015f5780601f106101345761010080835404028352916020019161015f565b820191906000526020600020905b81548152906001019060200180831161014257829003601f168201915b505050505081565b60008082146101ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a290610689565b60405180910390fd5b819050919050565b80600090805190602001906101c992919061025f565b5050565b6060600080546101dc9061060b565b80601f01602080910402602001604051908101604052809291908181526020018280546102089061060b565b80156102555780601f1061022a57610100808354040283529160200191610255565b820191906000526020600020905b81548152906001019060200180831161023857829003601f168201915b5050505050905090565b82805461026b9061060b565b90600052602060002090601f01602090048101928261028d57600085556102d4565b82601f106102a657805160ff19168380011785556102d4565b828001600101855582156102d4579182015b828111156102d35782518255916020019190600101906102b8565b5b5090506102e191906102e5565b5090565b5b808211156102fe5760008160009055506001016102e6565b5090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561033c578082015181840152602081019050610321565b8381111561034b576000848401525b50505050565b6000601f19601f8301169050919050565b600061036d82610302565b610377818561030d565b935061038781856020860161031e565b61039081610351565b840191505092915050565b600060208201905081810360008301526103b58184610362565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6103e4816103d1565b81146103ef57600080fd5b50565b600081359050610401816103db565b92915050565b60006020828403121561041d5761041c6103c7565b5b600061042b848285016103f2565b91505092915050565b61043d816103d1565b82525050565b60006020820190506104586000830184610434565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6104a082610351565b810181811067ffffffffffffffff821117156104bf576104be610468565b5b80604052505050565b60006104d26103bd565b90506104de8282610497565b919050565b600067ffffffffffffffff8211156104fe576104fd610468565b5b61050782610351565b9050602081019050919050565b82818337600083830152505050565b6000610536610531846104e3565b6104c8565b90508281526020810184848401111561055257610551610463565b5b61055d848285610514565b509392505050565b600082601f83011261057a5761057961045e565b5b813561058a848260208601610523565b91505092915050565b6000602082840312156105a9576105a86103c7565b5b600082013567ffffffffffffffff8111156105c7576105c66103cc565b5b6105d384828501610565565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061062357607f821691505b60208210811415610637576106366105dc565b5b50919050565b7f68656c6c6f20776f726c64206572726f72000000000000000000000000000000600082015250565b600061067360118361030d565b915061067e8261063d565b602082019050919050565b600060208201905081810360008301526106a281610666565b905091905056fea26469706673582212200c4206c5e1a91793dfe1bc6ebed2a6cf0c98877b3cb9cde12b999ef0eff6f3ca64736f6c634300080a0033';	
	const mung = mungContract.deploy({
		data : Bytecode,
		arguments : ["haha"] // 솔리디티 생성자에 전달할 값
	}).send({
		from : from,
		// 그대로 입력
		// 값이 너무 낮으면 out of gas 에러 : 실행할 코드가 남았는데 수수료를 모두 소모되면 발생
		// 값이 너무 높으면 Exceeds block gas limit 에러 : 트랜잭션의 수수료 사용량이 정해져있기 때문
		gas : '4700000'
	}, (err, contract) => {
		console.log(err);
		console.log(contract); // contract address
	});
}

main();

 

console.log(err)과 console.log(contract)의 결과

결과는 에러는 없기에 null이 출력되고 그 아래 트랜잭션의 해시가 출력된다.

바로 아래에 사용할 CA는 가나슈 CLI를 보면 Contract created ~ 에 있으니 기록해두자

스마트 콘트랙트 함수 호출 트랜잭션

주소, 개인키, ABI를 입력하여 함수를 호출해보자.

 

// call_function.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http:localhost:8545"));
async function main(){
	// 스마트 콘트랙트 주소
	const CA = '0x00eb6f8276e1a4fa95df3c5846edeaa6cec78990';
	// 가나슈 CLI로 생성한 주소
	const from = '0xcCcbE276164070Ac421d2E451976A93860355ECC';
	// from에 대응 하는 private key
	const pk = '0x8f3d61ab0b1c985160c6f07a7709a5a96f03674684345a1f567be0dc5c4db3b4';
	// 리믹스 || 트러플 컴파일 결과 ABI
	const ABI = [
					{
						"inputs": [
							{
								"internalType": "string",
								"name": "_text",
								"type": "string"
							}
						],
						"stateMutability": "nonpayable",
						"type": "constructor"
					},
					{
						"inputs": [
							{
								"internalType": "uint256",
								"name": "a",
								"type": "uint256"
							}
						],
						"name": "errorOccur",
						"outputs": [
							{
								"internalType": "uint256",
								"name": "",
								"type": "uint256"
							}
						],
						"stateMutability": "pure",
						"type": "function"
					},
					{
						"inputs": [],
						"name": "say",
						"outputs": [
							{
								"internalType": "string",
								"name": "",
								"type": "string"
							}
						],
						"stateMutability": "view",
						"type": "function"
					},
					{
						"inputs": [
							{
								"internalType": "string",
								"name": "_text",
								"type": "string"
							}
						],
						"name": "setText",
						"outputs": [],
						"stateMutability": "nonpayable",
						"type": "function"
					},
					{
						"inputs": [],
						"name": "text",
						"outputs": [
							{
								"internalType": "string",
								"name": "",
								"type": "string"
							}
						],
						"stateMutability": "view",
						"type": "function"
					}
				];
	

	// 스마트 콘트랙트 객체 생성
	let Contract = new web3.eth.Contract(ABI, CA);
	
	// 함수 실행, setText() 함수 호출 시 트랜잭션 발생
	let bytedata = await Contract.methods.setText("test").encodeABI();
	console.log(bytedata);
	
	// 0x0 방식
	const tx = {
		from,
		to : CA,
		gas : 1000000, // 그대로 입력
		gasPrice : '21000000000', // 그대로 입력
		data : bytedata,
	};
	
	const account = web3.eth.accounts.privateKeyToAccount(pk);
	const signedTx = await account.signTransaction(tx);
	const sentTx = await web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction);
	console.log(sentTx);
};
main();

여기서 궁금한것은 이 내용을 리믹스에서 실행하면 잘 되는데 cmd에서 작동하면 에러가 나는 이유를 잘모르겠다.

cmd 실행 시 다음과 같은 에러가 발생한다. JSON 작성에 문제가 있다고 표현되는데 이해가 되지 않는 부분이다.

c:\project\block_chain\dapp\web3>node call_function.js

0x5d3a1f9d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000
c:\project\block_chain\node_modules\web3-core-helpers\lib\errors.js:43
        return new Error(message);
               ^

Error: Invalid JSON RPC response: ""
    at Object.InvalidResponse (c:\project\block_chain\node_modules\web3-core-helpers\lib\errors.js:43:16)
    at XMLHttpRequest.request.onreadystatechange (c:\project\block_chain\node_modules\web3-providers-http\lib\index.js:95:32)
    at XMLHttpRequestEventTarget.dispatchEvent (c:\project\block_chain\node_modules\xhr2-cookies\dist\xml-http-request-event-target.js:34:22)
    at XMLHttpRequest._setReadyState (c:\project\block_chain\node_modules\xhr2-cookies\dist\xml-http-request.js:208:14)
    at XMLHttpRequest._onHttpRequestError (c:\project\block_chain\node_modules\xhr2-cookies\dist\xml-http-request.js:349:14)
    at ClientRequest.<anonymous> (c:\project\block_chain\node_modules\xhr2-cookies\dist\xml-http-request.js:252:61)
    at ClientRequest.emit (node:events:513:28)
    at Socket.socketErrorListener (node:_http_client:494:9)
    at Socket.emit (node:events:513:28)
    at emitErrorNT (node:internal/streams/destroy:157:8)
    at emitErrorCloseNT (node:internal/streams/destroy:122:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21)

다음은 리믹스의 결과이다.

0x5d3a1f9d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000

{
	"transactionHash":"0x51cf17c507998d205992e3116791f855826990ed8583881d3229930ace3bbdf1",
	"transactionIndex":0,
    "blockHash":"0x96db7889d473835a6c7f7ffcb7c13dfb02a42950d3ff9b13db566da0c5753e07",
    "blockNumber":2,
    "from":"0x85c4828458b986870f298edffce1f428af4acecb",
    "to":"0xf067f254b766064554d53453c10cd12901a1e26d",
    "gasUsed":29574,
    "cumulativeGasUsed":29574,
    "contractAddress":null,
    "logs":[],
    "status":true,
    "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}

가나슈 CLI의 표시된 결과이다.

스마트 콘트랙트 데이터 조회

deploy_contract.js에서 스마트 콘트랙트를 배포할 때 text 변수의 값을 'haha' 했다. call_function.js에서 'test'로 바꾸는 트랜잭션을 실행했다. 이 스마트 콘트랙트의 text 변수가 변화했는지 확인하는 코드를 작성한다.

 

say() 함수를 호출 해보자.

// data_search.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

async function main() {
	// 배포한 스마트 콘트랙트의 주소
    const CA = '0xb858de9278e9d128141d6c58b96bed811dd67da9';
	const ABI = [
					{
						"inputs": [
							{
								"internalType": "string",
								"name": "_text",
								"type": "string"
							}
						],
						"stateMutability": "nonpayable",
						"type": "constructor"
					},
					{
						"inputs": [
							{
								"internalType": "uint256",
								"name": "a",
								"type": "uint256"
							}
						],
						"name": "errorOccur",
						"outputs": [
							{
								"internalType": "uint256",
								"name": "",
								"type": "uint256"
							}
						],
						"stateMutability": "pure",
						"type": "function"
					},
					{
						"inputs": [],
						"name": "say",
						"outputs": [
							{
								"internalType": "string",
								"name": "",
								"type": "string"
							}
						],
						"stateMutability": "view",
						"type": "function"
					},
					{
						"inputs": [
							{
								"internalType": "string",
								"name": "_text",
								"type": "string"
							}
						],
						"name": "setText",
						"outputs": [],
						"stateMutability": "nonpayable",
						"type": "function"
					},
					{
						"inputs": [],
						"name": "text",
						"outputs": [
							{
								"internalType": "string",
								"name": "",
								"type": "string"
							}
						],
						"stateMutability": "view",
						"type": "function"
					}
				];
    const Contract = new web3.eth.Contract(ABI, CA);

    let data = await Contract.methods.say().call();
    console.log(data);
}
main();

 

실행 결과 'test'를 확인할 수 있고 코드 특징으로 아래쪽에 say().call();을 사용해 함수를 호출했다.

트랜잭션 조회

이번엔 트랜잭션 해시를 사용해보자. 예시코드를 실행하면서 트랜잭션의 해시가 보였을 것이다. call_function.js에서 발생한 트랜잭션의 해시로 조회해보자.

// transaction.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
async function main(){
	let hash = '0x028413ec28d9bf54729bf550082394a14cdbe04ec586529343253658ceb6449d';
	let tx = await web3.eth.getTransaction(hash); // 트랜잭션 정보 가져오기
	console.log(tx);
}
main();

트러플에서 트랜잭션을 발생시켰을 때 출력되는 내용과 비슷한 현태의 결과를 보여준다.

c:\project\block_chain\dapp\web3>node transaction_search.js

{
  hash: '0x028413ec28d9bf54729bf550082394a14cdbe04ec586529343253658ceb6449d',
  nonce: 6,
  blockHash: '0xc7f3105d0eee2d47547acbcddd4ceda68f3c7dcdb2048a6039e2af35bc556f4d',
  blockNumber: 7,
  transactionIndex: 0,
  from: '0x85C4828458B986870f298EDffCE1F428Af4aceCB',
  to: '0xB858De9278e9d128141d6C58B96BEd811dd67Da9',
  value: '0',
  gas: 1000000,
  gasPrice: '21000000000',
  input: '0x5d3a1f9d00(중략)000000',
  v: '0xa95',
  r: '0x5671d3fc3eb6e90cde67da01c70179c859cb2237edd19a9b138e4eecd9ec70a1',
  s: '0x5f22c30426a9a0efa83a95be1d037021b7e5bd6858cfce63410e657070a80e33'
}
블록 조회

블록 번호를 알면 해당 블록의 정보를 조회할 수 있다. 0번 블록의 정보를 확인해보자.

// block_search.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http:localhost:8545"));
async function main(){
	let blockInfo = await web3.eth.getBlock(0); // 블록 정보 가져오기
	console.log(blockInfo);
}
main();

리믹스에서 실행한 결과이다.

{
    "number":0,
    "hash":"0x146c2308433c5f033960ed0ccc8877cb02b034d0a83ef8db36a8f4e9146cc181",
    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "nonce":"0x0000000000000000",
    "sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
    "stateRoot":"0x9857a6d2144d6c29845ad48f7e77207238f0de823d5c81aac4fb9da6cb729566",
    "receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
    "miner":"0x0000000000000000000000000000000000000000",
    "difficulty":"0",
    "totalDifficulty":"0",
    "extraData":"0x",
    "size":1000,
    "gasLimit":6721975,
    "gasUsed":0,
    "timestamp":1697892007,
    "transactions":[],
    "uncles":[]
}
이더리움 보유량 조회
// balance_search.js

const Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider('http:localhost:8545'));

async function main() {
	let balance = await web3.eth.getBalance('127.0.0.1:8545'); // 가나슈 CLI로 생성한 
    console.log(balance);
};

main();

wei(웨이)단위로 출력되는 것을 확인할 수 있다.

c:\project\block_chain\dapp\web3>node balance_search.js

99959263716000000000

 

명칭 Wei(웨이) 기준 이더 기준
Wei 1 0.000000000000000001(10^-18)
Ada 1,000 0.000000000000001
Babbage 1,000,000 0.000000000001
Shannon 1,000,000,000 0.000000001
Szabo 1,000,000,000,000 0.000001
Finney 1,000,000,000,000,000(10^18) 0.001
Ether 1,000,000,000,000,000,000 1
Einstein 1,000,000,000,000,000,000,000 1,000

99.959263716 이더리움을 보유하고 있는 가상 주소인 셈이다.

728x90

'Block Chain' 카테고리의 다른 글

NFT 예시(feat. 장범준님)  (0) 2024.01.26
블록체인  (0) 2023.10.25
Truffle 테스트  (0) 2023.10.20
솔리디티 언어 개발도구(트러플 v5.11.5)  (2) 2023.10.19
솔리디티 언어 개발도구(리믹스)  (0) 2023.10.19