区块链中文技术社区 - 2023年3月
type: channel
link: https://www.bcskill.com/index.php/2023/03
description: 区块链,EOS,Ethereum,IPFS,Dapp技能学习
items: 用Hardhat在zkEVM上部署一个动态NFT
items: Goerli 与zkEVM Testnet跨链测试
items: Silkworm - C++ 以太坊执行客户端
items: 区块链模块化设计是未来吗？
items: opside 跨链测试
items: 分析0xSplits - 收入拆分协议
items: Solidity Gas 优化 - 理解不同变量 Gas 差异
items: ETH2.0 技术调研和测试部署
items: 以太坊签名数据库
items: Goerli 与 Sepolia 测试网比较：哪个更好？

用Hardhat在zkEVM上部署一个动态NFT
type: item
date: 2023-03-30T22:29:03+08:00
description: 使用Hardhat在zkEVM Testnet上部署一个Onchain的SVG动画NFT 什么是zkEVM 简而言之，Polygon zkEVM是一个二级扩容解决方案，旨在实现EVM-equivalence（等效），并允许你使用现有的Solidity代码更便宜、更快、更安全地部署合约到它。 想进一步深入了解它吗？请看我的另一篇文章：如何将ERC20代币合约部署到zkEVM Testnet。 准备网络与Token 建议使用Polygon zkEVM Bridge 站点，将网络添加到我们的钱包，并将 Goerli Token 桥接到 zkEVM Testnet： 环境要求 在我们开始之前，请确保你的电脑上已经安装了以下依赖：NVM或Node v18.15.0，并且已经配置了钱包，并且goerli 测试网代币被桥接到了zkEVM Testnet。如果你想了解如何做到这一点，请查看我的另一篇文章如何将ERC20合约部署到zkEVM Testnet。 用Hardhat部署合约 让我们建立一个ERC721 NFT，并通过Hardhat将其部署到zkEVM。 为了确保我们从新开始，我们将利用Hardhat模板生成一个基本的TypeScript项目。 # Create our project folder mkdir zkevm-erc721-hardhat; cd zkevm-erc721-hardhat; npx hardhat; # Expected Output: # Ok to proceed? (y) y # 888 888 888 888 888 # 888 888 888 888 888 # 888 888 888 888 888 # 8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 # 888 888 "88b 888P" d88" 888 888 "88b "88b 888 # 888 888 .d888888 888 888 888 888 888 .d888888 888 # 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. # 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 # # Welcome to Hardhat v2.13.0 # # ? What do you want to do? … # Create a JavaScript project # ❯ Create a TypeScript project # Create an empty hardhat.config.js # Quit # # ✔ What do you want to do? · Create a TypeScript project # ✔ Hardhat project root: · /path/to/zkevm-erc721-hardhat # ✔ Do you want to add a .gitignore? (Y/n) · y # ✔ Do you want to install this sample project's dependencies with npm (hardhat @nomicfoundation/hardhat-toolbox)? (Y/n) · y 接下来，让我们安装依赖项: npme install; npm install @openzeppelin/contracts dotenv; 创建我们的NFT 我们这里的NFT，将通过引入一个动画的SVG来使它突出一点。 首先删除默认生成的模板化合约，并在其目录上创建一个新的合约。 rm contracts/Lock.sol; touch contracts/zkEVMNFT.sol; 在该文件中，复制并粘贴以下NFT solidity代码。 文件： ./contracts/zkEVMNFT.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; // Imports // ======================================================== import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; // Cont…

