ID de tipo
Hay una razón por la que elegimos hash de script de tipo de celda para admitir script actualizable. Si el adversario desea crear una celda con un script de tipo específico, la transacción debe ser verificada por el código del script de tipo.
El ID de tipo es este tipo de script de tipo. Como su nombre indica, garantiza la unicidad del script de tipo.
Esta característica involucra varios scripts de tipo, por lo que utilizaré diferentes términos para diferenciarlos:
La celda de código de ID de tipo es la celda que almacena el código para verificar que una identificación de tipo es única. La celda de código de ID de tipo también tiene un script de tipo. Por ahora no nos importa el contenido real, así que supongamos que el hash de script de tipo es TI. Un ID de tipo es un script de tipo en el que hash_type es "Type" y code_hash es TI.
De Type Script Part I, sabemos que type script agrupa las entradas y salidas primero. En otras palabras, si el script de tipo es un ID de tipo, todas las entradas y salidas del grupo tienen el mismo ID de tipo.
El código de ID de tipo verifica que, en cualquier grupo de ID de tipo, haya como máximo una entrada y como máximo una salida. Se permite que una transacción tenga múltiples grupos de identificación de tipo dependiendo del número de entradas y salidas, los grupos de identificación de tipo se clasifican en tres tipos diferentes:
El grupo de creación de ID de tipo tiene solo una salida. El grupo de eliminación de ID de tipo tiene solo una entrada. El grupo de transferencia de ID de tipo tiene una entrada y una salida.
La transacción en el diagrama anterior tiene los tres tipos de grupos de identificación de tipo.
G1 es un grupo de transferencia de ID de tipo que transfiere la identificación de tipo de cell1 a cell4.G2 es un grupo de eliminación de ID de tipo que elimina la identificación de tipo junto con cell2.G3 es un grupo de creación de ID de tipo que crea una nueva ID de tipo para cell3.
En el grupo de creación de ID de tipo, el único argumento en args es el hash de esta primera estructura CellInput de transacción y el índice de salida de la celda en el grupo. Por ejemplo, en el grupo g3, id3 es un hash en tx.inputs (0) y 0 (índice de cell3 en tx.outputs).
Hay dos formas de crear una nueva celda con un ID de tipo específico.
Cree una transacción donde el hash de tx.inputs (0) y cualquier índice sea igual a un valor específico. Como una celda solo se puede usar como entrada una vez en la cadena, tx.inputs (0) debe ser diferente en cada transacción; este problema es equivalente a encontrar una colisión hash, cuya probabilidad es insignificante. Destruya la celda anterior en la misma transacción.
Suponemos que el método 2 es la única forma de crear una celda igual a una identificación de tipo existente. Y de esta manera requiere la autorización del propietario original.
El código de ID de tipo solo se puede implementar a través del código de VM de CKB, pero elegimos implementarlo en el nodo CKB como un script de sistema especial, porque si queremos poder actualizar el código de ID de tipo más adelante, debe usarse como el escriba script a través de type script hash, que es una dependencia recursiva.
TI es un hash del contenido que contiene TI en sí.
La celda del código de ID de tipo utiliza un hash de script de tipo especial, que son solo los códigos ASCII en hexadecimal del texto TYPE_ID.
0x00000000000000000000000000000000000000000000000000545950455f4944