首页>>资讯>>产业

Web3前端 —— viem

2024-02-22 16:59:37 116

介绍


目前,我们很难使用现有的底层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」。

声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!