Generieren und pushen Sie rohe Bitcoin-Transaktionen

Wenn ich versuche, eine Raw-Bitcoin-Transaktion über die blockchain.info-API zu pushen, erhalte ich die folgende Fehlermeldung:

Das Skript führte zu einem nicht wahren Stack: []

Die Transaktion sollte 0,001 Bitcoins mit einer Gebühr von 0,0005 von 1CBzN3YW4h7XRwb5sjpmBSEPmVPa9wHPgD an 1KAsr5RcApYG1Rk9uLwsHTXvwsyD1FVyFy senden.

unsignierte Transaktion:

01000000
01
88802ffe48d0f9d2867495e933b1477094ce017f5d6e4204e40f1040ab805c16
00000000
19
76a9147abd6d64781930ee9abfaa75b0976b45ce9b93ba88ac
ffffffff
01
a086010000000000
19
76a914c75073b564d6ebce3d5d12d59ab20d44bd10f69f88ac
00000000
01000000

unterzeichnete Transaktion:

01000000
01
88802ffe48d0f9d2867495e933b1477094ce017f5d6e4204e40f1040ab805c16
00000000
8b
483045022100FA512B36C030BAD0868E2679E1B29E32CCE0099DA086F8FD82010DFFF61B79BA02206C00220683E448C29CCE73FCD7F3CD74E3F76582C07F2F0B436EF247C2D2523F014104a75429241bc8c83e0a1c615155e9b984880f16d39b09b28eef464139fb84d8ff507a5d482e8f41cdb5a762436515d310f16b208bdce4ddfb8a30a7236d36a2da
ffffffff
01
a086010000000000
19
76a914c75073b564d6ebce3d5d12d59ab20d44bd10f69f88ac
00000000

Hat jemand eine Idee, warum die Transaktion falsch ist?

Können Sie die Gutschriftstransaktion, die es ausgibt, im Hex-Format angeben? Am besten ohne die Zeilenumbrüche, die Sie auf den anderen verwenden? Ich vermute, es schlägt im Interpreter irgendwie fehl?
Meinst du die Ausgabe, die ausgegeben wird? Hex der nicht verbrauchten Ausgabe ist: 76a9147abd6d64781930ee9abfaa75b0976b45ce9b93ba88ac, Skript: OP_DUP OP_HASH160 7abd6d64781930ee9abfaa75b0976b45ce9b93ba OP_EQUALVERIFY OP_CHECKSIG.

Antworten (4)

Irgendetwas stimmt nicht mit Ihrer scriptSig

der publicKey in Ihrem Skript ist

04a75429241bc8c83e0a1c615155e9b984880f16d39b09b28eef464139fb84d8ff507a5d482e8f41cdb5a762436515d310f16b208bdce4ddfb8a30a7236d36a2daf 

aber es stimmt nicht mit der Adresse https://blockchain.info/address/1CBzN3YW4h7XRwb5sjpmBSEPmVPa9wHPgD überein, die die Ausgabe von https://blockchain.info/tx/165c80ab40100fe404426e5d7f01ce947047b133e9957486d2f9d048fe2f8088 ist

Sind Sie sicher, dass Sie mit dem privaten Schlüssel von 1CBzN3YW4h7XRwb5sjpmBSEPmVPa9wHPgD signieren?

Der korrekte öffentliche Schlüssel lautet: 04a75429241bc8c83e0a1c615155e9b984880f16d39b09b28eef464139fb84d8ff507a5d482e8f41cdb5a762436515d310f16b208bdce4ddfb8a30a7236d36da. Am Ende war ein zusätzliches 'f', das in der Zeile darunter hätte stehen sollen: 'ffffffff'.

Ich konnte die Transaktion pushen, nachdem ich sie über https://coinb.in/#sign signiert hatte .

Es sieht so aus, als ob ich falsche Signaturen erzeuge.

Ich habe den folgenden Code verwendet, um eine korrekte Signatur zu erzeugen:

