daml - 获取今天日期的函数?

标签 daml

我正在契约(Contract)模板中创建一个“选择”,需要检查今天的日期。我的DAML代码如下:

controller dealer can
      Add_Car : CarId
        with
            startCoverage: Date

        do
          -- Check for a legal start date
          assert (
            startCoverage > *today* --should check that its not before today
            )
          create this with date_vehicle_added = startCoverage

我可以用来获取当前日期的函数的名称是什么?它需要转到“*today*”所在的位置。

最佳答案

tldr:使用getTime:更新时间toDateUTC:时间->日期, 但要注意其中的陷阱。最好使用公证日期 如果可能的话,模式。

隐式建模日期/时间

对日期和时间建模始终是一个微妙的问题,当 处理确定性的分布式系统,例如数字系统 分类帐。 DAML 提供了一个原始函数 getTime ,它将返回 账本模型保证的“账本有效时间”(LET) 单调递增的时间值(以毫秒为单位),即 限制在账本定义的挂钟 UTC 时间增量内。 可以使用 toDateUTC 函数将其转换为 UTC 日期 DA.日期。这是对你的问题的直接回答,但有 一些注意事项。

  1. 此时间和日期采用 UTC 格式,您必须显式建模 这与本地时间如何对应。由于 DAML 是确定性的, 分布式系统,任何给定的事务都没有本地时间 必须跨多个时区确定性地执行。

  2. 无端使用日期/时间比较可能会导致契约(Contract)被 因时间的流逝而悄然停滞。如果一个选择受到保护 通过检查挂钟时间,这可能意味着任何延迟 您的应用程序处理练习可能会导致选择 变得无效。确保您在自己的国家妥善处理此案 应用程序代码是一个微妙的问题——因为这是一个隐含的问题 参数由您选择,无需操作干预 即使您有提前警告,也可以避免该问题。

  3. 模型和应用程序的集成测试变得 在存在明确时间的情况下是非确定性和不可重复的 比较。虽然您可以为您的项目编写可重复的Scenario测试 模型,因为您在那里有明确的 LET 控制,这不会 行使您的账外应用程序。

显式建模日期/时间

另一种选择是公证日期模式。在此,签署者 契约(Contract)约定受信任方对当前日期进行公证。这 公证采用账本上的 CurrentDate 契约(Contract)的形式。 本契约(Contract)由公证人作为签字人,一般有 由公证人控制的单一消费选择,以推进 日期。

如果您使用此方法,您的 Add_Car 选择将需要额外的时间 参数currentDate : ContractId CurrentDate,你可以认为 作为控制者提供证据或证明同意的 出于本目的,公证人已证明当前日期 契约(Contract)。这解决了隐式时间模型的问题:

  1. 由于日期现在在分类帐上是明确的,所以时区在 CurrentDate 合约的进度。

  2. 如果公证人提前付款,契约(Contract)仍可能被搁置 当前日期契约(Contract),日期管理手段的明确性 a) 在公证日期更新之前排序的任何事件都将 处理成功;这意味着,b)现在有一条途径 预先警告您的操作干预 某一天的处理进度落后于计划 - 假设这样 公证协议(protocol)预期并允许干预。

  3. 由于系统的操作再次成为账本内容的纯粹函数,因此大型应用程序的行为变得确定性且可重复。这大大减少了所需的工作量 用于维护、测试和调试。

出于这些原因,我建议使用公证日期模式,其中 这是可能的,为那些情况保留隐式日期处理 确实没有其他选择。

关于daml - 获取今天日期的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54774634/

相关文章:

DAML 语言服务器无法运行 java

types - DAML 有对应的 Google 吗?

daml - Main.daml 中的语法错误

daml - 在 'date' 语句或 'create' 语句内使用 'exercise' 函数时出现问题

daml - 行使选择时如何获取当前合约id

daml - 如果 Daml 共享相同的账本或从 1.18.0 版本的 postgreSQL 开始,Daml 如何能够维护各方之间的隐私?

daml - 通过 Java 或 JavaScript 以外的语言使用 DAML Ledger API

typescript - 如何按时间倒序排列 create-daml-app 项目中的消息?

daml - DAML场景下,如何复用getParty?