Lido Oracle 分析

LidoOracle 是一个合约，其中预言机向 DAO 发送由 ETH 2.0 控制的地址余额。预言机由 DAO 指定。预言机每帧（目前为 225 个时代，相当于一天）推送其报告，当相同报告的数量达到 “法定人数” 值时，报告将推送到 Lido 合约。

然而，每日预言机报告并不是理所当然的。如果 Beacon Chain 没有最终确定性，预言机守护进程可能会停止推送其报告很长一段时间。这最终会导致没有预言机报告和没有 stETH 重组整个时期。

此外，还有一些值得一提的机制，如存储收集的报告作为数组、添加计算持有人奖励 APR、通过可配置值对预言机报告进行健全性检查以及在报告推送时调用接收器函数。

LidoOracle 与 DAO 的交互主要体现在预言机的指定上。预言机由 DAO 指定，这意味着 DAO 负责决定哪些预言机可以向 LidoOracle 发送报告。此外，LidoOracle 还接收来自 DAO 的其他指令，如设置法定人数值、添加或删除预言机成员等。这些指令有助于确保 LidoOracle 的正常运行，并确保其提供的信息是准确和可靠的。

LidoOracle 与 ETH 2.0 的交互主要体现在预言机向 LidoOracle 发送由 ETH 2.0 控制的地址余额上。预言机守护进程每帧（目前为 225 个时代，相当于一天）推送其报告，报告中包含了 ETH 2.0 侧的地址余额信息。这些信息有助于确保 Lido 合约中的信息是最新的，并且与 ETH 2.0 侧的实际情况保持一致。

LidoOracle 采取了一些安全措施来确保其正常运行并提供准确可靠的信息。例如，它通过可配置值对预言机报告进行健全性检查，以限制不端预言机的影响。它还存储收集的报告作为数组，并在报告推送时调用接收器函数。此外，LidoOracle 还接收来自 DAO 的其他指令，如设置法定人数值、添加或删除预言机成员等。这些措施有助于确保 LidoOracle 的安全性，并防止潜在的攻击或滥用。

为了计算持有人的奖励百分比，LidoOracle 存储并提供以下数据：

preTotalPooledEther：报告推送到 Lido 合约之前查询的总质押以太坊数量。
postTotalPooledEther：同上，但在推送后查询。
lastCompletedEpochId：上一个推送报告到 Lido 的时代。
timeElapsed：当前推送时代与 lastCompletedEpochId 之间的秒数。通常应该是帧长：32 * 12 * 225 = 86400，但如果前一帧未达到法定人数，则可能是多个。
lidoFee：Lido 的费用（基点）。可以通过在 Lido 合约中调用 getFee () 来检索。
basisPoint：确定费用精度的常数，等于 10000。
请注意，我们收集 post/pre 对（而不是 current/last），以避免新质押在时代期间的影响。

要计算 APR，请使用以下公式：

Copy
protocolAPR = (postTotalPooledEther - preTotalPooledEther) * secondsInYear / (preTotalPooledEther * timeElapsed)

lidoFeeAsFraction = lidoFee / basisPoint

userAPR = protocolAPR * (1 - lidoFeeAsFraction)

这些参数和公式可用于计算持有人奖励的百分比，并帮助用户了解他们的投资回报率。

要使用这些参数计算持有人奖励的百分比，您可以按照以下步骤操作：

获取 preTotalPooledEther 和 postTotalPooledEther 的值。这些值表示报告推送到 Lido 合约之前和之后查询的总质押以太坊数量。
获取 lastCompletedEpochId 和 timeElapsed 的值。lastCompletedEpochId 表示上一个推送报告到 Lido 的时代，而 timeElapsed 表示当前推送时代与 lastCompletedEpochId 之间的秒数。
获取 lidoFee 和 basisPoint 的值。lidoFee 表示 Lido 的费用（基点），可以通过在 Lido 合约中调用 getFee () 来检索。basisPoint 是确定费用精度的常数，等于 10000。
使用上述值计算 protocolAPR、lidoFeeAsFraction 和 userAPR。可以使用以下公式进行计算：

Copy
protocolAPR = (postTotalPooledEther - preTotalPooledEther) * secondsInYear / (preTotalPooledEther * timeElapsed)

lidoFeeAsFraction = lidoFee / basisPoint

userAPR = protocolAPR * (1 - lidoFeeAsFraction)

最终得到的 userAPR 值表示持有人奖励的百分比。

这些参数和公式可用于计算持有人奖励的百分比，并帮助用户了解他们的投资回报率。

这些参数的值是由 LidoOracle 合约内部计算和存储的。您可以通过与 LidoOracle 合约交互来获取这些值。例如，您可以调用合约中的相应函数来查询 preTotalPooledEther、postTotalPooledEther、lastCompletedEpochId 和 timeElapsed 的值。至于 lidoFee 和 basisPoint，您可以通过在 Lido 合约中调用 getFee () 来检索 lidoFee，而 basisPoint 是一个常数，等于 10000。

如果您不熟悉如何与智能合约交互，建议您寻求专业帮助或进一步了解以太坊智能合约的相关知识。

这些参数用于计算持有人奖励的百分比，可以帮助您了解您的投资回报率。preTotalPooledEther 和 postTotalPooledEther 的值表示报告推送到 Lido 合约之前和之后查询的总质押以太坊数量。这些值用于计算在给定时间段内总质押以太坊数量的变化。lastCompletedEpochId 和 timeElapsed 的值用于确定给定时间段的长度，以便将总质押以太坊数量的变化转换为年化百分比。lidoFee 和 basisPoint 的值用于计算 Lido 收取的费用，从而确定持有人实际获得的奖励百分比。

通过使用这些参数计算 userAPR，您可以了解您的投资回报率。userAPR 表示持有人奖励的百分比，可以帮助您了解您的投资在给定时间段内增长了多少。

总之，LidoOracle 是一个合约，它通过与 DAO 和 ETH 2.0 的交互，以及采取一些安全措施来确保其正常运行并提供准确可靠的信息。它还提供了一些参数和公式，用于计算持有人奖励的百分比，并帮助用户了解他们的投资回报率。