public String sign(String msg, BigInteger d) throws IOException {
    ECDSASigner signer = new ECDSASigner();
    X9ECParameters params = SECNamedCurves.getByName("secp256k1");
    ECDomainParameters ecDomainParameters = new ECDomainParameters(params.getCurve(), params.getG(), params.getN(), params.getH());
    ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(d, ecDomainParameters);
    signer.init(true, ecPrivateKeyParameters);
    BigInteger[] sigs = signer.generateSignature(DatatypeConverter.parseHexBinary(msg));
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    DERSequenceGenerator seq = new DERSequenceGenerator(byteArrayOutputStream);
    seq.addObject(new DERInteger(sigs[0]));
    seq.addObject(new DERInteger(sigs[1]));
    seq.close();
    byte[] bytes = byteArrayOutputStream.toByteArray();
    return DatatypeConverter.printHexBinary(bytes);

}

Ich habe Ihre unsignierte Rohtransaktion in die Datei eingegeben und diese Schritte ausgeführt:

1.) Erstellen Sie den unsignierten Roh-TX und den doppelten Hash

printf "010000000188802ffe48d0f9d2867495e933b1477094ce017f5d6e4204e40f1040ab805c16000000001976a9147abd6d64781930ee9abfaa75b0976b45ce9b93ba88acffffffff01a0860100000000001976a914c75073b564d6ebce3d5d12d59ab20d44bd10f69f88ac0000000001000000" > tmp_urtx.txt
xxd -r -p <tmp_urtx.txt >tmp_urtx.hex
# if no xxd (OpenBSD, FreeBSD ...), then this:
# result=$( cat tmp_urtx.txt | sed 's/[[:xdigit:]]\{2\}/\\x&/g' )
# printf $result > tmp_urtx.hex
openssl dgst -binary -sha256 >tmp_sha256.hex <tmp_urtx.hex
openssl dgst -binary -sha256 >tmp_dsha256.hex <tmp_sha256.hex
xxd -ps tmp_dsha256.hex | tr -d "\n" > tx_hash.txt
xxd -r -p <tx_hash.txt >tx_hash.hex

2.) Erstellen Sie die pubkey.pem

echo 3056301006072a8648ce3d020106052b8104000a034200 > pubkey.txt
echo 04a75429241bc8c83e0a1c615155e9b984880f16d39b09b28eef464139fb84d8ff507a5d482e8f41cdb5a762436515d310f16b208bdce4ddfb8a30a7236d36a2da >> pubkey.txt
xxd -r -p <pubkey.txt | openssl pkey -pubin -inform der >pubkey.pem
openssl asn1parse -in pubkey.pem

3.) Signaturdatei erstellen

echo 3045022100FA512B36C030BAD0868E2679E1B29E32CCE0099DA086F8FD82010DFFF61B79BA02206C00220683E448C29CCE73FCD7F3CD74E3F76582C07F2F0B436EF247C2D2523F > tx_sig.txt
xxd -r -p <tx_sig.txt >tx_sig.hex

4.) alles zusammen verifizieren

openssl pkeyutl <tx_hash.hex -verify -pubin -inkey pubkey.pem -sigfile tx_sig.hex

--> Fehler bei der Signaturüberprüfung

5. Schlussfolgerung

Da es nicht übereinstimmt, scheint die Verknüpfung zwischen Privkey, Signatur und Pubkey falsch zu sein. Ich habe die Signatur zweimal überprüft, sie sieht jedoch korrekt aus:

#########################################################
### procedure to strictly check DER-encoded signature ###
#########################################################
Minimum and maximum size constraints                        - ok
scriptsig always starts with 0x30                           - ok
length 138 chars is less than actual sig length (142 chars) - ok
       (hex 0x45, decimal 69, 138 chars)
length of R coordinate (66) >= 0                            - ok
length of S coordinate (64) >= 0                            - ok
S-Value is within scriptsig boundaries                      - ok
Make sure the R & S length covers the entire signature      - ok
S-value must be smaller than N/2                            - ok
strictly check DER-encoded signature                        - ok
#########################################################

Vielleicht nochmal zwischen priv und pubkeys prüfen? (komprimiert und unkomprimiert?)