最新的 ethers.js 版本刚刚发布,有一些令人兴奋的新功能,修复了一些bug,改善了质量。
最新的ethers.js版本刚刚发布,有一些令人兴奋的新功能,修复了一些bug,改善了质量。
以太坊和整个区块链领域都关注的一个主要重点是 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通配符其实需要一篇完整的文章来解释,但简而言之,它允许单个解析器响应和解析无限数量的子名称,这可能听起来不是太令人印象深刻,但这对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 API中fetch函数的服务器端实现的一个限制,它与以太币执行的一些内部设置不兼容,这些内部设置是为了提高node.js和浏览器之间的兼容性。
因此,现在有一个skipFetchSetup属性,可以在一个Connection对象上设置,这使得Cloudflare Workers可以毫无障碍地工作!
// Create your provider, specifying to skip fetch setup**
const provider** = new StaticJsonRpcProvider({
url: URL,
skipFetchSetup: true
});
Source:https://medium.com/ricmoo/highlights-ethers-js-march-2022-f511fe1e88a
ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!