Built-in Functions
panic
_10fun panic(_ message: String): Never
Terminates the program unconditionally and reports a message which explains why the unrecoverable error occurred.
_10panic("something went wrong: ...")
assert
_10fun assert(_ condition: Bool, message: String)
Terminates the program if the given condition is false, and reports a message which explains how the condition is false. Use this function for internal sanity checks.
The message argument is optional.
unsafeRandom
_10fun unsafeRandom(): UInt64
Returns a pseudo-random number.
Smart contract developers should be mindful about the limitations of unsafeRandom. The stream of random numbers produced is potentially unsafe in the following two regards:
- The sequence of random numbers is potentially predictable by transactions within the same block and by other smart contracts calling into your smart contract.
- A transaction calling into your smart contract can potentially bias the sequence of random numbers which your smart contract internally generates.
The Flow project is working towards removing these limitations incrementally. Once Flow addressed these points and randomness is safe, the "unsafe" qualifier is going to get removed.
Nevertheless, there is an additional safety-relevant aspect that developers need to be mindful about:
A transaction can atomically revert all its actions at any time. Therefore, it is possible for a transaction calling into a smart contract to post-select favorable results and revert the transaction for unfavorable results.
This limitation is inherent to any smart contract platform that allows transactions to roll back atomically and cannot be solved through safe randomness alone. Providing additional Cadence language primitives to simplify this challenge for developers is on the roadmap. Nevertheless, with safe randomness, points 1 and 2 above resolved, developers can prevent clients from post-select favorable outcomes using approaches such as described in the Smart Contract Security Best Practices.
RLP
Recursive Length Prefix (RLP) serialization allows the encoding of arbitrarily nested arrays of binary data.
Cadence provides RLP decoding functions in the built-in RLP
contract, which does not need to be imported.
decodeString
_10fun decodeString(_ input: [UInt8]): [UInt8]
Decodes an RLP-encoded byte array. RLP calls this a "string." The byte array should only contain of a single encoded value for a string. If the encoded value type does not match, or it has trailing unnecessary bytes, the program aborts. If the function encounters any error while decoding, the program aborts.
decodeList
_10fun decodeList(_ input: [UInt8]): [[UInt8]]`
Decodes an RLP-encoded list into an array of RLP-encoded items.
Note that this function does not recursively decode, so each element of the resulting array is RLP-encoded data. The byte array should only contain of a single encoded value for a list. If the encoded value type does not match, or it has trailing unnecessary bytes, the program aborts. If the function encounters any error while decoding, the program aborts.