Built-in Functions

[Previous << Run-time Types](https://qiita.com/flowcadence/items/043595e6f6e738cfbece)
[Next >> Environment Information](https://qiita.com/flowcadence/items/f7b6150b33edb466f58b)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ


<h1 id="panic">panic</h1>

```ruby
view fun panic(_ message: String): Never
```
プログラムを無条件に終了し、回復不能なエラーが発生した理由を説明するメッセージを出力します。
```ruby
panic("something went wrong: ...")
```

<h1 id="assert">assert</h1>

```ruby
view fun assert(_ condition: Bool, message: String)
```
指定された条件が偽の場合にプログラムを終了し、その条件が偽である理由を説明するメッセージを出力します。この関数は内部の整合性チェックに使用します。

message引数はオプショナルです。

<h1 id="revertibleRandom">revertibleRandom</h1>

```ruby
view fun revertibleRandom<T: FixedSizeUnsignedInteger>(modulo: T): T
```
疑似乱数の整数を返します。

`T`には任意の固定サイズの符号無し整数型（`FixedSizeUnsignedInteger`、すなわち`UInt8`、`UInt16`、`UInt32`、`UInt64`、`UInt128`、`UInt256`、`Word8`、`Word16`、`Word32`、`Word64`、`Word128`、`Word256`）のいずれかがあてはまります。

modulo引数はオプションです。指定された場合、返される整数は`0`から`modulo-1`の間になります。指定されない場合、返される整数は`0`から`T`の最大値の間になります。`modulo`が0の場合は関数エラーが発生します。

返される乱数のシーケンスは、各ブロックの各トランザクションごとに独立しています。Cadenceは、各トランザクションごとに暗号的に安全な疑似乱数生成器（CSPRG）を個別にインスタンス化します。2つのトランザクションのシードは、ほぼ確実に異なります。

返される乱数は予測不可能であり（ブロック構築時のマイナーにとっては予測不可能であり、関数呼び出し時のCadenceロジックにとっても予測不可能）、検証可能であり、マイナーや以前に実行されたCadenceコードによる偏りが生じないようになっています。詳細は、[Secure random number generator for Flow’s smart contracts](https://forum.flow.com/t/secure-random-number-generator-for-flow-s-smart-contracts/5110)および[FLIP120](https://github.com/onflow/flips/pull/120)を参照してください。

ただし、開発者は`revertibleRandom()`を正しく使用する必要があります。

:::note warn
⚠WARNING
トランザクションは、そのすべてのアクションをアトミックに元に戻すことができます。信頼できない当事者によって送信されたトランザクションが、好ましい結果を事後選択し、好ましくない結果のトランザクションを元に戻してしまうことが可能なのです。
:::
返された乱数に対して事後選択を行わない信頼できる当事者により呼ばれる限り、依然とこの関数の使用は安全です。

この制限は、トランザクションを一括してロールバックできるスマートコントラクトプラットフォームに内在するものであり、これは安全なランダム性のみでは解決できません。信頼できない当事者が、自身のトランザクションを通じて、乱数を生成するスマートコントラクトとやりとりできる場合、この[暫定的な例](https://github.com/onflow/flips/blob/main/protocol/20230728-commit-reveal.md#tutorials-and-examples)（完全なチュートリアルはまもなく公開予定）で説明されているように、[コミット・リベール方式](https://github.com/onflow/flips/pull/123)を使用することが推奨されます。

<h1 id="RLP">RLP</h1>

Recursive Length Prefix (RLP)シリアライゼーションにより、任意のネストされたバイナリデータの配列のエンコードが可能です。

Cadenceでは、ビルトインの`RLP`スマートコントラクトにRLPデコード関数が用意されており、インポートする必要はありません。

<h1 id="decodeString">decodeString</h1>

```ruby
view fun decodeString(_ input: [UInt8]): [UInt8]
```
RLPでエンコードされたバイト配列をデコードします。RLPではこれを"String"と呼びます。バイト配列は、"String"の値にエンコードされた単体の値のみが含まれている必要があります。エンコードされた値の型が一致しない場合、または不要なバイトが末尾にある場合、プログラムは中断します。デコード中にエラーが発生した場合、プログラムは中断します。

<h1 id="decodeList">decodeList</h1>

```ruby
view fun decodeList(_ input: [UInt8]): [[UInt8]]
```
RLP-encoded listを、RLP-encoded itemsの配列にデコードします。

この関数は再帰的にデコードを行わないことに注意してください。そのため、結果の配列のそれぞれの要素はRLP-encoded dataとなります。バイト配列は、リストの値にエンコードされた単体の値のみが含まれている必要があります。エンコードされた値の型が一致しない場合、または不要なバイトが末尾にある場合、プログラムは中断します。デコード中にエラーが発生した場合、プログラムは中断します。

翻訳元

https://cadence-lang.org/docs/language/built-in-functions

***
<b>[Previous << Run-time Types](https://qiita.com/flowcadence/items/043595e6f6e738cfbece)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Built-in Functions)

<b>[Next >> Environment Information](https://qiita.com/flowcadence/items/f7b6150b33edb466f58b)</b>