0Pricing
Web3 & DApp Development Fundamentals · 课时

读取合约数据

调用 view 函数

读取合约数据 是 CoddyKit 上的免费 Web3 & DApp Development Fundamentals 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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 课程的其余内容,请升级到 CoddyKit PRO。 Web3 & DApp Development Fundamentals 课程共包含 4 节课。

「读取合约数据」这节课中我会学到什么?

调用 view 函数 你通过在浏览器中直接运行的动手代码来练习 Web3 & DApp Development Fundamentals,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Web3 & DApp Development Fundamentals 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Web3 & DApp Development Fundamentals 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「读取合约数据」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Web3 & DApp Development Fundamentals 课中编写并运行代码吗?

能。每节 Web3 & DApp Development Fundamentals 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 连接到提供者
  2. 读取合约数据
  3. 发送交易
  4. 监听事件
← 返回 Web3 & DApp Development Fundamentals