por ejemplo esta transacción: http://2coin.org/txinfo.aspx?txid=6c3dc603da32bba3f56f2b33053aaf0f0f17322386c0c6846786bffe49f6ef22&cur=BTC
El script no tiene el tamaño correcto para ser un scriptSig, esperaba 2 pero obtuve 4
Lo que está preguntando es cómo averiguar qué firmar para una transacción multisig.
Multisig está realmente muy cerca de esta respuesta . Sin embargo, hay algunas diferencias sutiles, así que permítanme intentar resumir paso a paso usando la transacción como se ve en la cadena de bloques .
Tenga en cuenta que para cada entrada, el hash real que se firmará será diferente. Es decir, deberá completar el script de canje solo para esa entrada y nulos para todas las demás entradas. Para ilustrar, averigüemos qué necesita firmar para la primera entrada.
01000000
03
fdb1fe0b4506f8d412f8498a0d747701bc5ed8c009e779ee670c82361c1d1dd5
01000000
47
(71 bytes)522102cebf6ab580948d146b7cc771d8e646974349d3d7b11f3e03287d0997a477d3b921037ba651485b7a2cb222191eb64a55926e62bbabfe9b5ed2a9488aad547b20428252ae
ffffffff
a614d26f1878078a00a3c296085576cd7e6361234ea82c865681041fcfdacea8
01000000
00
(nada)ffffffff
d064d2f9cf9e5196a9d81dd87718c9cfbec97f3ccac7164946d956421597c7f1
01000000
00
(nada)ffffffff
01000000
e068704600000000
19
76a9142c76e6fdd1a81c902afa62e78ec71435708d9d9d88ac
00000000
01000000
Ahora, si hace doble sha256 en estos bytes, obtiene:
9c4b551f37f4b383af9216045d80b2fcd4ed57bddca8df388ec29601cbd2a4f1
Y, de hecho, cuando verifica la firma incrustada de esa transacción, puede ver que ese es el hash que se firmó. Aquí hay una muestra de código para verificar usando la excelente biblioteca btcd escrita en go:
package main
import (
"encoding/hex"
"fmt"
"hash"
"github.com/btcsuite/btcec"
"github.com/btcsuite/fastsha256"
)
// Calculate the hash of hasher over buf.
func calcHash(buf []byte, hasher hash.Hash) []byte {
hasher.Write(buf)
return hasher.Sum(nil)
}
// Hash160 calculates the hash ripemd160(sha256(b)).
func Hash256(buf []byte) []byte {
return calcHash(calcHash(buf, fastsha256.New()), fastsha256.New())
}
func main() {
x := "0100000003fdb1fe0b4506f8d412f8498a0d747701bc5ed8c009e779ee670c82361c1d1dd50100000047522102cebf6ab580948d146b7cc771d8e646974349d3d7b11f3e03287d0997a477d3b921037ba651485b7a2cb222191eb64a55926e62bbabfe9b5ed2a9488aad547b20428252aeffffffffa614d26f1878078a00a3c296085576cd7e6361234ea82c865681041fcfdacea80100000000ffffffffd064d2f9cf9e5196a9d81dd87718c9cfbec97f3ccac7164946d956421597c7f10100000000ffffffff01e0687046000000001976a9142c76e6fdd1a81c902afa62e78ec71435708d9d9d88ac0000000001000000"
b, _ := hex.DecodeString(x)
hash := Hash256(b)
fmt.Printf("hash of thing to sign: %x\n", hash)
pubkeyStr := "02cebf6ab580948d146b7cc771d8e646974349d3d7b11f3e03287d0997a477d3b9"
pubkeyStr2 := "037ba651485b7a2cb222191eb64a55926e62bbabfe9b5ed2a9488aad547b204282"
pubkeyBytes, _ := hex.DecodeString(pubkeyStr)
pubkeyBytes2, _ := hex.DecodeString(pubkeyStr2)
p, _ := btcec.ParsePubKey(pubkeyBytes, btcec.S256())
p2, _ := btcec.ParsePubKey(pubkeyBytes2, btcec.S256())
fmt.Printf("pubkeys: %s, %s\n", p, p2)
sigStr := "3044022025332b6dabf11e493fbc62c93e7302c48666512e1cf88157c26176f4af6d064702201ee7ec25d0917244e514c402e8751f112dfd1bef2b22ec5e496fbafabb52bf010148"
sigStr2 := "3045022100fa1f17bf59bee0ac33ae5f682711c5471c73a4aeb898aee218478289a4c7aa6e02207b40dfeae3fa4a50dc147bd42be40370d76a35d72c0b27b27c4ba2439a565fb901"
sigBytes, _ := hex.DecodeString(sigStr)
sigBytes2, _ := hex.DecodeString(sigStr2)
s, _ := btcec.ParseDERSignature(sigBytes, btcec.S256())
s2, _ := btcec.ParseDERSignature(sigBytes2, btcec.S256())
fmt.Printf("sig: %s\n", s)
fmt.Printf("signature valid: %v\n", s.Verify(hash, p))
fmt.Printf("signature valid: %v\n", s2.Verify(hash, p2))
}
Puede hacer lo mismo con la entrada n.º 2 y la entrada n.º 3 para obtener el hash que se firma al cambiar el n.º 5 y el n.º 6 (combinados) para que sean y el n.º 10 o el n.º 14 00
en los pasos anteriores para que sean47522102cebf6ab580948d146b7cc771d8e646974349d3d7b11f3e03287d0997a477d3b921037ba651485b7a2cb222191eb64a55926e62bbabfe9b5ed2a9488aad547b20428252ae
codificador morse
usuario23124
canción de jimmy