¿Cómo gasto una transacción P2SH no estándar?

Me enviaron una dirección de rompecabezas P2SH. Resolví el acertijo, es decir, creé un script que coincide con el hash y sé qué poner en la pila antes del script. Lamentablemente, lo que tengo problemas para descifrar es cómo crear realmente una transacción válida con este script no estándar y sin firma. Todos los ejemplos y la documentación que he encontrado solo hablan sobre la creación de transacciones estándar basadas en firmas y no con scripts arbitrarios.

Por ejemplo, supongamos que el script codificado es 955787y alguien realmente envió bitcoins a la dirección P2SH para ese script, que es3PijzLhTnkA9S2HDFLrdwX9SCg69W8ggD4

Ahora quiero gastar eso proporcionando el script de canje completo:

1 7 955787

o supongo que con más precisión

OP_1 OP_7 3 0x955787

¿Cómo creo realmente esa transacción usando bitcoindo bcoin? No veo cómo hacer que cree una transacción con ese script proporcionado o transmitirlo a la red sin una firma. Estoy buscando una lista de comandos de línea de comandos para ejecutar (use marcadores de posición para los datos requeridos que no proporcioné anteriormente).

Esto es standardcomportamiento/script/transacción. incluso no es demasiado difícil crear una transacción manualmente y/o escribir una herramienta para ello. creo importaddress "955787" "3PijzLhTnkA9S2HDFLrdwX9SCg69W8ggD4" falseque ayudará

Respuestas (1)

Lo primero que noté fue el script de redimir, está OP_MULdeshabilitado y no podrá usarlo en scripts. Pero puedo mostrarlo usando OP_ADD.

Si desea jugar bcoiny probar los scripts, cómo se validan, puede usar bcoin.script:

Verificar y jugar con scripts

const scriptSig = new Script();
scriptSig.pushInt(6);
scriptSig.pushInt(1);
scriptSig.compile();

o puedes ensamblarlo usando solo una cadena

const scriptSig = Script.fromString('OP_6 OP_1');

Ahora pubkeyScript (redeemScript en P2SH)

const scriptPubkey = Script.fromRaw('935787', 'hex');

O más detallado

const scriptPubkey = Script.fromString('OP_ADD OP_7 OP_EQUAL');

Puede utilizar bcoin.stackpara ejecutar estos scripts

const stack = new Stack();
scriptSig.execute(stack);
scriptPubkey.execute(stack);

// Verify the script was successful in its execution:
assert(stack.length === 1);
assert(stack.getBool(-1) === true);

Canjear transacción

Volviendo a la pregunta:

const redeemScript = Script.fromRaw('935787', 'hex');
const address = Address.fromScripthash(redeemScript.hash160());
const sendto = Address.fromString('sendtoaddress');

// generate script with redeem
const script = new Script();
script.pushInt(6);
script.pushInt(1);
script.push(Opcode.fromPush(redeemScript.toRaw()));
script.compile();


// We received some transaction
// lets say coinbase
const cb = new MTX();

// Add a typical coinbase input
cb.addInput({
  prevout: new Outpoint(),
  script: new Script()
});

cb.addOutput({
  address: address,
  value: Amount.fromBTC('5').toValue()
});

const coin = bcoin.coin.fromTX(cb, 0, -1);

// From here we spend the transaction
const spend = new MTX();

spend.addCoin(coin);
spend.addOutput(sendto, Amount.fromBTC('4.9999').toValue());

spend.inputs[0].script = script;

assert(spend.verify());

// You can broadcast raw transaction
console.log(spend.toRaw().toString('hex'));