近期ethers.js的亮点

最新的 ethers.js 版本刚刚发布,有一些令人兴奋的新功能,修复了一些bug,改善了质量。

最新的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篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

本文首发于:https://mp.weixin.qq.com/s/yaV5sOWmyA3sjyrYx1v_WA

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ChinaDeFi 去中心化金融社区
ChinaDeFi 去中心化金融社区
ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。