¿Mito o verdad? 4000 transacciones por segundo en la Blockchain Privada en Catapult

¿Mito o verdad? 4000 transacciones por segundo en la Catapult privada de Blockchain

4000 transacciones por segundo

Con frecuencia me preguntan si 4,000 transacciones por segundo será capaz de ejecutarse  en Catapult. Por lo general, respondo a estas preguntas diciendo “solo en privada, no en público”. Dicho esto, no he tratado personalmente de lograr este resultado, así que no puedo decir que estoy seguro … todavía. En este artículo explico mi viaje de probarla de fuente abierta, en una cadena privada.

Antecedentes

Para lograr 4,000 transacciones por segundo, necesitarías intervalos de 15 segundos y 60,000 transacciones por bloque. Si el intervalo se establece en 1 minuto, necesitará aproximadamente 240,000 transacciones por bloque. Los bloques NEM v.1 pueden contener 120 transacciones por bloque.

El proceso


Al intentar alcanzar 4,000 transacciones por segundo, he mantenido la configuración tan cerca de las configuraciones predeterminadas para que este proceso sea repetible.

Corrí la Azure VM machine, usando F32s_v2 con el siguiente ambiente

  • ubuntu 18.04 LTS
  • git 2.17.1
  • docker 18.06.1
  • docker-compose 1.22.0
  • nodejs v10.11

En mi VM tengo los siguientes puertos 22, 3000 y 8000 abiertos mientras que corrian

  • 22
  • 3000
  • 8000

Lanzar Catapult

git clone https://github.com/tech-bureau/catapult-service-bootstrap
cd catapult-service-bootstrap
git checkout 77e6cf38a7845194aa2ce72f4ed4d87e5ab791e3
docker-compose -f docker-compose-with-explorer.yml up -d

Hecho esto correr Apalanca

Parece que el procesamiento de firmas hace que las transacciones sean más pesadas, lo que probablemente nos impedirá alcanzar un rendimiento óptimo. Así que en lugar de eso, creé una cantidad masiva de transacciones pre-firmadas.

git clone https://github.com/planethouki/yonsen.git
cd yonsen
npm install

Obtuve la clave privada de la dirección de nemesis ya que necesitamos cuentas con saldos restantes. Esto se hizo abriendo “address.yaml” y obteniendo todos los números “privados” en “nemesis_addresses:”, y luego creando el archivo “nemesiskeys.json”.

cat ../build/generated-addresses/addresses.yaml
vi nemesiskeys.json

addresses.yamlnemesis_addresses:
– private: 1947340C6102E18927B98D49FB4A7947AB0C5AFCDB31F34F7EA85209A2252CF2
 public: <something>
 address: <something>
– private: 1627E64F23841C748DB9B1650ADFEC8868003158D7803A0652FE76FBD2D617B0
<and more>

Copiar y pegar las siguientes claves privadas

emesiskeys.jsonnemesiskeys.json[
   “1947340C6102E18927B98D49FB4A7947AB0C5AFCDB31F34F7EA85209A2252CF2”,
   “1627E64F23841C748DB9B1650ADFEC8868003158D7803A0652FE76FBD2D617B0”,
   “2D280ADE3C870B2AD6B962DE191743C763823EC07E897846E5398546E9D69EC7”,
   “354AF480EE43126FDC3DD11FD0F6537647F8413B7676536DFFFC671F850DF8A4”,
   “<and more>”
]

Ahora comenzaremos a correr la función. Tenemos transacciones automatizadas que se realizarán desde la clave privada que hicimos anteriormente, y para elegir al azar a los destinatarios y firmantes. Este proceso tomará aproximadamente 2 horas.

npm run create32

Ahora tenemos 8 archivos de texto con 320,000 transacciones cada uno. El archivo creado se alinea con cargas útiles.

payload_320000_8/payload0001.txt

Enviar las transacciones

Intentaré enviar. Primero 1, luego enviando 500 después. (envía 1 y envía 500 respectivamente).

npm run send1
npm run send500

Podemos realizar un seguimiento de este nivel de transacción a través de Block Explorer. (Acceso HTTP al puerto VM 8000 a través de su navegador).

