介绍
目前,我们很难使用现有的底层TypeScript 以太坊库来实现与Ethereum的交互,或多或少都存在一定的问题,比如包体积太大、性能较低等。而viem,专注于稳定性、开发者体验、包大小和性能,为用户提供尽可能最佳的开发者体验。
基本概念
Actions
Actions指访问或者操作Ethereum的方法。比如获取区块链的信息等。在viem中Actions被分为了3类:
「Public Actions」。与Public Client一起使用。它们不需要任何特殊权限,也不向用户提供签名功能,提供了一种简单而安全的方式来访问以太坊区块链上的公共数据。它们被 dapp 和其他需要检索网络上交易、账户、区块和其他数据信息的应用程序广泛使用。例如getBlock、getBlockNum等。
「Wallet Actions」。与Wallet Client一起使用。它们需要特殊权限并提供签名功能,提供了一种安全、灵活的方式来访问用户的帐户并在以太坊网络上执行操作。它们通常由 dapp 和其他需要执行交易、与智能合约交互或签署消息的应用程序使用。例如sendTransaction、signMessage等。
「Test Actions」。与Test Client一起使用。它们提供了一种测试和模拟以太坊网络上不同场景的方法。它们通常由正在构建 dapp 和其他需要在部署到网络之前进行测试的应用程序的开发人员使用。通过使用测试操作,开发人员可以在受控环境中测试其应用程序的行为,这使得识别和修复错误变得更加容易,并确保应用程序在部署到网络时能够按预期工作。例如setBalance、mine等。
Clients & Transports & Chains
Clients
类比打电话,你需要一部手机和电话卡,手机就是Client,而电话卡就是Transports。在viem中Clients被分为3类,和Actions一一对应。
「Public Client」。提供了访问Public Actions集合里面的所有方法的权限。
「Wallet Client」。提供了访问Wallet Actions集合里面的所有方法的权限。
「Test Client」。提供了访问Test Actions集合里面的所有方法的权限。
Transports
Transports是负责执行传出请求(即 RPC 请求)的中间层。在viem中Transports被分为3类。
通过 HTTP JSON-RPC API 执行请求的 HTTP 传输
通过 WebSocket JSON-RPC API 执行请求的WebSocket 传输。
通过EIP-1193函数执行请求的自定义传输。
Chains
viem/chains包含了对流行的 EVM 兼容链的引用。例如:Polygon、Optimism、Avalanche、Base、Zora 等,开发过程中根据需求选择不同的链即可。
import { createPublicClient, http } from'viem'
import { zora } from'viem/chains'
const client = createPublicClient({
chain: mainnet,
transport: http()
})
Account
我们在操作Wallet Action时需要签名等操作。Account是对你身份的证明,就跟web2的账户密码登录类似。在viem中Account被分为2类。
JSON-RPC Account
JSON-RPC Account只需初始化为地址字符串。在实际开发中首先通过浏览器插件提供的API获取地址,这个地址就是JSON-RPC Account,具体如下:
import'viem/window'
import { createWalletClient, custom } from'viem'
import { mainnet } from'viem/chains'
const [address] = awaitwindow.ethereum.request({
method: 'eth_requestAccounts'
})
const client = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
const hash = await client.sendTransaction({
account: address,
to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
value: parseEther('0.001')
})
当执行sendTransaction时,会拉起浏览器插件钱包的签名弹框,所以之后的交易和消息的签名由浏览器插件来帮我们执行。
Local Accounts
Local Account 使用私钥在本地执行事务和消息的签名,和JSON-RPC Account不同,不要借助第三方进行签名。
import { createWalletClient, http, parseEther } from'viem'
import { privateKeyToAccount } from'viem/accounts'
import { mainnet } from'viem/chains'
const client = createWalletClient({
chain: mainnet,
transport: http()
})
const account = privateKeyToAccount('0x...')
const hash = await client.sendTransaction({
account,
to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
value: parseEther('0.001')
})
当执行sendTransaction时,执行都在本地。
到这里,viem中比较重要的概念都介绍完了,如果想查看更多API,请看下面:「https://viem.sh」。
声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!