Goerli 与zkEVM Testnet跨链测试
type: item
date: 2023-03-30T22:17:00+08:00
description: 使用Polygon zkEVM Bridge 站点，将网络添加到我们的钱包，并将 Goerli Token 桥接到 zkEVM Testnet： Goerli Token转0.01 ETH到zkEVM Testnet 交易：0x10210572d6b4924af7ef946136295e9b209e1fa0 -> 0xf6beeebb578e214ca9e23b0e9683454ff88ed2a7 tx hash: https://goerli.etherscan.io/tx/0x07aa6363c5854180b41b8c4584314ca6d6af989d48332375f06f9caef3270dd7 执行合约 bridgeAsset(uint32 destinationNetwork,address destinationAddress,uint256 amount,address token,bool forceUpdateGlobalExitRoot,bytes permitData) 执行参数 Name Type Data 0 destinationNetwork uint32 1 1 destinationAddress address 0x10210572d6b4924Af7Ef946136295e9b209E1FA0 2 amount uint256 10000000000000000 3 token address 0x0000000000000000000000000000000000000000 4 forceUpdateGlobalExitRoot bool true 5 permitData bytes 0xF6BEEeBB578e214CA9E23B0e9683454Ff88Ed2A7为代理合约，使用EIP-1967 Transparent Proxy 逻辑合约地址：0x39e780D8800f7396e8B7530A8925B14025AedC77 关键逻辑合约代码：https://goerli.etherscan.io/address/0x39e780d8800f7396e8b7530a8925b14025aedc77#code 合约bridgeAsset接口源码 /** * @notice Deposit add a new leaf to the merkle tree * @param destinationNetwork Network destination * @param destinationAddress Address destination * @param amount Amount of tokens * @param token Token address, 0 address is reserved for ether * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not * @param permitData Raw data of the call `permit` of the token */ function bridgeAsset( uint32 destinationNetwork, address destinationAddress, uint256 amount, address token, bool forceUpdateGlobalExitRoot, bytes calldata permitData ) public payable virtual ifNotEmergencyState nonReentrant { if ( destinationNetwork == networkID || destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS ) { revert DestinationNetworkInvalid(); } address originTokenAddress; uint32 originNetwork; bytes memory metadata; uint256 leafAmount = amount; if (token == address(0)) { // Ether transfer if (msg.value != amount) { revert AmountDoesNotMatchMsgValue(); } // Ether is treated as ether from mainnet originNetwork = …

Silkworm - C++ 以太坊执行客户端
type: item
date: 2023-03-30T21:40:04+08:00
description: GitHub：https://github.com/torquem-ch/silkworm 引用于EOS EVM Silkworm 架构设计 EOS EVM 的推出时间表曾发生过一些变化，而导致这一变化的原因之一是实施 Silkworm 作为 EOS EVM 的执行客户端，这是一个主要架构增强优化。 Silkworm 是 Ethereum 节点的 C++ 实现，符合 Erigon 的规范。 它被用于支持 RPC 并提高该领域的兼容性。 它的设计目标是成为最快的以太坊客户端，同时不牺牲代码的性能或可读性。 以下是 EtherWorld 的一篇文章，其中介绍了 Silkworm 强大功能的一些要点： Silkworm 更容易理解，因为其代码库是新的，并且不包含任何主要的遗留功能。 它在开发者社区保持中立客观。 Silkworm 采用 Apache-2.0 许可协议进行许可。 此许可证是 Permissive，这意味着它的限制最少，可以在大多数项目中使用。 Silkworm 使用 evmone 作为其 EVM 解释器，这是已知的最快、完全兼容的 EVM 实现。 Silkworm 使用 MDBX，它是最快的嵌入式键值存储，具有完全 ACID 交易。 // TODO 代码分析

