Consumo de gás em uma cadeia de transferências internas
1 responda
- votos
-
- 2019-03-26
Vocênãopodeexceder o hard_gas_limit_per_operation=400000. Eleprovavelmente será aumentadoem protocolosfuturos,embora (ver,porexemplo,o Propostas" Atenas ").
Transferênciasinternaspodem usar ummonte degás.
Primeiro,há um custofixo de 10000gásportransferência.
Segundo,e >big_map ). Vocêpagagás de acordo com otamanhobinário dos dados lidos. Todo o código também é "analisado",afim de retirar otipo deparâmetro do contratoe compará-lo aotipoesperado. Isso aconteceem pelomenos dois lugares:
- .
- Quando vocêtem
contratop
em seutipobig_map
),o contrato será analisado antes que o script sejaexecutado. - Quando seu scriptexecuta o contrato
Contratop
Instrução Michelson,o contrato será analisado.
Então,isso significa que,afim detransferir_tokenspara um contrato script,você deve analisá-lo,pagandogásproporcional ao seu códigoe tamanho de armazenamento. Quandoesse contrato recebe atransferênciae é carregado a serexecutado,este custoe muito,serápago novamente ,antes que o script de destino comece afuncionar.
(é completamente Desnecessáriopara o armazenamento
código
,masespero queele seja corrigido algum dia,dividindo o códigoem váriaspeçasnobanco de dados. Talvezissopossa acontecer quando adicionamospontos deentrada deprimeira classe.)Então,umamaneira demitigarisso é certificar-se de quetodo contratoenvolvidotenha códigopequenoe armazenamento -excetopara o Big_MAP. Você sópagagáspara o conteúdo do Big_MAP quando você recebe (etalvez
Infelizmente,issoparece significar que,hoje,amaneiramaisideal deescrever contratos complexos (especialmente quandoeles são o destinoparatransferênciasinternas) serão usardescompacte
)eles.bytesbytesbig_map
como armazenamento,e Para colocartodo o códigoe armazenamento dentro do Big_MAP,carregando-o sob demanda,use descompactar.You cannot exceed the hard_gas_limit_per_operation = 400000. It will probably be increased in future protocols, though (see e.g. the "Athens" proposals).
Internal transfers can use up a lot of gas.
First, there is a fixed cost of 10000 gas per transfer.
Second, and more importantly, when a contract is 'parsed', the contract's entire
code
andstorage
are read out of the Tezos database (except for thebig_map
). You pay gas according the binary size of the data read. The entirecode
is also 'parsed', in order to pull out the parameter type of the contract, and compare it to the expected type. This happens in at least two places:- When you have
contract p
in yourstorage
type (outside of thebig_map
), the contract will be parsed before your script runs. - When your script executes the
CONTRACT p
Michelson instruction, the contract will be parsed.
So, this means that in order to TRANSFER_TOKENS to a scripted contract, you must parse it, paying gas proportional to its code and storage size. When that contract receives the transfer and is loaded to be executed, this cost, and more, will be paid again, before the destination script even starts running.
(It is completely unnecessary for the
storage
to be read from the database when parsing a contract. We could fix this trivially in a future protocol upgrade -- and we really should, it can lead to very surprising vulnerabilities. It will be less easy to fix the problem withcode
, but I expect it will be fixed someday, by splitting the code into several pieces in the database. Maybe this can happen when we add first-class entry points.)So, one way to mitigate this is to make sure that every contract involved has small code and storage -- except for the big_map. You only pay gas for the contents of the big_map when you
GET
(and maybeUNPACK
) them.Unfortunately, this seems to mean that, today, the most optimal way to write complex contracts (especially when they are the destination for internal transfers) will be to use
big_map bytes bytes
as storage, and to put all the code and storage inside the big_map, loading it on demand, using UNPACK.-
Obrigado,vou upvote a resposta uma vez queeu confirmar via - dry-executar que o custo dogásestá aumentando o limitepadrãonesta cadeia de chamadasinternas.Thanks, I'll upvote the answer once I confirm via --dry-run that gas cost is increasing the standard limit in this chain of internal calls.
- 0
- 2019-03-28
- user_184
-
Não éterrivelmente utilizável,masnote que vocêtambémpode usar "Tezos-Client Executar scriptfoo.tzno armazenamento"par,seja qualfor "einping" qualquer '-track-stack`,quepermitirá que você veja ogás restanteemcadapasso.It's not terribly usable, but note that you can also use `tezos-client run script foo.tz on storage 'Pair whatever whatever' and input 'whatever' --track-stack`, which will allow you to see the remaining gas at each step.
- 0
- 2019-03-28
- Tom
-
Parece que -track-stacknãofunciona ouprivado.Eu recebo o seguinteerro: "Opção de linha de comandoinesperada -track-stack." Noentanto,como você apontou,o limite degás éexaustivo.Seems like --track-stack doesn't work or deprected. I get following error : "Unexpected command line option --track-stack." However, As you pointed out , gas limit is exhausting.
- 0
- 2019-04-17
- user_184
-
oops,erro de digitação,é - stackoops, typo, it's --trace-stack
- 0
- 2019-04-17
- Tom
-
Sim,issofunciona.Emboraeles adicionassem os detalhesfornecidosporeste sinalizadorporpadrãoem logs defalha.yep, that works. Though they have added the details provided by this flag by default in failure logs.
- 0
- 2019-04-17
- user_184
Estoutentandoexecutar uma cadeia de chamadas de contrato comtransferênciasinternas.
Eu acho quemeus contratos atuais sãomuito simples,masfico semgás após apenas 4transferênciasinternas:
Quando as chamadasenvolvidas serão complexas,não serápossívelexecutar chamadasentre dois outrês contratos se continuar obtendo oerro deexaustão degás.
O que causaisso,e há algo queeupossafazer sobreisso?