¿Limitaciones de almacenamiento y tamaño de parámetros del contrato inteligente?
1 respuesta
- votos
-
- 2020-02-20
1. Tamañomáximo deparámetroportransacción
Elmáximo elnúmero debytesportransacciónpara una solatransacciónes limitado varias constantes,en particular untamaño superior depara operaciones
max_operation_data_length
y los límites degas duropara las operaciones ybloques (unbloque contiene un conjunto de operaciones):"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",
Estas constantespueden obtenersemediante una llamada RPC sitiene unnodoen ejecución:
tezos-client rpc get /chains/main/blocks/head/context/constants | jq
Presumiblemente,
max_operation_data_length
estáen bytes,lo que significa que tener un límite superior de ~ 16kBparaelparámetropor transacción. Tambiéntendría queeliminareltamañonecesariopara otros datos en latransacción,como remitente,destinatario,etc.Los límites degas
hard_gas_limit_per_block
yhard_gas_limit_per_operation
limitaindirectamentetantoel almacenamientomáximo ytamaño de latransacción. Cada vez que seinvoca un contratointeligente,elnodo pasapor las siguientesfases:- Leer la representaciónbinaria del código de contratointeligente +estado del contrato desdeel disco
- Decodificarel código,el almacenamiento y laentrada a una representación sintipo
- Escribael código de verificación,el almacenamiento y laentrada
- Ejecutar código
- Codifiqueel almacenamientoen una repr. sintipo.
- (escribir almacenamiento codificadoen el disco:por lotes y asíncrono)
Cada una deestasfases consumegas. Unparámetromásgrande aumentaelgas consumoen lafase 2-4. Un almacenamientomásgrande aumentael consumo degasen fases 1-5. Deello se deduce queel almacenamiento yeltamaño delparámetroestán limitadospor los límites delgas duro. Sinembargo,notengonúmeros concretos,perotú podría simularel uso detezos-clientpara obtenerestimaciones.
2. Tamañomáximo de almacenamientopor contrato
Finalmente,para su segundapregunta,que yaestáparcialmente respondidopor 1. AFAIK,no hay un límitefijoexplícito sobreel almacenamiento de un contratointeligente. Sinembargo,después de un ciertotamaño,el almacenamiento del contrato yano sepuede decodificar, porque hacerloexcedería los límites degas duro. Otra limitante elfactor son losfondos. El
costs_per_byte
está actualmenteen 1000 mutez. Esto significa que cada kB adicional cuesta ~ 1tz (actualmente ~=3usd)para almacenar,pagadopor el remitente de latransacción que aumentael almacenamiento.También debemos considerar la constante
hard_storage_limit_per_operation
. Siempre que unatransacción sea inyectadoen la red,está asociado con un límite de almacenamiento. Por logeneral,loestableceel usuarioparagarantizar que sutransacción noprovoca una cantidadno deseada de quemaduraspor almacenamiento. Sieltamaño de la diferencia detamaño de almacenamiento resultante de aplicar latransacción superael límite de almacenamiento,latransacción se rechaza. loshard_storage_limit_per_operation
constante daelmayor límite de almacenamiento que sepuedeestablecer y,por lotanto,también limitaelmáximo aumento deltamaño de almacenamientoportransacción. Deello se deduce queel el almacenamiento de un contratonopuede aumentar conmás de 60000bytes portransacción. Tengaen cuenta quetaltransacción costaría ~ 180 usd hoy.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.-
Cuando dice "taltxn costaría",¿se refiere a lastarifas detransacción?Elgasnotiene significadomonetario.¿La cantidad de latarifa detxntambién aumenta con la cantidad de almacenamientonecesaria?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
-
De hecho,elgasnotiene un costofijo.Pero la quema de almacenamientotiene un costofijoporbyte.Vea aquí,porejemplo: https://tezos.stackexchange.com/a/2165/1773 y aquí http://tezos.gitlab.io/introduction/howtouse.htmlpara unaexplicación 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
Tengo algunaspreguntas sobre las limitaciones de almacenamiento del contratointeligente.