区块链模块化设计是未来吗？
type: item
date: 2023-03-30T18:45:00+08:00
description: 如何使用模块化可能是突破不可能三角的一个途径。 介绍 大约十年前，世界见证了移动智能手机的增长。当时，一些大公司认为他们可以通过引入模块化架构来彻底改变智能手机。2013 年，谷歌发布了 Project Ara，这是一款采用模块化设计的新型智能手机。与今天由密封的铝和玻璃片制成的“单体”手机不同，Ara 允许用户以多种方式定制他们的手机，使所有基本部件都可以模块化。你不会被迫频繁升级到新手机。相反，你可以根据自己的喜好简单地为旧手机添加最好的新部件。可悲的是，模块化并没有在手机生态系统中取得成功，这个概念仍然是一段几乎被遗忘的技术历史。 模块化智能手机可以作为模块化区块链的警示故事，因为尽管当前工具存在合理的缺点，但新的和令人兴奋的解决方案的炒作并不能保证长期的胜利。然而，就区块链而言，用户对可扩展性的需求已经在推动开发人员构建和采用模块化架构。这种需求使得模块化区块链架构不太可能与模块化智能手机那样，遵循相同的命运。 但究竟什么是模块化区块链架构？我们如何确保这些解决方案不会成为另一个 Project Ara？这篇文章希望能回答所有这些问题。 单体和模块化 在进一步深入研究之前，让我们梳理一下单体架构和模块化架构之间的区别。介绍这个概念的最简单方法是举一个类似而熟悉的概念的例子。正如手机有一些核心部件，比如摄像头、电池和触摸屏，区块链也有核心部件。 iPhone 是“单体”手机的一个很好的例子。它配备了使用手机所需的所有部件，并没有提供太多定制选项。当然，你可能无法对内部进行太多定制，但它既流畅又快速。但是，有时你可能希望进一步自定义你的手机。假设随着岁月的流逝，新手机配备了更好的相机。过时手机的其余部分可能工作正常，但使用现有的相机，你无法获得新手机那样的体验。 使用模块化架构，你不必购买全新的手机。相反，你可以像乐高积木一样更换相机，然后换上更好的相机。 Google 的 Project Ara 是模块化手机的一个例子。这款手机由积木制成，可以根据你的选择换入和换出零件。只要有兼容的部件，Ara 都会支持。 与智能手机一样，区块链由多个基本组件组成；这些组件如下所示： 共识 区块链的共识层通过计算机网络就链的状态达成共识来提供排序和最终性。 执行 该层通过运行指定的代码来处理交易。它也是用户通常与区块链交互的地方，例如通过签署交易、部署智能合约和转移资产。 结算 结算层用作验证在第 2 层执行的活动的平台，例如Rollup以及争议解决。最重要的是，它是记录实际区块链最终状态的地方。 数据可用性 验证状态转换是否有效所需的数据应发布并存储在该层上。在发生攻击或操作失误，区块生产者未能提供交易数据的情况下，这应该是容易检索和验证的。 简而言之，单体式区块链在单个软件中自行执行所有这些任务，而模块化区块链将它们分成多个软件。现在，你可能想知道一次处理所有这些任务的区块链有什么缺点？ 这又回到了古老的问题，即可扩展性不可能三角困境。 可扩展性不可能三角困境表示区块链只能具有以下三个特征中的两个：去中心化、安全性和可扩展性。 现有的（新的）单体区块链倾向于针对三角的安全和可扩展进行优化。比特币和以太坊更加强调去中心化和尽可能安全。但都是有代价的。去中心化区块链通常没有高带宽来执行交易。以太坊每秒最多处理 20 笔交易，而比特币的处理能力甚至更低。如果我们想在全球范围内使用这些协议，每秒 20 个交易是远远不够的。一些单体链至少在理论上，可以使我们更接近全球规模，因为它们的 TPS 和总吞吐量是足够的。然而，他们往往缺乏去中心化，而这是区块链技术的核心原则。 模块化架构的目的是将区块链的一些工作外包出去，在保持去中心化的同时做出更多性能更高的链。让我们讨论一下以太坊，并讨论它有望如何利用模块化。 以以太坊为中心的生态系统 大多数第 1 层区块链 现在的以太坊是一个单体的区块链。今天大多数其他第 1 层区块链也将被归类为单体区块链。就像 iPhone 的例子一样，单体区块链的某些功能有时会开始落后于较新的替代方案，导致在对比最新和最具创新性的第 1 层时流失开发人员和消费者。为了解决以太坊目前在吞吐量方面的瓶颈，开发人员正在构建Rollup执行层以增加交易带宽。 模块化执行层 示例：Optimism, Arbitrum, Fuel, Scroll, ZkSync Rollups 作为执行层是当今以太坊上使用最广泛的扩容方法。Rollups 是独立的区块链，具有更高的交易执行性能，其最终结果在以太坊上结算，以有效继承其（更好的）安全性和去中心化。 在高层次上，Rollup只是一个区块链，它将其区块的结果发布到另一个区块链。然而，这只是Rollup的一个组成部分，因为你还需要欺诈和有效性证明以及一种无许可插入交易的方法。Rollups 通…