Ahora intentemos enviar 320,000 x 8 transacciones. Esto probablemente llevará unos 15 minutos. Con esta cantidad, es probable que el explorador de bloques se bloquee, así que seguiré el seguimiento del siguiente método.

npm run send32

En el Explorador de bloques, “CONTENT_LENGTH_MISMATCH”, este error deja de mostrar las transacciones. Así que usaremos “nem2-sdk” para obtener datos y sobresalir para contar las transacciones.

npm npm run view

>Palanca

  • [sec]: Bloque de intervalo de producción
  • [TXs]: Cantidad de transacciones por bloque
  • [tx/sec]: Transacción por segundo
HeightTimestamp[sec][TXs][tx/sec]
12016-04-01T00:00:00.000Z250000.00
22018-12-09T05:14:51.094Z5100000.00
32018-12-09T05:15:13.097Z2210000.05
42018-12-09T05:15:36.100Z2300000.00
52018-12-09T05:16:04.103Z285000017.86
62018-12-09T05:16:16.106Z1200000.00
72018-12-09T05:16:38.108Z22131460597.55
82018-12-09T05:17:06.123Z281132854045.89
92018-12-09T05:17:30.251Z24989824124.25
102018-12-09T05:17:56.340Z261050074038.73
112018-12-09T05:18:19.433Z23283031230.57
122018-12-09T05:18:41.470Z221535136977.86
132018-12-09T05:18:54.594Z13259901999.23
142018-12-09T05:19:19.624Z251275075100.28
152018-12-09T05:19:41.733Z22430081954.91
162018-12-09T05:20:05.772Z241407795865.79
172018-12-09T05:20:35.922Z301252314174.37
182018-12-09T05:20:47.040Z12280532337.75
192018-12-09T05:21:11.064Z24305221271.75
202018-12-09T05:21:35.092Z241797827490.92
212018-12-09T05:21:56.232Z21188940899.71
222018-12-09T05:22:14.254Z181386867704.78
232018-12-09T05:22:37.431Z23306911334.39
242018-12-09T05:22:51.469Z141186908477.86
252018-12-09T05:23:09.561Z18161440896.89
262018-12-09T05:23:17.595Z88901811127.25
272018-12-09T05:23:42.667Z251009774039.08
282018-12-09T05:24:00.747Z18726994038.83
292018-12-09T05:24:18.804Z18727054039.17
302018-12-09T05:24:39.881Z21323191539.00
312018-12-09T05:24:53.919Z141111077936.21
322018-12-09T05:25:16.017Z23888563863.30
332018-12-09T05:25:38.100Z22194750885.23
342018-12-09T05:25:57.128Z191461357691.32
352018-12-09T05:26:15.261Z18242391346.61
362018-12-09T05:26:34.284Z191252046589.68
372018-12-09T05:26:48.377Z14445163179.71
382018-12-09T05:27:04.442Z16787994924.94
392018-12-09T05:27:14.504Z10140251402.50
402018-12-09T05:27:38.517Z2400000.00
412018-12-09T05:27:59.520Z2100000.00
422018-12-09T05:28:17.522Z1800000.00


Resultados

Como podemos ver anteriormente, logramos 4,000 transacciones por segundo. Al promediar 4,040 transacciones por segundo usando 8-38 bloques (2,529,116 transacciones por 626 segundos).

Y ahora cuando nos costo

La tabla contiene lo siguientes

Tamaño del VM, oferta,familia, VCPUS, RAM(GB), Disco de datos, MAX IOPS, almacenamiento temporal, soporte de disco premium, costo mensual (estimado).

En su momento, usamos el Azure VM F32_v2 que corría alrededor de 1,500 dólares al mes. Este costo excluye cualquier costo por las transferencias de datos y el uso del disco.

El siguiente diagrama muestra un desglose de precios aproximado. Un costo mensual de 1,588.62 dólar estadounidense, costos de uso y tarifas de la red, discos y mijin.

Ahora, finalmente, puedo decirle a la gente, en confianza, que 4,000 transacciones por segundo es posible en un entorno privado de Catapult. Además, no hice ajustes en este experimento, por lo que probablemente sería posible un modelo de punto de precio más. Por favor, déjame saber lo que piensas de todo lo anterior!

Fuente: NEMJAPAN @planethouki