Wie verbringe ich eine nicht standardmäßige P2SH-Transaktion

Mir wurde eine P2SH-Puzzle-Adresse geschickt. Ich habe das Rätsel gelöst, das heißt, ich habe ein Skript erstellt, das zum Hash passt, und ich weiß, was ich vor dem Skript auf den Stack legen muss. Leider habe ich Probleme herauszufinden, wie ich mit diesem nicht standardmäßigen Skript und ohne Signatur tatsächlich eine gültige Transaktion erstellen kann. Alle Beispiele und Dokumentationen, die ich gefunden habe, sprechen nur über das Erstellen von signaturbasierten Standardtransaktionen und nicht von Transaktionen mit beliebigen Skripten.

Nehmen wir zum Beispiel an, das verschlüsselte Skript ist 955787und jemand hat tatsächlich Bitcoin an die P2SH-Adresse für dieses Skript gesendet, was ist3PijzLhTnkA9S2HDFLrdwX9SCg69W8ggD4

Jetzt möchte ich das ausgeben, indem ich das vollständige Einlösungsskript bereitstelle:

1 7 955787

oder ich schätze genauer

OP_1 OP_7 3 0x955787

Wie erstelle ich diese Transaktion tatsächlich mit bitcoindoder bcoin? Ich sehe nicht, wie ich es dazu bringen kann, eine Transaktion mit diesem bereitgestellten Skript zu erstellen oder es ohne Signatur an das Netzwerk zu übertragen. Ich suche nach einer Liste von Befehlszeilenbefehlen, die ausgeführt werden sollen (verwenden Sie Platzhalter für alle erforderlichen Daten, die ich oben nicht angegeben habe).

Dies ist standardVerhalten/Skript/Transaktion. Es ist sogar nicht allzu schwierig, eine Transaktion manuell zu erstellen und/oder ein Tool dafür zu schreiben. Ich denke importaddress "955787" "3PijzLhTnkA9S2HDFLrdwX9SCg69W8ggD4" falsewird helfen

Antworten (1)

Das erste, was mir aufgefallen ist, war das RedeemScript, dessen Verwendung OP_MULdeaktiviert ist und Sie es nicht in Skripten verwenden können. Aber ich kann es mit zeigen OP_ADD.

bcoinWenn Sie mit den Skripten spielen und testen möchten , wie sie validieren, können Sie Folgendes verwenden bcoin.script:

Überprüfen und spielen Sie mit Skripten

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

oder Sie können es nur mit einer Schnur zusammenbauen

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

Jetzt pubkeyScript (redeemScript in P2SH)

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

Oder ausführlicher

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

Sie können verwenden bcoin.stack, um diese Skripts auszuführen

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);

Transaktion einlösen

Zurück zur Frage:

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'));