opside 跨链测试
type: item
date: 2023-03-30T11:15:22+08:00
description: Opside介绍 Opside 是一个三层区块链平台，形式为“Base chains <- Opside chain <- Rollups”。 它具有资产多样性和无限可扩展性等优势，为高吞吐量的web3应用提供友好的运行环境。 三层架构 测试三层跨链转账 1.MetaMask添加Opside测试网络信息 网络名称：Opside 测试网 新的 RPC URL：https://testrpc.opside.network/ 链号：23118 货币符号：IDE 区块浏览器网址：https://opside.info/ 2.MetaMask添加Opside zkEVM 测试网络信息 网络名称：Opside zkRollup L3 测试网 RPC 网址：https://testrpc.zkevm.opside.network/ 链号：23119 货币符号：IDE 区块浏览器网址：https://zkevm-test.opside.info 3. 从水龙头获取代币 领取网址：https://faucet-testnet.opside.network/ 领取时需要对指定消息进行签名 交易hash https://opside.info/address/0x10210572d6b4924Af7Ef946136295e9b209E1FA0 领取代币类型和数量 MetaMask手动添加代币合约地址到资产 USDT：0xDEd24358C0d7C96BC419F479771D1da3443Fe52d USDC：0x407d6E2bF44A1B70eBd51CcF0aFCFBbD5F0b6d15 VTP：0x956a81C7D7031Fd123961cC69C28a2a49884FC68 4. 测试第1层->第2层桥接 跨链桥网址： https://bridge-testnet.opside.network/ sepolia转1USDT到opside // TODO opside转1USDT到Opside zkEVM Testnet 跨链桥网址：https://zkbridge-testnet.opside.network/ Approve USDT spending cap 0x10210572d6b4924af7ef946136295e9b209e1fa0 -> 0xded24358c0d7c96bc419f479771d1da3443fe52d https://opside.info/tx/0xc0d592c5edcc533abddf83f0b38c40a4099ef2ef3de0b6fd862048df24b06036 Bridge Asset 0x10210572d6b4924af7ef946136295e9b209e1fa0 -> 0xfb15d16f87ad92f0a6d54a9fbc951676701071f9 https://opside.info/tx/0x1d2dfc8ce07e3039b46e92f27a7bbd5dc461874f4b5020ee3931b0b12804db04 备注：https://testrpc.zkevm.opside.network/bridge-service/bridges/0x10210572d6b4924af7ef946136295e9b209e1fa0?limit=10000&offset=0 测试时这个API，ssl证书有问题：ERR_SSL_VERSION_OR_CIPHER_MISMATCH Opside zkRollup L3 测试网的RPC同样问题 ERR_SSL_VERSION_OR_CIPHER_MISMATCH https://testrpc.zkevm.opside.network/ // TODO 等待解决后继续测试，先忙其他 opside转1USDT到sepolia Approve USDT spending cap 0x10210572d6b4924af7ef946136295e9b209e1fa0 -> 0x10210572d6b4924af7ef946136295e9b209e1fa0 https://opside.info/tx/0xca2d7fdf791b7432a3e2067bc814ce9ca66ad2163d55bc805743fad6996ffc98 Deposit 0x10210572d6b4924af7ef946136295e9b209e1fa0 -> 0x832e50eec9d7f9e2b5d4286a5834400dfaeafc3f https://opside.info/tx/0x6b6a505b4aa1aa4b314d5b69a316713…

