Versión imprimible multipagina. Haga click aquí para imprimir.
Kore Node
- 1: Qué es
- 2: Configuración
1 - Qué es
Kore Node es in intermediario entre Kore Base y los diferentes Kore Clients como podría ser Kore HTTP. Sus principales funciones son 4:
- Crear una API que consumiran los diferentes Kore Clients para poder comunicarse con Kore Base, el objetivo de esta API es la simplificación de los tipos, es decir, se encarga de recibir tipos básicos como
String
y convertirlos en tipos complejos que espera recibir Kore Base como unDigestIdentifier
. Otro objetivo de esta API es convinar diferentes métodos de la API de Kore Base para realizar una funcionalidad concreta como podría ser la de crear un sujeto de trazabilidad, de esta forma añadimos una capa de abstracción sobre la API de Kore Base. - Implementar los diferentes métodos que necesitan las bases de datos para que Kore Base pueda utilizarlas, de esta forma Kore Base no está acoplado con ninguna base de datos y definiendo unos métodos es capaz de funcionar con un LevelDB, un SQlite o un Cassandra.
- Recibir los parámetros de configuración a través de archivos
.toml
,.yaml
y.json
; además devariables de entorno
. Para profundizar sobre los parámetros de configuración visite la siguiente sección. - Exponer un Prometheus de forma opcional para poder obtener métricas. Para obtener más información sobre la configuración del prometheus visite la siguiente sección.
Acutalmente Kore Node consta de 3 features:
- sqlite: Para hacer uso de la base de datos de
SQlite
. - leveldb: Para hacer uso de la base de datos de
LevelDB
. - prometheus: para exponer una API con un
endpoint
llamado/metrics
donde se podrán obtener métricas.
Para acceder a más información sobre el funcionamiento de Kore Node, acceda al INFO repositorio.
2 - Configuración
Estos parámetros de configuración son generales a cualquier nodo indpendientemente del tipo de cliente que se vaya a usar, los parámetros específicos de cada cliente se encontrarán en sus respectivas secciones.
La configuración de un nodo puede realizarse de diferentes maneras. A continuación se enumeran los mecanismos admitidos, de menor a mayor prioridad:
- Variables de entorno.
- Archivo de configuración.
Variables de entorno
Los siguientes parámetros de configuración solo se pueden configurar a través de variables de entorno y como parámetros al binario que se genera al compilar el cliente, pero no haciendo uso de archivos:
Variable de entorno | Descripción | Parámetro de entrada | Qué recibe |
KORE_PASSWORD |
Contraseña que se utilizará para encriptar el material criptográfico | -p |
La contraseña |
KORE_FILE_PATH |
Ruta del archivo de configuración a utilizar | -f |
Ruta del archivo |
Los parámetros que se pueden configurar mediante variables de entorno y archivos son:
Variable de entorno | Descripción | Qué recibe | Valor por defecto |
KORE_PROMETHEUS |
Dirección y puerto donde se va a exponer el servidor que contiene el endpoint /metrics donde se encuentra el prometheus |
Una dirección IP y un puerto | 0.0.0.0:3050 |
KORE_KEYS_PATH |
Ruta donde se guardará la clave privada en formato PKCS8 encriptada con PKCS5 |
Un directorio | examples/keys |
KORE_DB_PATH |
Ruta donde se creará la base de datos si no existe o donde se encuentra la base de datos en caso de que ya exista | Un directorio | Para LevelDB examples/leveldb y para SQlite examples/sqlitedb |
KORE_NODE_KEY_DERIVATOR |
Key derivator a utilizar |
Un String con Ed25519 o Secp256k1 |
Ed25519 |
KORE_NODE_DIGEST_DERIVATOR |
Digest derivator a utilizar |
Un String con Blake3_256 , Blake3_512 , SHA2_256 , SHA2_512 , SHA3_256 o SHA3_512 |
Blake3_256 |
KORE_NODE_REPLICATION_FACTOR |
Porcentaje de nodos de red que reciben mensajes de protocolo en una iteración | Valor flotante | 0.25 |
KORE_NODE_TIMEOUT |
Tiempo de espera que se utilizará entre iteraciones del protocolo | Valor entero sin signo | 3000 |
KORE_NODE_PASSVOTATION |
Comportamiento del nodo en la fase de aprobación | Valor entero sin signo, 1 para aprobar siempre, 2 para denegar siempre, otro valor para aprobación manual | 0 |
KORE_NODE_SMARTCONTRACTS_DIRECTORY |
Directorio donde se almacenarán los contratos de los sujetos | Un directorio | Contracts |
KORE_NETWORK_PORT_REUSE |
Verdadero para configurar la reutilización de puertos para sockets locales, lo que implica la reutilización de puertos de escucha para conexiones salientes para mejorar las capacidades transversales de NAT. | Valor Boolean | false |
KORE_NETWORK_USER_AGENT |
El user agent | El user agent | kore-node |
KORE_NETWORK_NODE_TYPE |
Tipo de nodo | Un String: Bootstrap, Addressable o Ephemeral | Bootstrap |
KORE_NETWORK_LISTEN_ADDRESSES |
Direcciones donde el nodo va a escuchar | Direcciones donde el nodo va a escuchar | /ip4/0.0.0.0/tcp/50000 |
KORE_NETWORK_EXTERNAL_ADDRESSES |
Dirección externa por la cual se puede acceder al nodo, pero no se encuentra entre sus interfaces | Dirección externa por la cual se puede acceder al nodo, pero no se encuentra entre sus interfaces | /ip4/90.0.0.70/tcp/50000 |
KORE_NETWORK_ROUTING_BOOT_NODES |
Direcciones de los Boot Nodes en la red P2P a los cuales nos conectaremos para empezar a formar parte de la red | Direcciones de los Boot Nodes, donde si tiene más de una dirección será separada con una _ y las direcciones se separan del Peer-ID del nodo mediante /p2p/ |
|
KORE_NETWORK_ROUTING_DHT_RANDOM_WALK |
Verdadero para activar el random walk en la DHT de Kademlia |
Valor Boolean | true |
KORE_NETWORK_ROUTING_DISCOVERY_ONLY_IF_UNDER_NUM |
Número de conexiones activas sobre las que interrumpimos el proceso de descubrimiento | Cantidad de conexiónes activas | u64::MAX |
KORE_NETWORK_ROUTING_ALLOW_NON_GLOBALS_IN_DHT |
Verdadero si se permiten direcciones no globales en el DHT | Valor Boolean | false |
KORE_NETWORK_ROUTING_ALLOW_PRIVATE_IP |
Si es false el dirección de un nodo no puede ser privada | Valor Boolean | false |
KORE_NETWORK_ROUTING_ENABLE_MDNS |
Verdadero para activar mDNS | Valor Boolean | true |
KORE_NETWORK_ROUTING_KADEMLIA_DISJOINT_QUERY_PATHS |
Cuando está habilitado, el número de rutas separadas utilizadas es igual al paralelismo configurado | Valor Boolean | true |
KORE_NETWORK_ROUTING_KADEMLIA_REPLICATION_FACTOR |
El factor de replicación determina a cuántos peers más cercanos se replica un registro | Valor entero sin signo mayor a 0 | false |
KORE_NETWORK_ROUTING_PROTOCOL_NAMES |
Protocolos que soporta el nodo | Protocolos que soporta el nodo | /kore/routing/1.0.0 |
KORE_NETWORK_TELL_MESSAGE_TIMEOUT_SECS |
Tiempo de espera de un mensaje | Cantidad de segundos | 10 |
KORE_NETWORK_TELL_MAX_CONCURRENT_STREAMS |
Cantidad máxima de transmisiones simultáneas | Valor entero sin signo | 100 |
KORE_NETWORK_CONTROL_LIST_ENABLE |
Habilitar lista de control | Valor booleano | true |
KORE_NETWORK_CONTROL_LIST_ALLOW_LIST |
Lista de peers permitidos | Cadena de texto separada por comas | Peer200,Peer300 |
KORE_NETWORK_CONTROL_LIST_BLOCK_LIST |
Lista de peers bloqueados | Cadena de texto separada por comas | Peer1,Peer2 |
KORE_NETWORK_CONTROL_LIST_SERVICE_ALLOW_LIST |
Lista de URLs de servicios permitidos | Cadena de texto separada por comas | http://90.0.0.1:3000/allow_list |
KORE_NETWORK_CONTROL_LIST_SERVICE_BLOCK_LIST |
Lista de URLs de servicios bloqueados | Cadena de texto separada por comas | http://90.0.0.1:3000/block_list |
KORE_NETWORK_CONTROL_LIST_INTERVAL_REQUEST |
Intervalo de solicitud en segundos | Cantidad de segundos | 58 |
.json File
{
"kore": {
"network": {
"user_agent": "Kore2.0",
"node_type": "Addressable",
"listen_addresses": ["/ip4/127.0.0.1/tcp/50000","/ip4/127.0.0.1/tcp/50001","/ip4/127.0.0.1/tcp/50002"],
"external_addresses": ["/ip4/90.1.0.60/tcp/50000", "/ip4/90.1.0.61/tcp/50000"],
"tell": {
"message_timeout_secs": 58,
"max_concurrent_streams": 166
},
"control_list": {
"enable": true,
"allow_list": ["Peer200", "Peer300"],
"block_list": ["Peer1", "Peer2"],
"service_allow_list": ["http://90.0.0.1:3000/allow_list", "http://90.0.0.2:4000/allow_list"],
"service_block_list": ["http://90.0.0.1:3000/block_list", "http://90.0.0.2:4000/block_list"],
"interval_request": 99
},
"routing": {
"boot_nodes": ["/ip4/172.17.0.1/tcp/50000_/ip4/127.0.0.1/tcp/60001/p2p/12D3KooWLXexpg81PjdjnrhmHUxN7U5EtfXJgr9cahei1SJ9Ub3B","/ip4/11.11.0.11/tcp/10000_/ip4/12.22.33.44/tcp/55511/p2p/12D3KooWRS3QVwqBtNp7rUCG4SF3nBrinQqJYC1N5qc1Wdr4jrze"],
"dht_random_walk": false,
"discovery_only_if_under_num": 55,
"allow_non_globals_in_dht": true,
"allow_private_ip": true,
"enable_mdns": false,
"kademlia_disjoint_query_paths": false,
"kademlia_replication_factor": 30,
"protocol_names": ["/kore/routing/2.2.2","/kore/routing/1.1.1"]
},
"port_reuse": true
},
"node": {
"key_derivator": "Secp256k1",
"digest_derivator": "Blake3_512",
"replication_factor": 0.555,
"timeout": 30,
"passvotation": 50,
"smartcontracts_directory": "./fake_route"
},
"db_path": "./fake/db/path",
"keys_path": "./fake/keys/path",
"prometheus": "10.0.0.0:3030"
}
}
.toml File
[kore.network]
user_agent = "Kore2.0"
node_type = "Addressable"
port_reuse = true
listen_addresses = ["/ip4/127.0.0.1/tcp/50000","/ip4/127.0.0.1/tcp/50001","/ip4/127.0.0.1/tcp/50002"]
external_addresses = ["/ip4/90.1.0.60/tcp/50000","/ip4/90.1.0.61/tcp/50000"]
[kore.network.control_list]
enable = true
allow_list = ["Peer200", "Peer300"]
block_list = ["Peer1", "Peer2"]
service_allow_list = ["http://90.0.0.1:3000/allow_list", "http://90.0.0.2:4000/allow_list"]
service_block_list = ["http://90.0.0.1:3000/block_list", "http://90.0.0.2:4000/block_list"]
interval_request = 99
[kore.network.tell]
message_timeout_secs = 58
max_concurrent_streams = 166
[kore.network.routing]
boot_nodes = ["/ip4/172.17.0.1/tcp/50000_/ip4/127.0.0.1/tcp/60001/p2p/12D3KooWLXexpg81PjdjnrhmHUxN7U5EtfXJgr9cahei1SJ9Ub3B", "/ip4/11.11.0.11/tcp/10000_/ip4/12.22.33.44/tcp/55511/p2p/12D3KooWRS3QVwqBtNp7rUCG4SF3nBrinQqJYC1N5qc1Wdr4jrze"]
dht_random_walk = false
discovery_only_if_under_num = 55
allow_non_globals_in_dht = true
allow_private_ip = true
enable_mdns = false
kademlia_disjoint_query_paths = false
kademlia_replication_factor = 30
protocol_names = ["/kore/routing/2.2.2", "/kore/routing/1.1.1"]
[kore.node]
key_derivator = "Secp256k1"
digest_derivator = "Blake3_512"
replication_factor = 0.555
timeout = 30
passvotation = 50
smartcontracts_directory = "./fake_route"
[kore]
db_path = "./fake/db/path"
keys_path = "./fake/keys/path"
prometheus = "10.0.0.0:3030"
.yaml File
kore:
network:
control_list:
allow_list:
- "Peer200"
- "Peer300"
block_list:
- "Peer1"
- "Peer2"
service_allow_list:
- "http://90.0.0.1:3000/allow_list"
- "http://90.0.0.2:4000/allow_list"
service_block_list:
- "http://90.0.0.1:3000/block_list"
- "http://90.0.0.2:4000/block_list"
interval_request: 99
enable: true
user_agent: "Kore2.0"
node_type: "Addressable"
listen_addresses:
- "/ip4/127.0.0.1/tcp/50000"
- "/ip4/127.0.0.1/tcp/50001"
- "/ip4/127.0.0.1/tcp/50002"
external_addresses:
- "/ip4/90.1.0.60/tcp/50000"
- "/ip4/90.1.0.61/tcp/50000"
tell:
message_timeout_secs: 58
max_concurrent_streams: 166
routing:
boot_nodes:
- "/ip4/172.17.0.1/tcp/50000_/ip4/127.0.0.1/tcp/60001/p2p/12D3KooWLXexpg81PjdjnrhmHUxN7U5EtfXJgr9cahei1SJ9Ub3B"
- "/ip4/11.11.0.11/tcp/10000_/ip4/12.22.33.44/tcp/55511/p2p/12D3KooWRS3QVwqBtNp7rUCG4SF3nBrinQqJYC1N5qc1Wdr4jrze"
dht_random_walk: false
discovery_only_if_under_num: 55
allow_non_globals_in_dht: true
allow_private_ip: true
enable_mdns: false
kademlia_disjoint_query_paths: false
kademlia_replication_factor: 30
protocol_names:
- "/kore/routing/2.2.2"
- "/kore/routing/1.1.1"
port_reuse: true
node:
key_derivator: "Secp256k1"
digest_derivator: "Blake3_512"
replication_factor: 0.555
timeout: 30
passvotation: 50
smartcontracts_directory: "./fake_route"
db_path: "./fake/db/path"
keys_path: "./fake/keys/path"
prometheus: "10.0.0.0:3030"