
最新的ethers.js版本刚刚发布,有一些令人兴奋的新功能,修复了一些bug,改善了质量。
对我们的L2进行链下查找(通过CCIP)
以太坊和整个区块链领域都关注的一个主要重点是 L2 支持,它从降低gas、增加交易容量和允许更快的交互等方面改善了整个体验。
在最新确定的CCIP Read(以前的Durin)标准下,view和pure合约可以将它们的响应推迟到存储和数据处理成本低廉的链下服务,然后由作者认为可以接受的任何安全机制来验证该响应。
所有与ENS相关的高级调用现在都支持CCIP Read,这使得它可以解析地址(包括多种币,如BTC)、化身、内容哈希和内置ENS解析器处理的任何其他功能。
要将 CCIP Read 用于我么自己的 dapp 和合约, CCIP Read必须在任何调用中通过设置ccipReadEnabled属性显式启用,否则任何CCIP链下查找请求将像任何正常的CALL_EXCEPTION一样。
*// To make a CCIP Read call, you must explicitly enable it, but // then the rest of the magic just happens 🙂 *await provider.call({ to: contractAddress, data: “0x6352211e” ccipReadEnabled: true })
下面是一个简短的合约示例,以帮助说明整个想法。大多数人可以跳过这一点,但我知道有些人会渴望一个例子。
// Example Solidity Contract// All ownership is kept off-chain, with a single merkle-root// within the contract encoding ownership on-chain.// How this merkle-root is updated is left as an exercise// to the reader; batched updates, signed messages or// zk-snarks are all splendid ideas. :)contract MyCcipTest { bytes32 _merkleRoot; error OffchainLookup(address, string[], bytes, bytes4, bytes); function ownerOf(uint token) public view returns (address) { // This URL will provide the merkle proof; we allow // fallback urls in case one is down string[] memory urls = new string[](2); urls[0] = "https://api.sprinkles.gallery/{sender}/{data}"; urls[1] = "https://api-2.sprinkles.gallery/{sender}/{data}"; // Remember the token ID for later in verifyOwner bytes memory extraData = abi.encode(token); // Defer to the interwebs revert OffchainLookup( address(this), urls, callData, this.verifyOwner.selector, extraData); } function verifyOwner(bytes calldata result, bytes calldata extraData) public view returns (address) { // Get the original contract.ownerOf details uint token = abi.decode(extraData, (uint)); // Parse the server response (address owner, bytes32 memory proof[]) = abi.decode(result, (address, bytes[])); // Compute this entry in the merkle tree bytes32 leaf = keccak256(abi.encodePacked(owner, token)); // Throws if the merkle proof fails; otherwise owner is correct verifyMerkleProof(_merkleRoot, leaf, proof); // Fetched off-chain, verified on-chain! Huzzah! return owner; }}
安全
引入CCIP Read可能存在安全问题,这就是为什么每次调用都需要显式启用它。
由于外部web资源是根据合约获取的,而合约可能是由无需信任的参与者控制的,因此应该仔细考虑对无需信任合约的自动调用(无需用户交互),因为它可能泄露用户的IP地址或用于协调DDoS攻击。
由于这些原因,Provider还公开了一个新方法,其子类可以覆盖该方法,例如通过匿名服务代理请求或拒绝无需信任的url或合约。
// Example Customer Provider which rejects urls based on// some method `isSafeUrl`. It could extend any BaseProvider.class MyCustomProvider extends JsonRpcProvider { ccipReadFetch(tx, calldata, urls) { urls = urls.filter(u => isSafeUrl(u)); return super.ccipReadFetch(tx, calldata, urls); }}
对于那些希望完全和明确地禁用任何和所有CCIP Read功能的人来说,在provider上有一个disableCcipRead属性。
// Fully disable CCIP Read functionality in your project, // including ENS resolution* *provider.disableCcipRead = true
ENS通配符支持(EIP-2544)
这是另一个我非常喜欢的功能。
ENS通配符其实需要一篇完整的文章来解释,但简而言之,它允许单个解析器响应和解析无限数量的子名称,这可能听起来不是太令人印象深刻,但这对L2采用有着重大影响。
例如,我的一个玩具项目(目前只部署到Ropsten),hatch.eth解析所有*.hatch.ethENS 名称。
对于任何给定的ENS名称,例如ricmoo.eth,该名称的所有者拥有对Wisp代理钱包的独家访问权,该钱包可以部署到ricmo .hatch.eth。给ricmoo.hatch.eth发送以太或代币,只有ricmoo.eth的所有者可以访问它们。
所有者不需要执行任何操作。在不需要任何用户交互的情况下,就可以立即获得无限活跃和有用的 ENS 子名称。
事实上,我们可以将资产发送到任何ENS名称,即使所有者没有配置它。
更奇怪的是,用户实际上可以将资产发送到从未注册过的ENS名称,尽管这是不明智的,因为无论谁先成功注册了这个名称,就可以获得该资产。
因此,ENS的通配符能够实现许多疯狂的很棒的想法。
Cloudflare Worker
我很高兴有人指出了Cloudflare Worker环境中以太币的问题,因为它很快就成为了我最喜欢的服务之一。
这个问题归结为Cloudflare Worker API中fetch函数的服务器端实现的一个限制,它与以太币执行的一些内部设置不兼容,这些内部设置是为了提高node.js和浏览器之间的兼容性。
因此,现在有一个skipFetchSetup属性,可以在一个Connection对象上设置,这使得Cloudflare Workers可以毫无障碍地工作!
// Create your provider, specifying to skip fetch setup** const provider** = new StaticJsonRpcProvider({ url: URL, skipFetchSetup: true });
比特和字节
- 现在我们有了更多的后EIP -1559世界的数据,我们有一些关于近似uncle和MEV风险的更新数据,因此默认值maxPriorityFeePerGas已从2.5 gwei 更改为 1.5 gwei。
- 除了websocket URL之外,WebSocketProvider现在还可以接受一个现有的WebSocket对象,该对象允许自定义配置,例如自定义标头、证书或任何我们想要的东西。
- 错误现在包括一个URL,该URL链接到有关问题、原因和可能解决方案的更多细节,该URL将随着时间的推移进行更新,以在调试意外问题时提供更多帮助。
- 所有接受签名的函数和方法现在也可以接受一个紧凑的签名,因为EIP-2098已经成为最终版本。
- 很长一段时间以来,这一直是很多人的痛点,但是现在provider.getBlock完全支持pending区块。
- 经过大量的实验和研究,快速区块时间网络(如Polygon和BSC)上的问题应该得到解决,当网络的getLogs并不总是可靠时,使用更强大的算法来有效地处理轮询事件。
Source:https://medium.com/ricmoo/highlights-ethers-js-march-2022-f511fe1e88a
关于
ChinaDeFi – ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
Layer 2道友 – 欢迎对Layer 2感兴趣的区块链技术爱好者、研究分析人与Gavin(微信: chinadefi)联系,共同探讨Layer 2带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”。
