2

我正在阅读教程,其中说明了如何创建合同。

这是他们的代码:

function createFirstPing() {
    const request = {
        commands: {
            applicationId: 'PingPongApp',
            workflowId: `Ping-${sender}`,
            commandId: uuidv4(),
            ledgerEffectiveTime: { seconds: 0, nanoseconds: 0 },
            maximumRecordTime: { seconds: 5, nanoseconds: 0 },
            party: sender,
            list: [
                {
                    create: {
                        templateId: PING,
                        arguments: {
                            fields: {
                                sender: { party: sender },
                                receiver: { party: receiver },
                                count: { int64: 0 }
                            }
                        }
                    }
                }
            ]
        }
    };
    client.commandClient.submitAndWait(request, (error, _) => {
        if (error) throw error;
        console.log(`Created Ping contract from ${sender} to ${receiver}.`);
    });
}

我想在我的项目中创建一个类似的请求,发送一个名为“datetime_added”的字段。在我的 DAML 代码中,它的类型是time. 我无法弄清楚这个请求的正确语法。例如:

arguments: {
      fields: {
        sender: { party: sender },
        receiver: { party: receiver },
        count: { int64: 0 },
        datetime_added: { time: '2019 Feb 19 00 00 00' }
      }
}

我表达时间的格式并不是导致问题的原因(尽管我承认它也可能是错误的)。我看到的错误如下:

Error: ! Validation error
▸ commands
  ▸ list
    ▸ 0
      ▸ create
        ▸ arguments
          ▸ fields
            ▸ datetime_added
              ✗ Unexpected key time found
    at CommandClient.exports.SimpleReporter [as reporter] (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/data/reporting/simple_reporter.js:36:12)
    at Immediate.<anonymous> (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/data/client/command_client.js:52:62)
    at runCallback (timers.js:705:18)
    at tryOnImmediate (timers.js:676:5)
    at processImmediate (timers.js:658:5)

我不明白,time不是有效的 DAML 数据类型吗?


编辑

我尝试切换timetimestamp如下

datetime_added: {timestamp: { seconds: 0, nanoseconds: 0 }}

导致以下错误:

/home/......../damlprojects/car/node_modules/google-protobuf/google-protobuf.js:98
goog.string.splitLimit=function(a,b,c){a=a.split(b);for(var d=[];0<c&&a.length;)d.push(a.shift()),c--;a.length&&d.push(a.join(b));return d};goog.string.editDistance=function(a,b){var c=[],d=[];if(a==b)return 0;if(!a.length||!b.length)return Math.max(a.length,b.length);for(var e=0;e<b.length+1;e++)c[e]=e;for(e=0;e<a.length;e++){d[0]=e+1;for(var f=0;f<b.length;f++)d[f+1]=Math.min(d[f]+1,c[f+1]+1,c[f]+Number(a[e]!=b[f]));for(f=0;f<c.length;f++)c[f]=d[f]}return d[b.length]};goog.asserts={};goog.asserts.ENABLE_ASSERTS=goog.DEBUG;goog.asserts.AssertionError=function(a,b){b.unshift(a);goog.debug.Error.call(this,goog.string.subs.apply(null,b));b.shift();this.messagePattern=a};goog.inherits(goog.asserts.AssertionError,goog.debug.Error);goog.asserts.AssertionError.prototype.name="AssertionError";goog.asserts.DEFAULT_ERROR_HANDLER=function(a){throw a;};goog.asserts.errorHandler_=goog.asserts.DEFAULT_ERROR_HANDLER;

AssertionError: Assertion failed
    at new goog.asserts.AssertionError (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:98:603)
    at Object.goog.asserts.doAssertFailure_ (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:99:126)
    at Object.goog.asserts.assert (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:99:385)
    at jspb.BinaryWriter.writeSfixed64 (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:338:80)
    at proto.com.digitalasset.ledger.api.v1.Value.serializeBinaryToWriter (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/grpc/generated/com/digitalasset/ledger/api/v1/value_pb.js:289:12)
    at jspb.BinaryWriter.writeMessage (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:341:342)
    at proto.com.digitalasset.ledger.api.v1.RecordField.serializeBinaryToWriter (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/grpc/generated/com/digitalasset/ledger/api/v1/value_pb.js:1024:12)
    at jspb.BinaryWriter.writeRepeatedMessage (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:350:385)
    at proto.com.digitalasset.ledger.api.v1.Record.serializeBinaryToWriter (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/grpc/generated/com/digitalasset/ledger/api/v1/value_pb.js:822:12)
    at jspb.BinaryWriter.writeMessage (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:341:342)

简而言之,我需要知道在我的 Node.js 客户端中为类型的 DAML 值使用什么类型time以及如何表达它。

4

1 回答 1

0

我建议使用绑定的参考文档(尽管从 0.4.0 版开始,浏览它以回答您的问题,我注意到两个错误)。在页面的上部导航栏中,您可以从Classes > data.CommandClient开始,并沿着其唯一参数 ( SubmitAndWaitRequest ) 向下工作,直到通过指向不同字段的链接,您到达该timestamp字段的文档,作为错误建议(尽管文档中有错误),应该是Timestamp,其中秒以纪元时间表示(自 1970 年以来的秒数)。

因此,要进行您想要的调用,这将是您应该发送的对象的形状:

arguments: {
  fields: {
    sender: { party: sender },
    receiver: { party: receiver },
    count: { int64: 0 }
    datetime_added: { timestamp: { seconds: 0, nanoseconds: 0 } }
  }
}

特别是对于您的情况,我可能会制作一个使用该Date.parse功能的小帮手。

function parseTimestamp(string) {
  return { seconds: Date.parse(string) / 1000, nanoseconds: 0 };
}

然后您可以使用它来传递您在示例中提到的时间:

arguments: {
  fields: {
    sender: { party: sender },
    receiver: { party: receiver },
    count: { int64: 0 }
    datetime_added: { timestamp: parseTimestamp('2019-02-19') }
  }
}

作为结束语,我想补充一点,Node.js 绑定附带的键入文件可在兼容的编辑器(如 Visual Studio Code)上提供自动完成和上下文帮助。使用这些可能会对您有所帮助。由于绑定是用 TypeScript 编写的,因此可以保证输入始终与 API 保持同步。请注意,目前,自动完成功能适用于 Ledger API 本身,但不会为您提供针对您的 DAML 模型(fields本例中的对象)的任意记录的帮助。

于 2019-03-06T07:10:48.093 回答