分析0xSplits - 收入拆分协议
type: item
date: 2023-03-20T21:50:08+08:00
description: 技术背景 很多时候，我们需要把一份收入（金额）拆分到不同的地址，而又不想让付款人（通常是用户）承担拆分收入部分的 GAS费用， 0xSplits 的架构及解决思路值得我们参考。 本文先介绍了0xSplits 是什么，0xSplits 采用的架构是怎么样的，同时介绍了几种其他的拆分方式可能带来的问题，另外还有一些0xSplits在 Gas 优化上的做法。 0xSplits是什么 0xSplits 是链上收入拆分的协议， 它是一个智能合约，允许你将任何付款拆分到许多收款人，例如，它可以用于NFT版税。EIP-2918允许你只指定一个地址作为收款人，但如果你把这个地址设置为0xSplits地址，你就可以有很多个收款人。 0xSplits由一个主合约组成，可以创建许多子克隆合约（SplitWallet）。 你通过调用主合约创建一个新的拆分（split） 它创建一个负责接收ETH的子合约 在需要接收ETH的地方使用子合约的地址 译者注：克隆合约是使用同一份代码，创建（复制）多个出合约， 每个合约都有自己的状态。 这里是子克隆合约的代码，你可以看到，它非常简单。它可以接收ETH，并且有一个函数可以将ETH转移到主合约， 0xSplits也支持ERC-20，但省略了这部分代码 但收到的ETH如何拆分给接收者？这就是主合约的任务（为了便于阅读，代码做了修改）： 所以，资金是静止不动的，直到有人明确地调用 distributeETH。但为什么有人会浪费Gas来调用这个函数呢？答案是distributorFee（分配费用）。这是在创建拆分时设置的，谁调用distributionETH就归谁。 这种激励性的代码调用是必要的，因为EVM没有周期任务（cron ）或回调来定期分配资金，一切都需要由个人或链外机器人发起，distributorFee有点类似于CryptoKitties合约中的autoBirthFee。 为什么0xSplits会选择这种架构？还有，为什么不在收到资金的时候立即分发？这是我们这篇文章的主要想解决的问题。 0xSplits 架构 你可以在Etherscan找到0xSplits的代码 克隆SplitWallet合约接收付款并持有资金，直到它们被调用，将资金转移到主合约。 分销商（distributor）被激励在主合约中调用distributeEth，这将把资金从克隆合约转移到主合约中，同时也将支付/分成。 但是在这一点上，资金仍然存放在主合约中（合约有一个从收款人地址到余额的映射）。为了实际接收资金，用户必须调用主合约中的withdraw函数。 此架构的可能替代方案 现有的设定是相当复杂的：克隆合约接收付款，分销商（distributor）将这些资金从克隆合约转移到主合约，并将资金分给接收者。但是收款人仍然需要调用withdraw来接收实际拆分到的资金。所以，端到端的用户流程并不是完全自动化的（另外，有些钱会被分销商收取）。 为什么0xSplits需要如此复杂的设置？让我们来看看其他的方法，以及它们为什么不可行。 若在收到资金时进行拆分？ 为什么不在收到资金的同一函数中进行拆分呢？也就是说，不在合约中保存资金， 而是立即分配，这里有2个原因： 付款人需要提供额外的Gas 它破坏了互操作性。付款人不能再直接将ETH转账（transfer）到克隆合约中。而是要求付款人将不得不调用合约上的一个特定函数（来进行拆分），这会破坏互操作性。你可能会说只要重写receive函数，但receive函数经常受2300个Gas限制，这意味着你不能在其函数中进行大量的转账。 若使用共享合约而不是克隆合约呢？ 为什么没有一个共享的合约，为所有可能的拆分接收所有的付款？这将摆脱克隆（创建新合约），但它并不奏效，因为当共享合约收到付款时，它不知道付款是要进行怎样的拆分。 将distributeEth和withdraw合二为一呢？ 为什么不把整个过程端到端自动化，让分销商在一个函数中执行这2个操作？主要是因为安全问题。强烈建议使用pull over push - 即让用户手动拉取他们的自己资金，而不是把资金自动推送他们。 为什么 "推（push）"被认为是一种安全风险？阅读下面的链接以获得完整的答案，但简而言之，这是因为不是所有的接收者都能保证正确处理ETH的接收。一些恶意的行为者可能会部署一个智能合约，在 receive 功能中进行回退(revert)。因此，如果至少有一个接收者回退(revert)，整个操作就会回退(revert)。 参考阅读文章：Pull over Push 将转移以太坊的相关风险转移到用户身上。 如果你想出另一种替代架构，请告诉我（在评论中这里）。 我认为0xSplits为他们所针对的使用场景选择了正确的架构--这就是成为DeFi生态系…

