SDK de Go - Simulando Transacciones
Simular transacciones te permite previsualizar el costo y el efecto de enviar una transacción sin pagar comisiones. Puedes usar esto para estimar comisiones, probar una transacción, o verificar cuál podría ser el resultado.
Para simular una transacción, debes pasar una transacción y qué cuenta sería el firmante:
// transfer_coin es un ejemplo de cómo hacer una transacción de transferencia de moneda de la manera más simple posiblepackage main
import ( "fmt"
"github.com/aptos-labs/aptos-go-sdk" "github.com/aptos-labs/aptos-go-sdk/bcs")
const FundAmount = 100_000_000const TransferAmount = 1_000
// example Este ejemplo te muestra cómo hacer una transacción de transferencia de APT de la manera más simple posiblefunc example(networkConfig aptos.NetworkConfig) { // Crear un cliente para Aptos client, err := aptos.NewClient(networkConfig) if err != nil { panic("Failed to create client:" + err.Error()) }
// Crear cuentas localmente para alice y bob alice, err := aptos.NewEd25519Account() if err != nil { panic("Failed to create alice:" + err.Error()) } bob, err := aptos.NewEd25519Account() if err != nil { panic("Failed to create bob:" + err.Error()) }
fmt.Printf("\n=== Direcciones ===\n") fmt.Printf("Alice: %s\n", alice.Address.String()) fmt.Printf("Bob:%s\n", bob.Address.String())
// Financiar al remitente con el faucet para crearlo en la cadena err = client.Fund(alice.Address, FundAmount) if err != nil { panic("Failed to fund alice:" + err.Error()) }
aliceBalance, err := client.AccountAPTBalance(alice.Address) if err != nil { panic("Failed to retrieve alice balance:" + err.Error()) } bobBalance, err := client.AccountAPTBalance(bob.Address) if err != nil { panic("Failed to retrieve bob balance:" + err.Error()) } fmt.Printf("\n=== Saldos Iniciales ===\n") fmt.Printf("Alice: %d\n", aliceBalance) fmt.Printf("Bob:%d\n", bobBalance)
// 1. Construir transacción accountBytes, err := bcs.Serialize(&bob.Address) if err != nil { panic("Failed to serialize bob's address:" + err.Error()) }
amountBytes, err := bcs.SerializeU64(TransferAmount) if err != nil { panic("Failed to serialize transfer amount:" + err.Error()) } rawTxn, err := client.BuildTransaction(alice.AccountAddress(), aptos.TransactionPayload{ Payload: &aptos.EntryFunction{ Module: aptos.ModuleId{ Address: aptos.AccountOne, Name: "aptos_account", }, Function: "transfer", ArgTypes: []aptos.TypeTag{}, Args: [][]byte{ accountBytes, amountBytes, }, }}, )
if err != nil { panic("Failed to build transaction:" + err.Error()) }
// 2. Simular transacción // Esto es útil para entender cuánto costará la transacción // y para asegurar que la transacción es válida antes de enviarla a la red // Esto es opcional, pero recomendado simulationResult, err := client.SimulateTransaction(rawTxn, alice) if err != nil { panic("Failed to simulate transaction:" + err.Error()) } fmt.Printf("\n=== Simulación ===\n") fmt.Printf("Precio unitario de gas: %d\n", simulationResult[0].GasUnitPrice) fmt.Printf("Gas usado: %d\n", simulationResult[0].GasUsed) fmt.Printf("Comisión total de gas: %d\n", simulationResult[0].GasUsed*simulationResult[0].GasUnitPrice) fmt.Printf("Estado: %s\n", simulationResult[0].VmStatus)}
func main() { example(aptos.DevnetConfig)}
Mira aquí para ver el ejemplo completo de cómo construir, simular y enviar una transacción.
También puedes aprender cómo simular transacciones más avanzadas mirando las siguientes guías: