Lanzamiento de @kadena/client: Interactuando con Kadena blockchain de Alberto G Kadena noviembre de 2022

El equipo de Kadena.js ha creado una biblioteca que permite a los usuarios de Javascript/Typescript interactuar fácilmente con Kadena blockchain generando tipos basados ​​en su contrato inteligente.

El equipo de Kadena.js ha creado una biblioteca que permite a los usuarios de Javascript/Typescript interactuar fácilmente con Kadena blockchain. La creación de contratos se deja explícitamente fuera de la biblioteca, ya que es mucho más complicado transpilar Javascript a Pact.

La interacción con Kadena blockchain funciona de múltiples maneras. Con la herramienta @kadena/client, hay dos formas de interactuar con Kadena blockchain. Las dos formas son:

basado en contrato; y Basado en plantillas.

También hay información sobre una forma automatizada de firmar usando Chainweaver, que se detallará más adelante en este artículo. También exploraremos los conceptos y la lógica de @kadena/client.

Tenga en cuenta que no vamos a repasar la instalación de nodejs y la administración de paquetes, ya que esta información está ampliamente disponible en Internet. Sin embargo, proporcionaremos la información y los detalles mínimos que necesitará para comenzar a usar @kadena/client, que son:

instale nodejs, versión 14.x o 16.xcree un directorio, inicie un paquete.json ejecutando npm init o npm init -y para usar defaultsinstall typescript npm install -g typescriptinstall el cliente npm install @kadena/clientinstale la herramienta de línea de comandos npm install @kadena/pactjs-clinpm init -y # crea un paquete.json
npm instalar @kadena/cliente @kadena/pactjs-cli
tsc –init # crea un tsconfig.json

Interacción basada en contrato usando @kadena/client

Queríamos que @kadena/client fuera independiente de cualquier cosa, por lo que esta es solo una herramienta que se puede usar con contratos arbitrarios. Además, existe otra razón por la que debe generar las interfaces que utiliza @kadena/client. Puede usar información de la cadena de bloques o de sus propios contratos inteligentes, localmente.

Como verá, proporcionamos un repositorio con plantillas para usar con el lado de la plantilla de esta herramienta.

Cargar contratos desde la cadena de bloques

Con la herramienta de línea de comandos @kadena/pactjs-cli, descargue los contratos para los que desea crear interfaces de TypeScript.

contratos mkdir && npx @kadena/pactjs-cli retrieve-contract –out “./contracts/coin.module.pact” –module “moneda”

Hay varias opciones para recuperar contratos de otra red o cadena.

Información de ayuda sobre el contrato de recuperación

pactojs recuperar-contrato –ayuda

> pactojs recuperar-contrato –ayuda
Uso: contrato de recuperación de índice [options]Recupere el contrato de api.chainweb.com en un /local callOptions:
-m, –module
El módulo que desea recuperar (p. ej., “moneda”)-o, –out Archivo para escribir el contrato-n, –network Red de la que recuperar (predeterminado “mainnet”) (predeterminado:
“mainnet”)-c, –chain Cadena de la que recuperar (predeterminado 1) (predeterminado: 1)-h, –help muestra ayuda para el comando

Generar interfaces

Usando el contrato ahora generaremos todas las funciones (defuns) con sus argumentos (escritos) y las capacidades (defcaps).

pactojs contrato-generar –archivo “./contratos/coin.module.pact”

El registro muestra lo que ha sucedido. Dentro del directorio node_modules, se ha creado un nuevo paquete: .kadena/generated. Este paquete amplía los tipos @kadena/client para brindarle información de tipo. Asegúrese de agregar “tipos”: [“.kadena/client”] a su tsconfig.json.

Construyendo una transacción simple a partir del contrato

Ahora que todo está arrancado, podemos comenzar a crear transacciones.

Cree un nuevo archivo y asígnele el nombre transfer.ts (o .js).

importar { Pactjs } desde ‘@kadena/client’; // almacenar el constructor en una variable
const transaccionBuilder =
// la llamada básica da como resultado el código Pact `(coin.transfer “k:your-pubkey” “k:receiver-pubkey” 231.0)`
Pacto.módulos.moneda
.transfer(‘k:su-clave-pública’, ‘k:clave-pública-receptor’, 231)
// agregue la capacidad necesaria de coin.GAS (esto define quién paga el gas)
.addCap(‘moneda.GAS’, ‘tu-clave’)
// agregue la capacidad necesaria de coin.TRANSFER
.addCap(
‘moneda.TRANSFERIR’,
‘tu-pubkey’,
‘k:tu-pubkey’,
‘k:receptor-pubkey’,
231,
)
// lo mínimo que NECESITA agregar es el remitente de esta transacción
.setMeta({
remitente: ‘tu-pubkey’,
});

Tome nota de lo siguiente:

Los argumentos con espacios de nombres (k:, w: etc.) son nombres de cuentas, mientras que los argumentos sin espacios de nombres son claves públicas. El contrato no especifica si necesita pasar un nombre de cuenta o una clave pública. Este es el conocimiento que se puede obtener inspeccionando el contrato descargado anteriormente o consultando la documentación del contrato. La función addCap acepta una capacidad y una clave pública del firmante de la capacidad. Los otros argumentos están definidos por el contrato. coin.GAS no tiene ningún argumento, coin.TRANSFER tiene.setMetas objeto tiene una propiedad de remitente, que es una clave pública.

Para firmar la transacción, puede usar el generador para generar algo que se pueda pegar en los SigData de Chainweaver.

// createTransaction() calculará hashes y
// finaliza la transacción sin firmar
const unsignedTransaction = transactionBuilder.createTransaction();console.log(JSON.stringify(unsignedTransaction));