Solidity Gas 优化 - 理解不同变量 Gas 差异
type: item
date: 2023-03-15T17:08:47+08:00
description: 本文我们来尝试进行 RareSkills Gas 优化的一个挑战，完成这个挑战可以学习到更多 Gas 技巧。 以下是 Distribute 合约，合约的作用是向 4 个贡献者平均分配 1 ETH， 代码如下 // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.15; contract Distribute { address[4] public contributors; uint256 public createTime; constructor(address[4] memory _contributors) payable { contributors = _contributors; createTime = block.timestamp; } function distribute() external { require( block.timestamp > createTime + 1 weeks, "cannot distribute yet" ); uint256 amount = address(this).balance / 4; payable(contributors[0]).transfer(amount); payable(contributors[1]).transfer(amount); payable(contributors[2]).transfer(amount); payable(contributors[3]).transfer(amount); } } 合约代码：https://github.com/RareSkills/gas-puzzles/blob/main/contracts/Distribute.sol 这个合约默认情况下，所需 GAS 是 71953， 需要优化到 57044， 以便通过测试用例，测试用例代码在这里。 这是默认运行的截图： 在原始合约上运行测试结果 挑战的要求是仅修改合约Solidity代码来使 distribute 下降到57044， 因此不可以修改优化器或solidity版本、不可以修改测试文件，也不使用huff/yul/bytecode 层面的优化，也不变更函数属性（不能使函数为 "payable"）。 在进一步阅读之前，请确保你自己先尝试解决这个难题，它真的很有趣，而且能让你学到东西。 让我们来优化吧! 让我们先做一些明显的事情。 变更变量为不可变（immutable）变量，而不是存储变量（节省 10710Gas--因为不可变变量是作为常量嵌入合约字节码的，而不是从存储中读取）。 用 send 取代 transfer（节省108 Gas--因为send没有检查转账是否成功）。 用endTime代替currentTime (节省了69个Gas - 在构造函数中进行时间计算) 以下是修改后的合约： 这样我们就可以让Gas 节约到61066，已经比原来的好了10887，但仍比目标值高出 4千， 需继续努力。 那么，还有什么诀窍呢？ 这个挑战有一个特别的技巧，应该教给你。而这是一种通过SELFDESTRUCT向地址发送ETH的老方法： 通过Selfdestruct 解谜, 仅仅这一招就为你节省了4066*的Gas，并且达到了目标! 但如果继续深入呢？ 每一个理智的优化总是有其疯狂的邪恶兄弟（作弊）......让我们看看我们能把这个推到什么程度! 让合约自毁（selfdestruct）感觉像是在作弊 -- 为什么你会有一个这样的合约，在第一次调用分发后就不存在了呢？不过测试通过，所以我想这是允许的......？ 让我们看看还有什么（真正的作弊）能让测试通过，但又能优化更多Gas。 让contributors成为常数，而不是不可变（immutable）（节省24个Gas - 因为Hardhat地址总是相同的，所以可以这样做，对吧？ 使金额恒定为0.25ETH，而不是从余额中计算（节省了106个Gas -- 因为在测试中金额总是相同的，所以为什么不这样做呢？） 使用Assembly来做call，而不是通常的solidityaddress.send（节省9 0 Gas）。 到目前为止使用的 Gas 是 56780 还可以更进一步吗？ 把地址作为字节32的数字直接放在调用中，可以为我们多节省9个Gas! 在调用中的手动用零填充地址， 可以节约到 56771 Gas 我们继续走下去如何？ 既然我们已经针对测试上做优化，那我们就进一步 为什么我们不直接返回，如果测试是 "Gas目标"？ 知道Hardhat总是在相同的区块链中运行测试，我们可以把这个代码放在 distribute()函数的开头： if (bl…

