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 955787
y 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 bitcoind
o 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).
Lo primero que noté fue el script de redimir, está OP_MUL
deshabilitado y no podrá usarlo en scripts. Pero puedo mostrarlo usando OP_ADD
.
Si desea jugar bcoin
y probar los scripts, cómo se validan, puede usar bcoin.script
:
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.stack
para 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);
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'));
amaclin
standard
comportamiento/script/transacción. incluso no es demasiado difícil crear una transacción manualmente y/o escribir una herramienta para ello. creoimportaddress "955787" "3PijzLhTnkA9S2HDFLrdwX9SCg69W8ggD4" false
que ayudará