[Tech] Viem 이란 ? (Read & Write)

Tech At CHANNEL-iN
@CHANNEL-iN
Published in
13 min readJan 23, 2024

이번 시간에는 Viem 이라는 라이브러리를 저와함께 가볍게 배워봅시다.

목차

  1. Viem 이란?
  2. 블록 정보 확인
  3. 스마트 계약 읽기
  4. 스마트 계약 쓰기

1. Viem 이란?

viem이란 블록체인 네트워크와 상호작용하기위해 나온 Web3 라이브러리입니다.

그럼 Web3, ethers 같은 다른 라이브러리가 있는데 굳이 Viem일까요?

지금까지 Web3 와 ethers 달리 Viem은 속도가 빠르다는 장점이 있습니다

또한 라이브러리를 설치받을때 필요한 메모리도 현저히 줄어들었습니다.

1. 블록 정보 확인

viem 라이브러리를 통해 블록 정보를 확인해 봅시다.

  1. viem 설치
npm install viem

2. 블록체인 네트워크와 상호작용 하기

const publicClient = createPublicClient({
chain: mainnet,
transport: http()
})

이 코드를 실행함으로써 mainnet인 이더리움과 상호작용 할 수 있습니다.

3. 블록 정보 얻어오기

  const getBlockInformation = async () => {

const block = await publicClient.getBlock();
const blockNumber = await publicClient.getBlockNumber();
console.log('블록 : ',block)
console.log('블록 숫자 : ',blockNumber)

}

getBlockInformation 함수를 실행해서 콘솔값을 확인해 봅시다.

블록 :  {
baseFeePerGas: 9346668767n,
difficulty: 0n,
extraData: '0x4070656e6775696e6275696c642e6f7267',
gasLimit: 30000000n,
gasUsed: 15807668n,
hash: '0xff90ee621f8521551def9a5f56ce526614fb624614007a7b1723463aa25a9afa',
logsBloom: '0xb3b3f207d5947717f38cd5629ea33ca1d7692991de5966f7a90ba2e2e56f729201421788aa0ba3c87f187c42e8be231f5e65aa498b707def48388ebdc0f87da28fc76e7fefe9c9eefb93532bedbc32fdddd84bffb17b9dd8fa411478c739ff015b8c424e1ff31e2b42e95cff79e94ae7233b4df676ec77a573cfde5cc4ff0b9842e8eef8fabc30b6b66f4558438e7de0541b2e5b8f3a8fb97237fdece632a81edfeaaf617dbee816deb567e4f49ee6a5ad98f6746d3ef3dbac65fbe2a4e90838b5df17268ccbc0b2c1f2b3f32f7f74ef77fd0cffa4a8e0984ded588a93372644557bb7fb6f5e0de8fb24549bbac91169a87d705458ee7e6ec285e9c1e24456aa',
miner: '0xf15689636571dba322b48e9ec9ba6cfb3df818e1',
mixHash: '0xabafece1879ff3b32fb29b5bd43a01b7816eb93b788cd1ab1600ce03a042fd6e',
nonce: '0x0000000000000000',
number: 19067692n,
parentHash: '0x3772e2432959d33f2202494dd69268c83c2e84708c0913236e6bbdadfc7e3872',
receiptsRoot: '0xcae95262cdfcfd1c6ab6069d10d0de7c53cbfc91dd84ad6bc4829057c9b93d64',
sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
size: 158956n,
stateRoot: '0xa772990b540ccd762e1e620a297043ed14542582584695c3848009caa5d52b27',
timestamp: 1705992503n,
totalDifficulty: 58750003716598352816469n,
transactions: [
'0x1580cf31fa1d01218b650cc37a7e31dff05aee3c1c3b6d1e072378bbfa87b5ae',
'0x4f1a78ff5cef17c9dfe3fd3fd40fbd79c41c6ba8b6ab968bbfa79a732a8d6916',
'0x4a37d93cfb034386f7444bfe395aebe8ffb86ac9db565f2e3784fbdea5ca3a2e',
'0x275308953206eee90d91951a07b16b7779399707695cda251e2711d811a2f93b',
'0x3595477f35263fc4a7f8a070b1cb9c7d769fe2abd95d4791557409fee1c64862',
... 54 more items
],
transactionsRoot: '0x8ce540f7131166038ab4b8affd5b0854eff94ee8cd607372165963ee55bac18f',
uncles: [],
withdrawals: [
{
index: '0x1f045c2',
validatorIndex: '0x109ac9',
address: '0x210b3cb99fa1de0a64085fa80e18c22fe4722a1b',
amount: '0x1095409'
},
{
index: '0x1f045c3',
validatorIndex: '0x109aca',
address: '0x210b3cb99fa1de0a64085fa80e18c22fe4722a1b',
amount: '0x10891f5'
},
{
index: '0x1f045c4',
validatorIndex: '0x109acb',
address: '0x210b3cb99fa1de0a64085fa80e18c22fe4722a1b',
amount: '0x109734e'
},
{
index: '0x1f045c5',
validatorIndex: '0x109acc',
address: '0x210b3cb99fa1de0a64085fa80e18c22fe4722a1b',
amount: '0x10855b3'
}
],
withdrawalsRoot: '0x228e9f31cde997bafe586bdffb80220d3c1840d81e9d56cad66a947baaed4e60'
}
블록 숫자 : 19067692n

