$ cd $ TOP
$ cat < animagus / ruby / execute.rb
require_relative "ast_pb" def build_execution_node (query_cell_node)
get_capacity_function = Ast :: Value :: new (
t: Ast :: Valor :: Tipo :: GET_CAPACITY,
niños: (
Ast :: Value :: nuevo (
t: Ast :: Valor :: Tipo :: ARG,
u: 0
)
)
)
capacidades = Ast :: Valor :: nuevo (
t: Ast :: Valor :: Tipo :: MAPA,
niños: (
get_capacity_function,
query_cell_node
)
) add_balance_function = Ast :: Value :: new (
t: Ast :: Valor :: Tipo :: AGREGAR,
niños: (
Ast :: Value :: nuevo (
t: Ast :: Valor :: Tipo :: ARG,
u: 0
),
Ast :: Value :: nuevo (
t: Ast :: Valor :: Tipo :: ARG,
u: 1
)
)
)
initial_balance = Ast :: Value :: new (
t: Ast :: Valor :: Tipo :: UINT64,
u: 0
)
Ast :: Value :: nuevo (
t: Ast :: Valor :: Tipo :: REDUCIR,
niños: (
add_balance_function,
saldo inicial,
capacidades
)
)
enddef build_root (nombre, nodo)
Ast :: Root :: nuevo (
llamadas: (
Ast :: Call :: nuevo (
nombre nombre,
resultado: nodo
)
)
)
final
EOF $ cd $ TOP
$ palanca -I animago / rubí
(1) palanca (principal)> requiere 'query_cell'
(2) palanca (principal)> requiere 'ejecución'
(3) palanca (principal)> query_cell_node = build_query_cell
(4) palanca (principal)> node_node = build_execution_node (query_cell_node)
(5) palanca (principal)> root = build_root ("balance", execute_node)
(6) palanca (principal)> File.write ("balance.bin", Ast :: Root.encode (root))
Como se mencionó anteriormente, podríamos haber construido el AST en otros idiomas, como Go, que también se usa para construir Animago. Podríamos haber escrito todo en un solo archivo en lugar de distribuirlo en 2 archivos y una parte REPL. La razón por la que elegí este enfoque es que Ruby proporciona un REPL que permite la experimentación rápida.
Si desea cambiar el AST para agregar saldos de otros nodos, puede modificar el AST existente de inmediato. Si solo desea contar el número de celdas en lugar de recopilar saldos, también puede hacerlo. La mejor manera de aprender Animago"El diseño de AST es realmente jugar con él, así que siéntete libre de hacer cambios en el AST que creamos aquí. Tal vez encuentre el Ruby REPL súper útil.
Ahora vamos a encender Animago en una ventana de terminal diferente (es posible que desee mantener abierto el Ruby REPL ya que usaremos Ruby para ejecutar llamadas a Animago luego):
$ cd $ TOP
$ ./animagus/animagus -astFile = balance.bin -graphqlUrl = http: //127.0.0.1: 9115 / graphql
2020/03/04 03:41:34 Bloque indexado 92b197aa1fba0f63633922c61c92375c9c074a93e85963554f5499fe1450d0e5, número de bloque 0
2020/03/04 03:41:34 Bloque indexado 2567f226c73b04a6cb3ef04b3bb10ab99f37850794cd9569be7de00bac4db875, bloque número 1
2020/03/04 03:41:34 bloque indexado 2af0fc6ec802df6d1da3db2bfdd59159d210645092a3df82125d20b523e0ea83, bloque número 2
2020/03/04 03:41:34 Bloque indexado 247167d03a723f6b8999da09d94b61fadf47f94364d729cb6272edc1f20009b7, bloque número 3
2020/03/04 03:41:34 Bloque indexado 83832d6367429901a4bf763a6d6cbdc658a2624a8a4cda7427edd6fad65d0f7d, número de bloque 4
2020/03/04 03:41:34 Bloque indexado 67a0604ef3147f82f81c44d8b74f7329ac4ebabc29a2931a88d64c8f44b77735, bloque número 5
(registros omitidos ..)
Tú lo notarás Animago ha comenzado a indexar bloques desde CKB. Aunque Animago está indexando, ya puede comenzar a servir solicitudes GRPC utilizando los datos indexados actualmente. Tener en cuenta, hasta Animago se ha puesto al día con los últimos bloques de CKB, los datos pueden no ser precisos, ya que los bloques indexados posteriores pueden incluir depósitos y retiros adicionales.
Para fines de prueba, ejecutaremos las solicitudes reales ahora. Sin embargo, en producción, es posible que desee esperar hasta Animago se pone al día con la punta de la cadena actual.
Ahora volvamos a nuestra REPLY Ruby anterior:
(12) palanca (principal)> requiere 'generic_pb'
(13) palanca (principal)> requiere 'generic_services_pb'
(14) palanca (principal)> stub = Generic :: GenericService :: Stub.new ("127.0.0.1:4000",: this_channel_is_insecure)
(15) pry (main)> param = Ast :: Value :: new (t: Ast :: Value :: Type :: BYTES, raw: ("903a0633f6ab457de09efb8f84dc271dc488bf62"). Pack ("H *"))
(16) pry (main)> request = Generic :: GenericParams.new (nombre: "balance", params: (param))
(17) palanca (principal)> stub.call (solicitud)
=>
En el ejemplo que se muestra arriba, elegí esta dirección en la red principal de CKB. (No tengo ninguna pista de quién es esta dirección, simplemente estoy usando una dirección del bloque de génesis que aún no se ha gastado). De esta manera Animago debería poder indexar su valor rápidamente sin mucho retraso. De la llamada GRPC real, hemos completado 0x903a0633f6ab457de09efb8f84dc271dc488bf62, que es la parte de script args de la dirección, como se usa en el parámetro 0 del AST del verificador de saldo. Puede ver que hemos logrado obtener el resultado, que es 89732200000000 shannons o 897322 CKB. Siéntase libre de cambiar el parámetro a los argumentos del script de otra dirección y probarlo.
Ahora hemos implementado un verificador de saldo de direcciones completo usando Animago. Si bien este ejemplo es bastante simple, puede adaptarlo para crear ejemplos más complicados, como recopilar saldos de varias direcciones o recopilar depósitos DAO de Nervos.
Animago puede transformarse en lo que desee, siempre que lo alimente con un AST utilizado para extraer y transformar los datos que desee.
Por ahora, espero que estés de acuerdo en que el nombre Animago Es bastante adecuado para este proyecto.
Esto completa nuestra publicación sobre correr Animago. norteext arriba, veremos cómo integrar la especificación UDT simple usando Animago. No solo veremos cómo agregar saldos UDT, sino que también mostraremos cómo podemos usar Animago para transferir UDT de una cuenta a otra. ¡Por favor manténgase al tanto!