¿Cuál es la raíz del recibo de la raíz de la transacción del estado del triplete de blockchain Ethereum?

 

 

 

1. Estructura de bloque

En varios proyectos de blockchain (como Ethereum), los nodos a menudo necesitan mantener tres Trie Roots, que se registran en cada encabezado de bloque.

  • stateRoot
  • TransaccionesRoot
  • recibosRoot

 

Inserte la descripción de la imagen aquí

 


Código: https://github.com/ethereum/go-ethereum/blob/053ed9cc847647a9b3ef707d0efe7104c4ab2a4c/core/types/block.go

 

 

二 、 TransactionsRoot

TransactionsRoot almacena la raíz de Trie , que se compone de transacciones en el bloque.
TransactionRoot tiene la función más simple y es utilizada por el receptor para verificar la integridad de las transacciones en el bloque .

 

 

Tres, RecibosRoot

ReceiptsRoot almacena el contenido del recibo de la transacción
ingresos

El propio recibo registra si la transacción se ejecutó correctamente en el bloque .

Código: https://github.com/ethereum/go-ethereum/blob/ddadc3d27379a3326fd1b78278e5e5da44a91d94/core/blockchain.go

receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)

 

 

 

Cuatro, StateRoot

StateRoot registra el estado mundial después de que finaliza la ejecución de la transacción .

	if root := statedb.IntermediateRoot(v.config.IsEIP158(header.Number)); header.Root != root {
		return fmt.Errorf("invalid merkle root (remote: %x local: %x)", header.Root, root)
	}

Pero las funciones de StateRoot y ReceiptRoot parecen ser similares.
Se trata de comprobar si el resultado del cambio de estado es correcto.

 

Cinco, la diferencia entre ReceiptsRoot y StateRoot

La función es muy similar, ambos son para verificar si el resultado de la ejecución de la transacción es correcto.
¿Por qué necesitamos implementarlo dos veces? ¿Podemos asegurarnos de que el contenido de la transacción es correcto y el orden de ejecución es correcto comparando StateRoot con el encabezado?

Eche un vistazo más de cerca al contenido de los recibos

RecibosRoot

Código: https://github.com/ethereum/go-ethereum/blob/7770e41cb5fcc386a7d2329d1187174839122f24/core/state_processor.go


Descubrimos que, además de result.Failed () para registrar si la transacción se ejecutó correctamente, también hay un campo Receta.GasUsed al que vale la pena prestar atención.
Este campo indica cuánto gas ha consumido el bloque después de que se ejecuta la transacción actual.
Entonces, obviamente, RecetsRoot también tiene la consistencia del orden de ejecución de las transacciones.

Pero el orden es consistente, aún se puede verificar mediante la consistencia de stateRoot.

 

StateRoot

Código:  https://github.com/ethereum/go-ethereum/blob/ddadc3d27379a3326fd1b78278e5e5da44a91d94/core/blockchain.go


Observamos el contenido de stateRoot, está el contenido de Account. StateRoot es más una raíz del entorno mundial. Así que expresa más el mundo después de la ejecución de la transacción.

 

para resumir

La función de ReceiveRoot y StateRoot es verificar si la ejecución de la transacción es correcta y confiable.
La diferencia es que ReceiveRoot solo indica el éxito y el fracaso de la ejecución de la transacción y la orden de ejecución .
El papel de StateRoot es registrar el estado del mundo después de la ejecución de la transacción.

Tenga en cuenta que Ethereum permite la existencia de bloques huérfanos como los bloques tío.
Cuando un nodo BP en sí mismo está en una bifurcación no convencional, el StateRoot que genera es diferente del StateRoot ejecutado por el receptor.
Si simplemente compara StateRoot y piensa ciegamente que el nodo BP es un nodo maligno, es algo injusto.
Podemos llegar a un consenso sobre la exactitud de la ejecución de la transacción comparando RecetsRoot, independientemente de si el entorno de ejecución es el mismo .
De esta manera, Ethereum es más amigable con los bloques de tíos.

 

https://blog.csdn.net/cemao4548/article/details/105939491

 

https://docker.blog.csdn.net/article/details/109741079

Supongo que te gusta

Origin blog.csdn.net/u013288190/article/details/113102507
Recomendado
Clasificación