Skip to content
Discussions/App Development/What is Time's precision and does it support microsecond?Forum ↗

What is Time's precision and does it support microsecond?

App Development9 posts833 views21 likesLast activity Jun 2020
FR
FrankieOP
May 2020

In DAML, the docs mention that Time type represents a datetime in UTC. Does it support microsecond precision. If it does, how to retrieve the microsecond part?

show Time doesn’t reveal microsecond part. However you can do subTime -> Time -> Time -> RelTime in which RelTime is to microsecond precision.

LU
Luciano
May 2020

Hello Frankie, and welcome to the forums!

Great question. I think this Q, or a similar one has been discussed here: Time with millisecond precision

Have a look and let us know if this satisfies you.

BE
bernhard
May 2020

I had a look at the answer @Luciano linked and found it wanting. Have look at the example in my answer here on how to extract microseconds from times and dates.

Note that ledger time is a fuzzy concept, though. If your business logic starts relying on times in the second range, you are probably going to run into contention and race conditions.

FR
Frankie
May 2020

@Luciano @bernhard Thanks for that. Somehow I missed that post.

I am trying to use the getTime function to create some “random” numbers hence the question. Just curious, in getTime function, does it depend on the ledger implementation? i.e. its precision is derived from the ledger?

CO
cocreature
May 2020

getTime returns the ledger time which is set by the participant server so different participant servers can definitely behave differently here. Not quite sure if that is already the case for the current ledger implementations. You can find more information on this at https://docs.daml.com/app-dev/app-arch.html#dealing-with-time which also describes the issues caused by relying on getTime being precise. Semantics of min_ledger_time has further details.

As for random numbers, I wouldn’t recommend relying on getTime for that. Instead pass in the numbers from the client.

LU
Luciano
Jun 2020

I agree with @cocreature here. You probably don’t want to be using getTime to generate random numbers.

If your number doesn’t have to be cryptographically secure, you could use a seed + the Mersenne Twister (I never know how to pronounce that!), which provides pretty good results. Encapsulate this in a singleton contract on the ledger.

CO
cocreature
Jun 2020

Implementing a Mersenne twister (or really most rngs and most crypto stuff) in DAML isn’t as simple as it might seem at first due to the lack of bitwise operations in DAML and the fact that arithmetic operations on Int64 throw on overflow so you cannot abuse them as bitwise operations. Definitely a good puzzle and I’d be interested in seeing an implementation :slightly_smiling_face:

LU
Luciano
Jun 2020
cocreature:

lack of bitwise operations in DAML

Ha! I didn’t consider that at all. It seems that the topic of having a raw binary type & operations keeps on popping up in different discussions.

GA
Gary_Verhaegen
Jun 2020

Not by any means secure or cryptographic, or, you know, random, but here is a simple function that returns a number given another number in a somewhat hard to predict way if you only have access to the sequence of numbers:

rng_next : Int -> Int
rng_next =
  let a = 1103515245
      c = 12345
      m = 4294967296
  in \prev -> (a * prev + c) % m

setup = scenario do
  let a = rng_next 1
  let b = rng_next a
  debug([a, b])

Values for a, c, m stolen from this blog post.

← Back to Discussions