ETH2.0 技术调研和测试部署
type: item
date: 2023-03-11T16:56:00+08:00
description: 1. ETH1.0和2.0的对比 1.1 共识机制 eth1.0：工作量证明 eth2.0：股权证明 共识改进 节能，比pow消耗更少能源 低门槛，硬件相对较低 降低中心化，pos更易节点参与 增加攻击成本，违规惩罚 1.2 节点组成 eth1.0：一个执行客户端组成完整以太坊节点 eth2.0：执行客户端 + 共识客户端 执行客户端 Besu Erigon Geth Nethermind 共识客户端 Lighthouse Lodestar Nimbus Prysm Teku 2. ETH 2.0 方案组成 2.1 节点架构 执行层->P2P1 维护交易池，交易处理，gossip广播 状态管理 创建执行负载 用户网关->提供对外RPC 共识层->P2P2 共享广播块和证明 运行分叉选择算法 跟踪链的头部 管理信标状态（包含共识和执行信息） 跟踪 RANDAO 中累积的随机性 跟踪justification和finalization 验证器 提议区块 创建证明 累积奖励/惩罚 2.2 执行与共识层通信 共识和执行层之间通过“Engine-API”的API发送指令。 共享一个 ENR（以太坊节点记录），其中包含（eth1 密钥和 eth2 密钥）。 层内广播协议：gossip 共识层非区块生产者： 共识层-->接收区块->预先验证块（有效sender）->区块中的交易->执行层->执行交易并验证块头中的状态（哈希匹配）->共识层->添加本地链头部->创建证明->广播证明 共识层为区块生产者时： 共识层->收到通知（下一个区块当选生产者）->调用执行层（create block）->交易内存池->打包区块->执行交易生成区块哈希<-共识层抓取交易和区块哈希->添加到信标块->广播区块 3. 环境测试 3.1 测试方案选配 根据客户端多样性分布 https://clientdiversity.org/ 测试方案：Prysm棱镜 + Geth 部署参考文档（prylabs） 3.2 测试环境 系统: Ubuntu 20.04 CPU：4+ 核 @ 2.8+ GHz 内存：16GB+ 存储：2TB+ SSD 网络：8 MBit/秒 测试网络: Goerli-Prater 执行客户端: Geth 1.11.3 EN-BN 连接: HTTP-JWT eth2.0测试网 Sepolia 封闭验证器集 验证者集受到限制，主要由客户和测试团队监督 较小的区块链状态和历史 同步速度快，需要更少的存储承诺 Goerli 开放验证者集 携带大状态并需要高存储承诺 需要更长的时间才能与网络的当前状态同步 如果测试合约选Sepolia， 如果想测试参与节点治理选Goerli 3.3 测试环境部署 设置工作目录 export workdir=/mnt/d/eth2.0/ethereum 3.3.1 安装 Prysm cd $workdir mkdir consensus mkdir execution cd consensus mkdir prysm && cd prysm curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh 3.3.2 生成 JWT Secret ./prysm.sh beacon-chain generate-auth-secret 3.3.3 下载和运行执行客户端 下载 cd $workdir/execution wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.11.3-5ed08c47.tar.gz tar -zxvf ./geth-linux-amd64-1.11.3-5ed08c47.tar.gz mv ./geth-linux-amd64-1.11.3-5ed08c47/geth ./ rm ./geth-linux-amd64-1.11.3-5ed08c47.tar.gz rm -rf ./geth-linux-amd64-1.11.3-5ed08c47 运行 nohup ./geth --goerli --http --http.api eth,net,engine,admin --authrpc.jwtsecret $workdir/consensus/prysm/jwt.hex 2>> ./geth.log & 3.3.4 Prysm 运行信标节点 cd $workdir/consensus/prysm/ nohup ./prysm.sh beacon-ch…

以太坊签名数据库
type: item
date: 2023-03-10T22:07:47+08:00
description: https://www.4byte.directory/