Usando la transacción, podemos enviar una solicitud de firma a Chainweaver. (Nota: esto solo puede ocurrir con la versión de escritorio, no con la versión web, ya que está exponiendo el puerto 9467

En el futuro proporcionaremos una interfaz con WalletConnect. Esto aún no está finalizado. Una vez que lo esté, actualizaremos @kadena/client en consecuencia.

importar {
firmar y enviar con Chainweaver,
firmar con Chainweaver,
} from ‘@kadena/client’;// pase el objeto transactionBuilder, ya que los metadatos aún se pueden cambiar
const submitResult = signAndSubmitWithChainweaver(transactionBuilder);// use la transacción finalizada y fírmela con Chainweaver
cont transacciónfirmada = signWithChainweaver(transacción no firmada)
.entonces(consola.registro)
.catch(consola.error);

Tome nota de lo siguiente:

createTransaction() finalizará la transacción. Se calculará el hash. Cosas como sender, gasPrice o gasLimit NO SE PUEDEN cambiar más. signWithChainweaver necesita la transacción finalizadasignAndSubmitWithChainweaver necesita la transacción “abierta”, ya que necesita calcular el hash para los metadatos (remitente, parámetros de gas)

Para proporcionar a los desarrolladores de contratos una forma de comunicar cómo se deben usar sus contratos, agregamos una forma de obtener el autocompletado para las plantillas. Los desarrolladores de contratos ahora pueden proporcionar sus contratos que los consumidores de su contrato inteligente pueden usar en Javascript.

Por ahora no hemos agregado una forma de generar directamente el código desde un repositorio remoto de git. Clonar el repositorio de plantillas como un submódulo es una excelente opción. Esto le brinda una forma de versionar la fuente de las plantillas.

submódulo git agregar
[email protected]:chain-community/chain-coin-templates.git
./plantillas/

Comandos útiles de `git submodule` (haga clic para abrir)

Agregue un repositorio Git como submódulo:
git submodule add repository_urlAgregue un repositorio Git como un submódulo en el directorio especificado:
git submodule add repository_url path/to/directoryActualiza cada submódulo a su última confirmación:
git submodule foreach git pullInstala los submódulos especificados de un repositorio (después de clonar el repositorio):
actualización del submódulo git –init –recursive

Por lo general, un directorio/repositorio de plantillas contiene varias plantillas, pero todas provienen de la misma fuente. Así que los estamos agrupando por directorio/repositorio. Esto se hace seleccionando el directorio como entrada para el comando.

Este comando dará como resultado un archivo que contiene todas las plantillas.

pactjs template-generate –file ./templates/kadena-coin-templates/ –out ./generated/kadena-coin-templates.ts

Notas sobre la entrada (–file) y la salida (–out):

-f, –archivo

seleccionar un archivo como entrada creará SÓLO código para ese archivo seleccionar un directorio como entrada creará código para TODAS las plantillas en el directorio

-o, –fuera

cuando la salida es un archivo, el código de las plantillas terminará en ese archivocuando la salida es un directorio, se creará un index.ts en ese directorio, que contiene el código de las plantillas

Cada archivo en el repositorio se convierte en una función que se puede llamar. La función tiene un argumento; un objeto que contiene pares clave-valor con nombre para cada variable en la plantilla.

Por ejemplo, una plantilla falsa que se ve así

# ./hola.txt
Este es un ¡Hola, {{name}}!

Tendrá su llamada de función

importar myTemplates from ‘./myTemplates’;myTemplates.hello({ nombre: ‘Albert’ });

Por supuesto, esta no es una plantilla válida para usar como transacción, por lo que no funcionará. Pero esto describe la idea general de cómo se utilizan las plantillas.

Digamos que estamos usando esta plantilla. Las plantillas no son válidas yaml. Sin embargo, se verifica que sean transacciones válidas cuando se usan como plantillas.

código: |-
(coin.transfer “{{fromAcct}}” “{{toAcct}}” {{cantidad}})
datos:
publicMeta:
cadenaId: ‘{{cadena}}’
remitente: {{fromAcct}}
límite de gas: 2500
GasPrecio: 1.0e-8
total: 600
ID de red: {{red}}
firmantes:
– pubKey: {{fromKey}}
tapas:
– nombre: ‘moneda.TRANSFERIR’
argumentos: [{{ fromAcct }}, {{toAcct}}, {{amount}}]
– nombre: ‘moneda.GAS’
argumentos: []
tipo: ejecutivo

Cada uno de los {{name}} son variables que se pueden pasar a la función de plantilla.

La función devuelve un CommandBuilder, esto se puede usar en signAndSubmitWithChainweaver(cmd) o para .createTransaction() y se usa en signWithChainweaver(unsignedTx) como se muestra aquí

importar kadenaCoinTemplates desde ‘./templates/kadena-coin-templates’;// esto devuelve un commandBuilder
const commandBuilder = kadenaCoinTemplates[‘safe-transfer’]({
fromAcct: ‘k:remitente-pubkey’,
toAcct: ‘k:receiver-pubkey’,
fromKey: ‘remitente-pubkey’,
cantidad: ‘231’,
cadena: ‘1’,
red: ‘mainnet01’,
}); const transacción sin firmar = commandBuilder.createTransaction();

Esta es la publicación de lanzamiento de @kadena/client. Los próximos pasos serán ver qué piensa la comunidad de este enfoque. Nos encantaría escuchar sus comentarios y casos de uso, especialmente cuando los actuales @kadena/client y @kadena/pactjs-cli no son suficientes.

¡Esperamos que haya encontrado este artículo útil e informativo!

Supervisamos nuestro canal Discord y los problemas de Github: