スマートコントラクトのストレージとパラメーターサイズの制限?
1 回答
- 投票
-
- 2020-02-20
1.トランザクションあたりの最大パラメータサイズ
最大 1つのトランザクションのトランザクションあたりのバイト数は制限されています いくつかの定数、特に操作用の上限サイズ
max_operation_data_length
と操作のハードガス制限 およびブロック(ブロックには一連の操作が含まれます):"max_operation_data_length": 16384, "hard_gas_limit_per_operation": "800000", "hard_gas_limit_per_block": "8000000", "cost_per_byte": "1000", "hard_storage_limit_per_operation": "60000",
これらの定数は、実行中のノードがある場合、RPC呼び出しによって取得できます.
tezos-client rpc get /chains/main/blocks/head/context/constants | jq
おそらく
max_operation_data_length
はバイト単位です.つまり、 パラメータの上限は約16kBです. トランザクション.他のデータに必要なサイズも削除する必要があります 送信者、受信者などのトランザクションで.ガス制限
hard_gas_limit_per_block
およびhard_gas_limit_per_operation
は、両方の最大ストレージを間接的に制限します およびトランザクションサイズ.スマートコントラクトが呼び出されるたびに、ノード 次のフェーズを通過します:- スマートコントラクトコード+コントラクト状態のバイナリ表現を読み取る ディスクから
- コード、ストレージ、入力を型なし表現にデコードします
- タイプチェックコード、ストレージ、入力
- コードを実行する
- ストレージを型指定されていないreprにエンコードします.
- (エンコードされたストレージをディスクに書き込む–バッチ処理および非同期)
これらの各フェーズはガスを消費します.パラメータが大きいほどガスが増加します フェーズ2-4での消費.より大きな貯蔵はガス消費を増加させます フェーズ1〜5.したがって、ストレージとパラメータのサイズは次のように制限されます. ハードガスの制限.しかし、私には難しい数字はありませんが、あなたは tezos-clientを使用してシミュレーションして推定値を取得できます.
2.契約あたりの最大ストレージサイズ
最後に、2番目の質問については、すでに部分的になっています 1. AFAIKによる回答、ストレージの明示的な固定制限はありません スマートコントラクト.ただし、 特定のサイズでは、契約のストレージをデコードできなくなります. そうすることは、ハードガスの制限を超えるからです.別の制限 要因は資金です.
costs_per_byte
は現在1000です ムテス.これは、追加のkBごとに保存に約1tz(現在は約=3usd)かかり、 ストレージを増やすトランザクションの送信者.定数も考慮する必要があります
hard_storage_limit_per_operation
.トランザクションが ネットワークに注入されると、ストレージ制限に関連付けられます. 通常、トランザクションを確実にするために、ユーザーが設定します 意図しない量のストレージの燃焼を引き起こしません.サイズなら トランザクションを適用した結果のストレージサイズの違い ストレージ制限を超えると、トランザクションは拒否されます.ザ・ 定数hard_storage_limit_per_operation
が最高になります 設定可能なストレージ制限、したがって最大値も制限します トランザクションごとのストレージサイズの増加.したがって、 契約のストレージは60000バイトを超えて増やすことはできません トランザクションごと.そのような取引は今日約180米ドルかかることに注意してください.1. Maximum parameter size per transaction
The maximum number of bytes per transaction for a single transaction is limited several constants, in particular an upper size of for operations
max_operation_data_length
and the hard gas limits for operations and blocks (a block contains a set of operations):"max_operation_data_length": 16384, "hard_gas_limit_per_operation": "800000", "hard_gas_limit_per_block": "8000000", "cost_per_byte": "1000", "hard_storage_limit_per_operation": "60000",
These constants can be obtained by a RPC call if you have a running node:
tezos-client rpc get /chains/main/blocks/head/context/constants | jq
Presumably
max_operation_data_length
is in bytes, meaning that you have a an upper limit of of ~16kB for the parameter per transaction. You would also have to remove the size needed other data in transaction, such as sender, recipient, etc.The gas limits
hard_gas_limit_per_block
andhard_gas_limit_per_operation
indirectly limit both maximum storage and transaction size. Each time a smart contract is invoked, the node passes through the following phases:- Read binary representation of smart contract code + contract state from disk
- Decode code, storage and input to untyped representation
- Typecheck code, storage and input
- Run code
- Encode storage to untyped repr.
- (write encoded storage to disk – batched & async)
Each of these phases consumes gas. Larger parameter increases the gas consumption in phase 2-4. Larger storage increases gas consumption in phases 1-5. It follows that storage and parameter size are limited by the hard gas limits. However, I do not have any hard numbers, but you could simulate using tezos-client to obtain estimates.
2. Maximum storage size per contract
Finally, for your second question, which is already partially answered by 1. AFAIK, there is no explicit fixed limit on the storage of a smart contract. However, after a certain size, the storage of contract can no longer be decoded, because doing so would exceed the hard gas limits. Another limiting factor is funds. The
costs_per_byte
is currently at 1000 mutez. This means that each additional kB costs ~1tz (currently ~= 3usd) to store, payed by the sender of transaction that increase storage.We also have to consider the constant
hard_storage_limit_per_operation
. Whenever a transaction is injected on the network, it is associated with a storage limit. Typically, it is set by the user, to ensure that their transaction does not provoke an unintended amount of storage burn. If the size of the storage size diff resulting from applying the transaction exceeds the storage limit, then the transaction is rejected. The constanthard_storage_limit_per_operation
gives the highest storage limit that can be set, and thus also limits the maximum storage size increase per transaction. It follows that the storage of a contract cannot increase with more than 60000 bytes per transaction. Note that such a transaction would cost ~180 usd today.-
「そのようなtxnは費用がかかる」と言うとき、あなたは取引手数料について言及していますか?ガスには金銭的な意味はありません.txn料金も必要なストレージ量に応じて増加しますか?When you say "such a txn would cost", are you referring to transaction fees? Gas does not have monetary meaning. Does the amount of txn fee also increase with needed storage amount?
- 0
- 2020-02-20
- utdrmac
-
確かに、ガスには固定費がありません.ただし、ストレージの書き込みには、バイトあたりの固定コストがあります.完全な説明については、たとえばhttps://tezos.stackexchange.com/a/2165/1773およびここhttp://tezos.gitlab.io/introduction/howtouse.htmlを参照してください.Indeed, gas does not have a fixed cost. But storage burn has a fixed cost per byte. See here for instance: https://tezos.stackexchange.com/a/2165/1773 and here http://tezos.gitlab.io/introduction/howtouse.html for a full explanation.
- 0
- 2020-02-20
- arvidj
スマートコントラクトのストレージ制限に関していくつか質問があります.