Goerli 与 Sepolia 测试网比较：哪个更好？
type: item
date: 2023-03-10T16:26:27+08:00
description: Goerli 和 Sepolia 是以太坊开发人员用来测试其应用程序的两个权益证明测试网。web3 开发人员在选择测试网之前应考虑多种原因，包括测试 ETH 的可用性、RPC 节点提供商支持、智能合约可用性等。 在本文中，我们将介绍每个测试网是什么，它们的技术差异，强调三个注意事项，并帮助您为您的项目选择最佳的以太坊测试网。 Goerli 测试网介绍 Goerli 于 2018 年在 ETH-Berlin 开始作为黑客马拉松项目，然后于 2019 年正式启动。它是第一个成功与 Geth、Nethermind、Besu 等客户端同步的权威证明 (PoA) 跨客户端测试网。 Goerli测试网络是一个公开开放的权益证明 (PoS) 测试网，由一个开放的验证器集维护，这意味着任何希望运行自己的测试网验证器的人都可以参与。但是，由于网络的状态很大，需要更长的同步时间和更多的存储来运行一个节点。 与 Sepolia 相比的主要区别 开放验证者集 无需许可即可获得共识 支持跨客户端功能 携带大状态并需要高存储承诺 需要更长的时间才能与网络的当前状态同步 Goerli 测试网络配置 如果您要将 Goerli 区块链添加到您的钱包，这是要包括的网络信息： 网络名称-Goerli Test Network RPC URL - https://eth-goerli.g.alchemy.com/v2/[YOUR-API-KEY] 链号- 5 货币符号- GoerliETH 区块浏览器 URL - https://goerli.etherscan.io/ Sepolia 测试网 Sepolia于 2021 年推出，是一个经过许可的权益证明测试网络，由主要由客户和测试团队控制的封闭验证器集维护。虽然开发人员可以公开使用测试网来测试和部署他们的去中心化应用程序 dDapps），但并不是每个人都可以选择运行验证节点，使其成为一个许可网络 由于 Sepolia 是一个较年轻的测试网，与 Goerli 等更成熟的测试网相比，部署的应用程序较少。它具有更小的状态和历史记录，允许更快的同步并需要最少的磁盘空间来运行节点。 与Goerli相比的主要区别 封闭验证器集（权威证明配置） 获得共识是允许的 验证者集受到限制，主要由客户和测试团队监督 支持跨客户端兼容性 较小的区块链状态和历史 同步速度快，需要更少的存储承诺 Sepolia链信息 如果您要将 Sepolia 区块链添加到您的钱包，这是要包括的网络信息： 网络名称-Sepolia Test Netwok RPC URL - https://eth-sepolia.g.alchemy.com/v2/[YOUR-API-KEY] 链号- 11155111 货币符号- SepoliaETH 区块浏览器 URL - https://sepolia.etherscan.io/ 要开始在 Sepolia 上构建，请注册一个免费的 Alchemy 帐户，并从 Alchemy 的公共水龙头获取免费的 SepoliaETH 代币。 选择在 Sepolia 或 Goerli 上开发之前需要考虑的事项 在选择 Sepolia 测试网络或 Goerli 之前要考虑的三件事是： 测试 ETH 的可用性和成本 RPC 和 API 支持 智能合约的可用性 1. 测试ETH的可用性 在 Goerli 和 Sepolia 之间进行选择时的主要考虑因素是可用性、可访问性和获取测试 ETH 代币的成本。测试 ETH 代币用于支付测试网上的 gas，web3 开发人员需要在与以太坊主网环境非常相似的环境中部署和测试他们的智能合约。 Goerli ETH是免费的吗？ 从历史上看，开发人员在 Goerli 测试网上使用的测试 ETH goETH 一直是免费的，但是由于 goETH 的稀缺性，已经创建了流动性市场，开发人员可以在其中买卖 goETH 以换取真实的 ETH。 Web3 开发者仍然可以通过 Goerli Faucet 获取免费的 Goerli ETH，但是由于 goETH 的总量有硬性上限，所以每天可以领取的 goETH 数量是有限制的。 与积累 Goerli ETH 相关的稀缺性和成本是许多以太坊开发人员从 Goerli 转向 Sepolia 的原因之一。 Sepolia ETH 是免费的吗？ 是的，Sepolia ETH 是免费的，可以从Sepolia ETH 水龙头领取。由于市场上可用的 sepETH 总数没有上限，因此每次从 Sepolia 水龙头请求测试 ETH 时，像 Alchemy 这样的水龙头供应商都能够为开发人员提供更多的 sepETH。 2. RPC 和 API 支持 在决定在 Sepolia 或 Goerli 上构建之前…