Web3 & DApp Development Fundamentals · 강의

컨트랙트 데이터 읽기

view 함수 호출하기

레슨 2/413개 단계

컨트랙트 데이터 읽기은(는) CoddyKit의 무료 Web3 & DApp Development Fundamentals 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Web3 & DApp Development Fundamentals 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Web3 & DApp Development Fundamentals 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Calling View Functions

Reading data from a contract is free — it does not change state, cost gas, or require a signature. These are view and pure functions.

With ethers.js you attach to a deployed contract and call them like normal JavaScript methods.

You Need the ABI

To talk to a contract, ethers needs its ABI — the interface describing each function. You can use the full compiled ABI or a minimal human-readable one:

const abi = [ "function name() view returns (string)", "function balanceOf(address) view returns (uint256)", ];
const abi = [
  "function name() view returns (string)",
  "function balanceOf(address) view returns (uint256)",
];

Creating a Contract Instance

Combine the address, ABI, and a provider to create a read-only contract object:

const contract = new ethers.Contract( tokenAddress, abi, provider );

Because it was given a provider (not a signer), it can only read.

const contract = new ethers.Contract(
  tokenAddress,
  abi,
  provider
);

Calling a Read Method

Call any view function and await the result:

const name = await contract.name(); const supply = await contract.totalSupply(); console.log(name, supply);

Each call returns a Promise that resolves to the decoded value.

const name = await contract.name();
const supply = await contract.totalSupply();
console.log(name, supply);

Passing Arguments

View functions can take parameters. Pass them like normal function arguments:

const balance = await contract.balanceOf( "0xUserAddress" ); console.log(ethers.formatUnits(balance, 18));

ethers encodes the arguments according to the ABI types automatically.

const balance = await contract.balanceOf(
  "0xUserAddress"
);
console.log(ethers.formatUnits(balance, 18));

Handling Returned Numbers

Numeric returns are BigInt in ethers v6. To display token amounts, convert with the right decimals:

const raw = await contract.balanceOf(user); const human = ethers.formatUnits(raw, 18);

Use formatUnits/parseUnits for tokens, formatEther/parseEther for ETH (18 decimals).

const raw = await contract.balanceOf(user);
const human = ethers.formatUnits(raw, 18);

Returns with Multiple Values

If a function returns several values, ethers gives you a result array you can destructure:

const [reserve0, reserve1, timestamp] = await pair.getReserves(); console.log(reserve0, reserve1);

Named return values are also accessible by name on the result object.

const [reserve0, reserve1, timestamp] =
  await pair.getReserves();
console.log(reserve0, reserve1);

Reading at a Past Block

You can query historical state by passing a block tag as an override:

const oldBalance = await contract.balanceOf( user, { blockTag: 19000000 } );

This requires an archive node, but lets you reconstruct past state.

const oldBalance = await contract.balanceOf(
  user,
  { blockTag: 19000000 }
);

Static Calls on Write Functions

Sometimes you want to simulate a state-changing function without sending it, to read its would-be result or check it does not revert:

const result = await contract.transfer .staticCall(to, amount); console.log("Would return:", result);

This runs the call locally without broadcasting a transaction.

const result = await contract.transfer
  .staticCall(to, amount);
console.log("Would return:", result);

Reads Are Free

Because view calls execute on the node without changing state:

  • They cost no gas for the caller.
  • They need no signer or wallet approval.
  • They return almost instantly.

Only state changes require a transaction and gas.

Using a Hardhat-Attached Instance

In Hardhat scripts you can attach to a deployed address without writing the ABI by hand, since artifacts are already compiled:

const token = await ethers.getContractAt( "MyToken", deployedAddress ); console.log(await token.totalSupply());

ethers loads the ABI from the artifact for you.

const token = await ethers.getContractAt(
  "MyToken",
  deployedAddress
);
console.log(await token.totalSupply());

Quick Check

Test your understanding of reading contract data.

Recap

You learned to read on-chain data.

  • Create a contract with address + ABI + provider for read-only access.
  • Call view functions like normal methods and await the result.
  • Numeric returns are BigInt; convert with formatUnits/formatEther.
  • Destructure multiple return values; query the past with blockTag.
  • Use staticCall to simulate write functions; reads are free.
무료로 시작

AI 튜터와 함께 Web3 & DApp Development Fundamentals을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
29
레슨
105

자주 묻는 질문

“컨트랙트 데이터 읽기” 강의는 무료인가요?

네 — “컨트랙트 데이터 읽기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Web3 & DApp Development Fundamentals 강의 전체를 잠금 해제할 수 있습니다. Web3 & DApp Development Fundamentals 강의에는 총 4개의 강의가 포함되어 있습니다.

“컨트랙트 데이터 읽기”에서 뭘 배우나요?

view 함수 호출하기 브라우저에서 직접 실행하는 실습 코드로 Web3 & DApp Development Fundamentals을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Web3 & DApp Development Fundamentals을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Web3 & DApp Development Fundamentals은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“컨트랙트 데이터 읽기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Web3 & DApp Development Fundamentals 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Web3 & DApp Development Fundamentals 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 프로바이더에 연결하기
  2. 컨트랙트 데이터 읽기
  3. 트랜잭션 보내기
  4. 이벤트 수신하기
← Web3 & DApp Development Fundamentals(으)로 돌아가기