如何创建 Virtual Environments?
您可以通过两种方式创建 Virtual Environment:
为什么应该设置唯一的链 ID?
请设置一个与父网络的链 ID 不同的自定义链 ID。建议:在原始网络的链 ID 前加上前缀
7357(test)。例如,如果
您通过 fork Ethereum Mainnet(链 ID: 1)来创建 Virtual Environment,请将您的 Virtual
Environment 链 ID 设置为类似 73571 的值。推荐此做法的原因有以下几点:- 由于 Virtual Environment 链独立于 Mainnet 链,因此它应具有独立且唯一的链 ID。
- 使用唯一的链 ID 是一种安全措施,可保护您的 dapp 免受 交易重放攻击。
- 钱包(例如 MetaMask)会识别出原始链 ID 已被占用,并可能将您的 Virtual Environment 误认为 父网络,除非它使用唯一的链 ID。
Virtual Environments 如何解析时间戳?
当合约中的交易或
eth_call 访问 block.timestamp 时,其值取决于交易目标是 latest 还是 pending 区块。- 对于
pending区块,值为当前时间加上调整偏移量:block.timestamp == time.now() + adjustment_offset。 - 对于
latest区块,值为最新区块的时间戳:block.timestamp == latest_block.timestamp
adjustment_offset 来自时间调整方法 evm_setNextBlockTimestamp 和 evm_increaseTime。了解更多 →挖矿如何工作?
每当您通过
eth_sendRawTransaction 和 eth_sendRawTransaction 向 Virtual Environment 发送一笔交易时,就会挖出一个区块,区块高度增加 1。初始区块高度取自创建时原始链上的最新区块。State Sync 如何工作?
State Sync 使 Virtual Environment 能够跟踪原始网络的实时状态。
- 在 Virtual Environment 中的交易修改某个存储槽之前,Virtual Environment 会跟踪 原始网络中的当前值。
- 当 Virtual Environment 中的一笔交易修改了合约
C中的存储槽X后,任何后续读取都将返回该 值。未被修改的C.Y将反映原始网络中的值。
Virtual Environments 支持 WebSockets 吗?
是的,Virtual Environments 支持 WebSockets。只需在 URL 中使用
wss:// 而不是 https://。Virtual Environments 如何帮助团队协作?
使用 Virtual Environments 部署智能合约时,您的 Tenderly
组织的成员将直接拥有对该 Virtual Environment 的访问权限。在部署到 Virtual Environment 后,您可以分发链和合约的配置,以便其他组件(如 UI、API 和数据索引)的开发人员
可以连接到暂存的合约。以下是一些建议:
- 将合约暂存到 Virtual Environment。
- 为每个团队(前端、 后端等)fork 暂存的 Virtual Environment,以确保团队之间的边界, 并减少开发中的测试数据噪声。
- 在所有相关的 git 仓库中更新 Virtual Environment 的配置和合约信息:
- 链配置:共享链 ID 和 Admin RPC(以便其他开发者可以控制链状态)
- 合约 ABI
- 合约部署地址
- 在本地开发(UI、后端)时,切换到 Virtual Environment。
- 将失败的交易分享给智能合约开发者
如何为外部演示和社区测试暂存 dapp?
在为外部和演示测试暂存 dapp 时,请确保:
- 将合约暂存到 Virtual Environment。
- 暂存所有链下组件(后端、数据索引解决方案等),并让它们连接到 Virtual Environment。
- 通过 Public RPC(而不是 Admin RPC)连接您暂存的 dapp,并将其连接到其他链下组件。
如何回滚 Virtual Environment 状态?
推荐的做法不是回滚状态,而是fork 现有的
Virtual Environment,并在一次性的工作副本上进行测试。如果测试步骤无法通过其他方式重复,您可以回滚 Virtual Environment 状态。
如何在 Virtual Environments 上运行 Foundry 脚本?
在运行 Foundry 脚本时使用
--slow 标志以避免交易批量处理。使用该标志后,只有在前一笔交易被确认之后,下一笔交易才会被发送。在为账户注资时,我应该以 wei 为单位输入金额吗?
在 Dashboard 中使用无限水龙头(Unlimited Faucet)时,无论原生代币或 ERC-20
余额,
1 都表示 1 ETH。
对于 ERC-20 代币,Tenderly 会根据 ERC-20 的小数位数自动计算精确的 wei 数量。Admin RPC 与 Public RPC 有什么区别?
Public RPC 支持标准的 JSON-RPC 交互。当您准备好在外部演示您的 dapp 时,
这就是您将用于集成到 dapp UI 或后端的 RPC。Admin RPC 支持额外的 RPC 方法,允许对网络状态和存储以及
账户余额进行更高级别的控制。这是您在部署脚本中用于以编程方式控制网络的 RPC。
如何获得准确的 gas 估算?
gas 用量反映了来自原始网络的所有 OPCODE 的准确 gas 用量。您可以通过以下方式获取 gas 用量:
- 在 Dashboard 的 Transaction Overview 中,
- 通过 tenderly_estimateGas 进行 100% 精确的单笔交易估算
- 通过 tenderly_estimateGasBundle 进行 100% 精确的多笔交易估算