블록에는 현재 이더리움 블록에 대한 정보가 쭉 나와있습니다

블록 숫자는 이더리움 네트워크에 총 등록된 블록의 수입니다.

2. Read Contract

Read Contract는 말 그대로 컨트랙트의 정보를 읽어올 수 있는 코드입니다.

전체코드를 보고 하나하나씩 뜯어봅시다.

const readContract = async () => {

const contract = getContract({
address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
abi: TetherABI,
publicClient,
});


const totalSupply = await contract.read.totalSupply();
const name = await contract.read.name();
const symbol = await contract.read.symbol();
const balance = await contract.read.balanceOf("Your Address");


console.log('총 공급량 : ',totalSupply);
console.log('토큰 이름 : ',name );
console.log('토큰 심볼 : ',symbol);
console.log('토큰 잔액',balance);
}

getContract 함수를 이용해서 내가 얻고싶은 컨트랙트의 정보를 얻습니다.

address 에는 컨트랙트의 주소를 넣어줍니다

abi는 그 컨트랙트의 abi를 넣어줍니다

publicClient는 위에서 정의한 publicClient를 넣어줍니다.

그렇게 contract 상수에 담아주면 contract에 관한 정보들을 얻을 수 있습니다

balanceof 는 지갑 주소가 해당하는 토큰을 얼마나 보유하고 있는지를

보여줍니다.

3. Write Contract

Write contract는 컨트랙트 안에있는 함수를 호출할 수 있게 해줍니다.

그럼 제가 만든 간단한 컨트랙트를 한번 봐봅시다.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.13;



contract Storage {

uint256 number = 0;


function store(uint256 num) public {
number = num;
}


function retrieve() public view returns (uint256) {
return number;
}


}

간단하게 store 함수에다 숫자를 넣어주면 number 값이 바뀌는

컨트랙트입니다.

이제 writeContract 전체 코드를 살펴봅시다.

const writeContract = async () => {


const account = privateKeyToAccount("Your Private Key");


const walletClient = createWalletClient({
account,
chain: sepolia,
transport: http('https://eth-sepolia.g.alchemy.com/v2/"Your API KEY"')
}).extend(publicActions)


const { request } = await walletClient.simulateContract({
// 컨트랙트 주소
address : "0xdc5a32786E2748C612b7C3CBdc65A272340E7611",
abi : TestABI,
functionName : "store",
args : [100],
account,
});


const hash = await walletClient.writeContract(request);
console.log('hash?',hash)

}

지갑 개인키를 받아서 지갑 주소를 반환 해주는 코드입니다.

const account = privateKeyToAccount("Your Private Key");

함수를 실행시키려면 지갑이 필요하기에 지갑을 생성해주는 코드입니다.

const walletClient = createWalletClient({
account,
chain: sepolia,
transport: http('https://eth-sepolia.g.alchemy.com/v2/"Your API KEY"')
}).extend(publicActions)

지갑 주소, 메인넷 , trasport(블록체인 네트워크와 상호작용하는 코드)

를 넣어줍니다.

실제 컨트랙트 함수에 값을 넣어주는 코드입니다.

  const { request } = await walletClient.simulateContract({
// 컨트랙트 주소
address : "0xdc5a32786E2748C612b7C3CBdc65A272340E7611",
abi : TestABI,
functionName : "store",
args : [100],
account,
});

address : 스마트 컨트랙트의 주소를 넣어줍니다.

abi : 스마트 컨트랙트의 abi를 넣어줍니다

functionName : 값을 넣어줄 함수의 이름을 넣어줍니다

args: 파라미터 값을 넣어줍니다

account: 지갑 주소를 넣어줍니다

const hash = await walletClient.writeContract(request);

walletClient에 우리가 작성했던 request 를 넣어 스마트 컨트랙에 요청을 보냅니다.

그러면 hash값이 들어옵니다.

결과값

hash? 0x2f2c0b2269f98c6abad32baf6b587bcec46ab9e13c94c9c9136909e203411f26

이 hash값을 가지고 etherscan에 조회 해봅시다.

성공적으로 우리가 작성한 Store함수가 실행되었다고 알려주네요

그럼 Remix에 가서 정말 number값이 바뀌었는지 확인해봅시다.

성공적으로 number의 값이 바뀐걸 확인했습니다.

이렇듯 이번시간에는 Web3 라이브러리인 VIEM을 사용해서

블록의 정보 , 컨트랙트를 읽고 쓰기를 같이 해봤습니다

오늘도 유익한 글이 되었으면 좋겠습니다 감사합니다.

예제 깃헙 링크

--

--