Artículo de Blog

Un Nuevo SDK de Go para la Red Stellar

Autor

Eric Saunders

Fecha de publicación

SDK

Horizonte

API

Nos complace anunciar el lanzamiento de un nuevo SDK de Go para la red Stellar. Junto con JavaScript y Java, este es el tercer SDK oficial respaldado por Stellar Development Foundation (SDF).

horizonclient es un paquete que brinda acceso de cliente a un servidor Stellar Horizon. Te permite recuperar información del ledger, ya sea como llamadas únicas o como un flujo de actualización continua. Puedes encontrar saldos de cuentas, verificar el estado de una transacción o monitorear en tiempo real nuevas ofertas para un token emitido. ¡También puedes enviar transacciones! El cliente admite completamente todos los puntos finales REST expuestos por la API de Horizon.


// Create a new randomly generated address
kp, err := keypair.Random()

// Create and fund the new address on TestNet, using friendbot
client := horizonclient.DefaultTestNetClient
resp, err := client.Fund(kp.Address())

// Get information about the account we just created
accountRequest := horizonclient.AccountRequest{AccountID: kp.Address()}
horizonAcct, err := client.AccountDetail(accountRequest)

Un segundo paquete, txnbuild, apoya la construcción conveniente de operaciones y transacciones. Estos son los bloques de construcción del cambio en el sistema Stellar; para hacer que algo suceda en la red se requiere la presentación de una o más operaciones, envueltas en una transacción.


// An operation to create a new Stellar account funded from an existing one
createAccountOp := txnbuild.CreateAccount{
	Destination: "GDKT2RF3P7VVKOCAN5UXZ2WNGRXTRWNWOCWZZWRL2WQPPROCFSE3RGRQ",
	Amount: "10",
}

// Construct the transaction that will carry the operation
tx := txnbuild.Transaction{
	SourceAccount: horizonAcct,
	Operations: []txnbuild.Operation{&createAccountOp},
	Timebounds: txnbuild.NewTimeout(300),
	Network: network.TestNetworkPassphrase,
}

Las transacciones construidas con txnbuild pueden enviarse fácilmente a cualquier servidor Horizon para su procesamiento a través de horizonclient.


// Serialise the transaction to XDR, and sign it
err := tx.Build()
err = tx.Sign(kp)

// Submit the transaction
resp, err := client.SubmitTransaction(tx)

¿Cuándo necesitas cada paquete? Una regla general es que cualquier acción que cambie el estado del ledger de Stellar se construye con txnbuild, mientras que horizonclient típicamente recupera información de la red. Para la mayoría de las aplicaciones, probablemente necesitarás funcionalidad de ambos paquetes.

¿Por qué un nuevo enfoque?

Elegimos reescribir el cliente Horizon de Go existente porque necesitaba adiciones significativas, y una nueva estructura (incorporando las mejores partes del cliente antiguo) era la mejor manera de apoyar eso. Para la construcción de transacciones, la situación era más matizada.

Nos acercamos a este problema antes con una biblioteca llamada build. Este enfoque anterior era muy general y, sin duda, elegante. Pero era difícil de entender. Desafortunadamente los GoDocs relevantes no son tu amigo aquí:


func (b *CreateAccountBuilder) Mutate(muts …interface{})

Esto es oscuro, porque tanto los argumentos específicos como la información de tipo están abstraídos. Para un usuario nuevo, esto es casi imposible de entender sin un ejemplo (o consultando la fuente de la biblioteca).

Así que decidimos darle otra vuelta al problema.

Los SDK oficiales JS y Java usan el patrón de constructor. El patrón de constructor es particularmente común en Java, porque el constructor es tan inflexible. Aplicar el patrón permite que la construcción del objeto se desacople del objeto en sí, y permite construcciones parciales sin establecer muchos constructores.

En Go, el patrón es menos común, porque i) puedes hacer configuración parcial simplemente estableciendo campos de estructura, y ii) el patrón arruina el manejo de errores de Go, ya que la cadena de métodos no se lleva bien con múltiples valores de retorno.

La filosofía de diseño que elegimos fue ser eficientes y minimizar abstracciones. Usamos estructuras expresivas para hacer la configuración lo más compacta posible.


// Set only the fields we're interested in
op := SetOptions{
	ClearFlags: []AccountFlag{AuthRevocable},
	SetFlags: []AccountFlag{AuthRequired, AuthImmutable},
}

Todos los campos de estructura son fácilmente descubribles durante la codificación. Los argumentos opcionales pueden omitirse. La configuración puede ocurrir toda de una vez durante la inicialización de la estructura, o los campos individuales pueden establecerse más tarde en el ciclo de vida del objeto.

Para operaciones más complejas, donde la semántica de operación subyacente permite comportamiento de crear/actualizar/eliminar, proporcionamos ayudantes de fábrica simples.


// Create a ManageOffer operation configured for deletion
op, err := DeleteOfferOp(offerID)

Pruébalo

Si estás interesado en probar el código, dirígete a nuestro repositorio de GitHub y obtén la última versión. En nuestro sitio para desarrolladores, todas las operaciones de Stellar se resumen en una referencia útil.

Para una mirada más profunda a la funcionalidad disponible, revisa los GoDocs para horizonclient y txnbuild. Estos contienen muchos ejemplos de uso, incluyendo muestras para todas las operaciones. Si estás listo para construir algo más involucrado, echa un vistazo a nuestro demo de línea de comando más extenso, que crea y destruye cuentas en el demo, el cual crea y destruye cuentas en la red Testnet de Stellar.

Esta biblioteca está bajo desarrollo activo y ¡nos encantaría tu feedback! Por favor reporta errores y funcionalidades faltantes aquí. Para preguntas generales sobre este SDK, Horizon u otros temas de Stellar, el Stellar Stack Exchange es un gran recurso. Por último, si quieres chatear, ¡únete a la comunidad! Encontrarás a mí y a otros desarrolladores de SDF pasando el rato en el equipo stellar.public en Keybase.