¿Qué es el esquema TL-B en Ton-Solidity y cómo se utiliza?
Esta pregunta se trata del lenguaje de programación Solidity en los contratos inteligentes de la blockchain Everscale.
A veces, veo el código relativo al esquema TL-B. Por ejemplo, así:
function getInvokeMessage(address sender, address recipient, uint128 amount, bool bounce, TvmCell payload) public pure
returns(TvmCell message) {
TvmCell body = tvm.encodeBody(MsigDebot.invokeTransaction, sender, recipient, amount, bounce, payload);
TvmBuilder message_;
message_.store(false, true, true, false, address(0), address(this));
message_.storeTons(0);
message_.storeUnsigned(0, 1);
message_.storeTons(0);
message_.storeTons(0);
message_.store(uint64(0));
message_.store(uint32(0));
message_.storeUnsigned(0, 1); //init: nothing$0
message_.storeUnsigned(1, 1); //body: right$1
message_.store(body);
message = message_.toCell();
}
Necesito explicaciones paso a paso, ¿qué hace este código? ¿O pueden darme las referencias a la documentación que lo explique?
davy.ai
Este código define una función llamada
getInvokeMessage
que devuelve una variablemessage
de tipoTvmCell
. Aquí tienes una explicación paso a paso de lo que hace este código:sender
,recipient
,amount
,bounce
ypayload
. Estas son variables estándar que se utilizan con frecuencia en los contratos inteligentes de blockchain.body
que almacena los datos codificados de una llamada de funcióninvokeTransaction
de un contrato debot multisig llamadoMsigDebot
. Esta línea de código asume que el contratoMsigDebot
tiene una función llamadainvokeTransaction
que tomasender
,recipient
,amount
,bounce
ypayload
como argumentos.message_
de tipoTvmBuilder
, que es un objeto en el lenguaje Ton-Solidity utilizado para construir TvmCells.message_
se utiliza para construir una variablemessage
de tipo TvmCell.message_
almacena varias variables utilizando el métodostore
de la claseTvmBuilder
. Esto es lo que hace cada una de ellas:message_.store(false, true, true, false, address(0), address(this))
almacena una tupla de 6 variables que controlan el comportamiento del mensaje. Estas variables son, respectivamente:bounceFlag
,enableTick
,enableTest
,payloadIsR1
,src
ydst
. Se inicializan aquí con valores específicos.message_.storeTons(0)
almacena el valor 0 en el campo de valor del mensaje. Claramente, este mensaje no envía TON como parte de su transferencia.message_.storeUnsigned(0, 1)
almacena un solo bit de datos en la posición especificada dentro de los datos del mensaje. Esta línea representa la bandera utilizada para indicar si este mensaje tiene una clave pública como dirección, lo cual no es el caso aquí.message_.storeTons(0)
almacena otro valor TON de 0 en el campo de encabezado del mensaje.message_
:–
message_.storeTons(0)
almacena otro valor TON de 0;–
message_.store(uint64(0))
almacena un valor uint64 de 0 en el campo de tiempo de vencimiento del mensaje;–
message_.store(uint32(0))
almacena un valor uint32 de 0 en el campo de límite de gas del mensaje;–
message_.storeUnsigned(0, 1)
almacena otra bandera de 1 para indicar si esta transacción tiene un encabezado, que es verdadero en este caso;–
message_.storeUnsigned(1, 1)
almacena otra bandera de 1, indicando que el cuerpo de la transacción que definimos en el paso 2 existe;–
message_.store(body)
almacena la variablebody
definida en el paso 2 en el campo de cuerpo del mensaje.7. Por último, se llama al método
message_.toCell()
en el objetomessage_
para convertirlo en un objetoTvmCell
, que es devuelto por la funcióngetInvokeMessage
.Este código define la función
getInvokeMessage
, que toma algunos argumentos y devuelve una variableTvmCell
que contiene información sobre un tipo específico de transacción de contrato inteligente. Más específicamente, esta función construye la transacción en el formato del esquema TL-B. Si quieres obtener más información sobre este formato o sobre el lenguaje Ton-Solidity, la documentación en ton.dev es un gran recurso.