¿Cuál es el criterio para que un script txout sea aceptado en un bloque minado? ¿Hay algún criterio en absoluto? la razón por la que pregunto es que OP_RETURN
se usa regularmente en los scripts txout, pero no se puede gastar:
case OP_RETURN:
{
return set_error(serror, SCRIPT_ERR_OP_RETURN);
}
y también he visto transacciones que empujan elementos a la pila que tienen más de MAX_SCRIPT_ELEMENT_SIZE bytes.
Supongo que un script sintácticamente incorrecto como:
05aa
(ie OP_PUSHDATA(5) <aa>)
no estaría permitido?
alguien podría señalarme el código que usan los mineros para validar si un tx se incluirá o descartará como no válido (debido a sus scripts txout). Supongo que se encuentra en main.cpp , pero me gustaría saber dónde exactamente, gracias.
obviamente, cualquiera puede extraer un bloque que está configurado de la forma que desee, pero presumiblemente hay reglas fijas sobre si se considera válido o no, por lo que otros mineros sabrán si usar su hash como su hash de encabezado anterior al extraer el próximo bloque?
Absolutamente no se realizan comprobaciones de validez de consensoscriptPubKey
en un archivo . Los nodos tienen requisitos suaves llamados IsStandard para lo que transmitirán a sus pares como una transacción (un script completamente basura o una salida OP_RETURN muy grande, por ejemplo, no pasará), pero estas no son reglas de consenso. Algunos mineros extraerán transacciones no estándar en sus bloques, pero en general, para obtener una transacción para ellos, es necesario utilizar un transporte que no sea la red P2P.
OP_RETURN
es un caso especial al que se hace referencia como "probablemente indiscutible", esta es una respuesta a las personas que interfieren hashes y otros datos en las PubKeyHash
salidas como una forma de vincularlos a tiempo con la cadena de bloques. Debido a que no hay forma de saber si la salida es realmente válida o no, estas salidas deben almacenarse para siempre en el grupo UTXO. Una OP_RETURN
salida prefijada nunca se puede gastar, por lo que los nodos pueden olvidar con seguridad que alguna vez existieron.
La transacción ebc9fa1196a59e192352d76c0f6e73167046b9d37b8302b6bb6968dfd279b767
de la cadena de bloques en vivo contiene muchos scripts txout sintácticamente incorrectos y es útil como demostración:
usando pybitcointools:
#!/usr/bin/env python2.7
from bitcoin import *
tx_hex = fetchtx("ebc9fa1196a59e192352d76c0f6e73167046b9d37b8302b6bb6968dfd279b767")
tx_dict = deserialize(tx_hex)
for (txout_num, txout) in enumerate(tx_dict["outs"]):
script = txout["script"]
print "raw txout %d script: %s" % (txout_num, script)
producción:
raw txout 0 script: 01
raw txout 1 script: 0201
raw txout 2 script: 4c
raw txout 3 script: 4c0201
raw txout 4 script: 4d
raw txout 5 script: 4dffff01
raw txout 6 script: 4e
raw txout 7 script: 4effffffff01
analizando cada uno de estos scripts txout:
01 = OP_PUSHDATA0(1)
esto falla porque afirma que insertará 1 byte en la pila, pero luego no proporciona bytes para insertar en la pila
0201 = OP_PUSHDATA0(2) <01>
esto falla porque afirma que insertará 2 bytes en la pila, pero solo proporciona 1 byte para insertar en la pila
4c = OP_PUSHDATA1(?)
esto falla porque es un código de operación OP_PUSHDATA1 incompleto. el 4c
byte debe ir seguido de otro byte que especifique la cantidad de bytes de datos para insertar en la pila, sin embargo, no es así.
4c0201 = OP_PUSHDATA1(2) <01>
esto falla porque afirma que insertará 2 bytes en la pila, pero solo proporciona 1 byte para insertar en la pila.
etc
es divertido que los scripts de salida en esta transacción en particular tengan cada uno un uso diferente sintácticamente incorrecto de los comandos OP_PUSHDATA. es casi como si alguien tuviera la misma pregunta que esta y quisiera probar si se implementó alguna verificación de sintaxis en scriptpubkeys. Me alegro de que hayan hecho esto porque es una forma muy concluyente de demostrar que no se realiza absolutamente ninguna verificación de sintaxis (y, por lo tanto, ninguna otra verificación) en scriptpubkeys antes de que se gasten.
libconsensus
y evite perder montones de dinero. No es infalible, pero significa que no tendrá errores evitables en la ejecución del script.libconsensus
, ¡eso parece realmente útil!
mullhausen
mullhausen
claris
OP_CAT OP_CAT OP_CAT
) y que sea válido en un bloque. Si no hay forma de cumplir con el guión y gastarlo nuevamente, entonces el valor del BTC simplemente se queda ahí para siempre. Esta salida de transacción es similar a su ejemplo, empuja basura a la pila sin ningún motivo. webbtc.com/tx/… Puntos de bonificación si puede averiguar qué está empujando a la pila.mullhausen
05aa
, ¿fallaría? si no, entonces podría ser posible usar scripts txout para ataques de desbordamiento de búfer en los usuarios...mullhausen
EvalScript()
, esa no es mi pregunta.claris
mullhausen
mullhausen