Limiti di archiviazione e dimensione dei parametri dello smart contract?
1 risposta
- voti
-
- 2020-02-20
1. Dimensionemassima delparametropertransazione
Ilmassimo ilnumero dibytepertransazioneper una singolatransazione è limitato diverse costanti,in particolare una dimensione superiore diper operazioni
max_operation_data_length
e i limiti delgas duroper le operazioni e blocchi (unblocco contiene uninsieme di operazioni):"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",
Queste costantipossonoessere ottenute da una chiamata RPC se hai unnodoin esecuzione:
tezos-client rpc get /chains/main/blocks/head/context/constants | jq
Presumibilmente
max_operation_data_length
èin byte,il che significa chetu hanno un limite superiore di ~ 16 kBperilparametroper transazione. Dovresti anche rimuovere la dimensionenecessariaper altri dati nellatransazione,comemittente,destinatario,ecc.I limiti delgas
hard_gas_limit_per_block
ehard_gas_limit_per_operation
limitaindirettamenteentrambi lo spazio di archiviazionemassimo e dimensione dellatransazione. Ogni volta che viene richiamato uno smart contract,ilfilenode passa attraverso le seguentifasi:- Leggi la rappresentazionebinaria del codice dello smart contract + lo stato del contratto dal disco
- Decodifica codice,archiviazionee inputin una rappresentazionenontipizzata
- Controllo deltipo,archiviazionee input
- Esegui codice
- Codifica l'archiviazionein una riproduzionenontipizzata
- (scrivimemoria codificata su disco -in batche asincrono)
Ciascuna di questefasi consumagas. Unparametropiùgrande aumentailgas consumonellafase 2-4. Lo stoccaggiopiùgrande aumentail consumo digasin fasi 1-5. Ne consegue che l'archiviazionee la dimensione deiparametri sono limitate da i limiti delgas duro. Tuttavia,non honumeri difficili,matu potrebbe simulare l'utilizzo ditezos-clientper ottenere stime.
2. Dimensionimassime di archiviazioneper contratto
Infine,per latua seconda domanda,che ègiàparzialmente risposta da 1. AFAIK,non vi è alcun limitefissoesplicito alla conservazione di unfile contrattointelligente. Tuttavia,dopo a determinate dimensioni,lamemorizzazione del contrattononpuòpiùessere decodificata, perché cosìfacendo si supererebberoi limiti delgas duro. Un altro limite fattore sonoi fondi. Il valore
costs_per_byte
è attualmente 1000 mutez. Ciò significa che ogni kB aggiuntivo costa ~ 1tz (attualmente ~=3 usd)per l'archiviazione,pagato da ilmittente dellatransazione che aumenta lo spazio di archiviazione.Dobbiamo anche considerare la costante
hard_storage_limit_per_operation
. Ogni volta che unatransazione è iniettatoin rete,è associato a un limite di archiviazione. Ingenere,èimpostato dall'utente,pergarantire che la lorotransazione nonprovoca una quantitàinvolontaria dibruciature damagazzino. Se la dimensione della differenza di dimensione di archiviazione risultante dall'applicazione dellatransazione superail limite di archiviazione,quindi latransazione viene rifiutata. Il la costantehard_storage_limit_per_operation
fornisceil valorepiù alto limite dimemoriaimpostabilee quindi limita ancheilmassimo aumento delle dimensioni di archiviazionepertransazione. Ne consegue cheil lamemorizzazione di un contrattononpuò aumentare di oltre 60000byte pertransazione. Sinoti che unataletransazione costerebbe oggi ~ 180 usd.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.-
Quando dici "untaletxn costerebbe",ti riferisci alle commissioni ditransazione?Ilgasnon ha significatomonetario.L'importo della commissionetxn aumenta anche con la quantità di archiviazionenecessaria?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
-
Ilgasinfattinon ha un costofisso.Ma lamasterizzazione dello storage ha un costofissoperbyte.Vedi quiperesempio: https://tezos.stackexchange.com/a/2165/1773e qui http://tezos.gitlab.io/introduction/howtouse.htmlper una spiegazione completa.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
Ho alcune domande sui limiti di archiviazione del contrattointelligente.