Para entender Koinos Types es bueno ver qué situaciones han sucedido en el pasado y cómo se han solucionado los problemas. Miremos un ejemplo concreto: El hardfork 21 de steem que introdujo el Steem Proposal System (SPS).
El SPS fue creado por @blocktrades y su equipo de trabajo. Con su introducción muchas más variables fueron incluídas en el código de steem, y en concreto 3 de ellas eran importantes para las wallets: create_proposal_operation
, update_proposal_votes_operation
, y remove_proposal_operation
.
¿Cuál es el siguiente paso? Actualizar las librerías de las wallets: Steem-js (javascript), dSteem (alternativa a steemjs también en javascript), y Beem (python). Estas son las 3 librerías principales de las cuales se desprenden la mayoría de las webs, apps, wallets, extensiones de chrome, etc.
Actualizar estas librerías no es que sea un trabajo muy complicado, pero sí requiere de alguien que se tome el tiempo de ir a estas librerías y actualizarlas para que quienes las usen puedan aprovechar las nuevas funcionalidades. De hecho @jga, nuestro colaborador en Koinos en Español, trabajó concretamente en esta actualización para dSteem. Si por ejemplo, nadie hubiera actualizado dSteem entonces las webs que se apoyaban de esta librería tendrían que pensar en alternativas diferentes, como migrar su código a Steem-js, lo cual probablemente requeriría un mayor trabajo.
¿Qué tan complicado es actualizar estas librerías? Miremos de nuevo el ejemplo de SPS. Mientras que en el código de la blockchain la operación de remove proposal se escribía así
struct remove_proposal_operation : public base_operation
{
account_name_type proposal_owner;
/// IDs of proposals to be removed. Nonexisting IDs are ignored.
flat_set_ex<int64_t> proposal_ids;
extensions_type extensions;
void validate() const;
void get_required_active_authorities(flat_set<account_name_type>& a)const { a.insert(proposal_owner); }
};
en dSteem había que escribirlo así:
export interface RemoveProposalOperation extends Operation {
0: 'remove_proposal'
1: {
proposal_owner: string
proposal_ids: number[]
extensions: any[]
}
}
Si te fijas tienen muchas similitudes, simplemente que hay que escribirlas de forma diferente. Es importante notar que aquí estamos hablando de la "definición" de remove proposal, es decir, de qué variables esperamos que contenga esta operación y cómo serializarla, cómo transformarla en 0's y 1's para que así lo que se firme desde dSteem pueda ser interpretado correctamente por la blockchain.
Ahora sí la pregunta...
¿Qué pretende Koinos Types? Que este trabajo sea automático. Que cuando uno tipo de variable (estructura, operación, etc) se escriba en el código base entonces automáticamente se genere el código correspondiente para otros lenguajes (Go, Python, Typescript) y que todos ellos serialicen dicha variable de la misma forma. Así nadie tiene que estar constantemente actualizando las librerías para cada lenguaje una por una. De nuevo, aquí estamos hablando solo de los "tipos", la definición de variables.
Has este ejercicio: Ve a https://github.com/koinos/koinos-types-golang y mira quién ha hecho los commits en este repositorio. Te darás cuenta que los ha hecho un bot. Esa es la idea. El código original se escribe en https://github.com/koinos/koinos-types en C++ y allí mismo se ponen unas rutinas que interpreten este código original y generen automáticamente el código para otros lenguajes. Esta forma de "interpretar" el código original es lo que hay que hacer bien para cada lenguaje de programación. Ahora mismo solo está hecho para Golang y en un futuro esperar incluir Typescript (y con typescript tienes javascript incluído, dos pájaros de un solo tiro).
Y un punto final importante para mencionar. En el ejemplo mencionado arriba, las librerías actualizaron solo estas 3 operaciones porque eran las únicas que interesaban para los propósitos relacionados con wallets, pero en realidad el SPS introdujo muchos más tipos de variable nuevos que solo interesaban a nivel interno del blockchain. Bien, Koinos Types incluye también todas estas variables internas porque precisamente lo que se quiere en Koinos es usar microservicios, es decir, diferentes partes del blockchain escritos de forma independiente y tal vez en diferentes lenguajes de programación, y que se puedan entender entre ellos.
Para más detalles mira el último post de Koinos hablando de Koinos Types y la entrevista a @gerbino.