本文整理匯總了Golang中github.com/niniwzw/gocoin/lib/btc.Tx.SignatureHash方法的典型用法代碼示例。如果您正苦於以下問題:Golang Tx.SignatureHash方法的具體用法?Golang Tx.SignatureHash怎麽用?Golang Tx.SignatureHash使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/niniwzw/gocoin/lib/btc.Tx
的用法示例。
在下文中一共展示了Tx.SignatureHash方法的3個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: multisig_reorder
// reorder signatures to meet order of the keys
// remove signatuers made by the same keys
// remove exessive signatures (keeps transaction size down)
func multisig_reorder(tx *btc.Tx) (all_signed bool) {
all_signed = true
for i := range tx.TxIn {
ms, _ := btc.NewMultiSigFromScript(tx.TxIn[i].ScriptSig)
if ms == nil {
continue
}
hash := tx.SignatureHash(ms.P2SH(), i, btc.SIGHASH_ALL)
var sigs []*btc.Signature
for ki := range ms.PublicKeys {
var sig *btc.Signature
for si := range ms.Signatures {
if btc.EcdsaVerify(ms.PublicKeys[ki], ms.Signatures[si].Bytes(), hash) {
//fmt.Println("Key number", ki, "has signature number", si)
sig = ms.Signatures[si]
break
}
}
if sig != nil {
sigs = append(sigs, sig)
} else if *verbose {
fmt.Println("WARNING: Key number", ki, "has no matching signature")
}
if !*allowextramsigns && uint(len(sigs)) >= ms.SigsNeeded {
break
}
}
if *verbose {
if len(ms.Signatures) > len(sigs) {
fmt.Println("WARNING: Some signatures are obsolete and will be removed", len(ms.Signatures), "=>", len(sigs))
} else if len(ms.Signatures) < len(sigs) {
fmt.Println("It appears that same key is re-used.", len(sigs)-len(ms.Signatures), "more signatures were added")
}
}
ms.Signatures = sigs
tx.TxIn[i].ScriptSig = ms.Bytes()
if len(sigs) < int(ms.SigsNeeded) {
all_signed = false
}
}
return
}
示例2: sign_tx
// prepare a signed transaction
func sign_tx(tx *btc.Tx) (all_signed bool) {
var multisig_done bool
all_signed = true
// go through each input
for in := range tx.TxIn {
if ms, _ := btc.NewMultiSigFromScript(tx.TxIn[in].ScriptSig); ms != nil {
hash := tx.SignatureHash(ms.P2SH(), in, btc.SIGHASH_ALL)
for ki := range ms.PublicKeys {
k := public_to_key(ms.PublicKeys[ki])
if k != nil {
r, s, e := btc.EcdsaSign(k.Key, hash)
if e != nil {
println("ERROR in sign_tx:", e.Error())
all_signed = false
} else {
btcsig := &btc.Signature{HashType: 0x01}
btcsig.R.Set(r)
btcsig.S.Set(s)
ms.Signatures = append(ms.Signatures, btcsig)
tx.TxIn[in].ScriptSig = ms.Bytes()
multisig_done = true
}
}
}
} else {
uo := getUO(&tx.TxIn[in].Input)
if uo == nil {
println("ERROR: Unkown input:", tx.TxIn[in].Input.String(), "- missing balance folder?")
all_signed = false
continue
}
adr := addr_from_pkscr(uo.Pk_script)
if adr == nil {
fmt.Println("WARNING: Don't know how to sign input number", in)
fmt.Println(" Pk_script:", hex.EncodeToString(uo.Pk_script))
all_signed = false
continue
}
k := hash_to_key(adr.Hash160)
if k == nil {
fmt.Println("WARNING: You do not have key for", adr.String(), "at input", in)
all_signed = false
continue
}
er := tx.Sign(in, uo.Pk_script, btc.SIGHASH_ALL, k.BtcAddr.Pubkey, k.Key)
if er != nil {
fmt.Println("ERROR: Sign failed for input number", in, er.Error())
all_signed = false
}
}
}
// reorder signatures if we signed any multisig inputs
if multisig_done && !multisig_reorder(tx) {
all_signed = false
}
if !all_signed {
fmt.Println("WARNING: Not all the inputs have been signed")
}
return
}
示例3: evalScript
//.........這裏部分代碼省略.........
if stack.size() < 1 {
if DBG_ERR {
println("Stack too short for opcode", opcode)
}
return false
}
rim160 := btc.Rimp160AfterSha256(stack.pop())
stack.push(rim160[:])
case opcode == 0xaa: //OP_HASH256
if stack.size() < 1 {
if DBG_ERR {
println("Stack too short for opcode", opcode)
}
return false
}
h := btc.Sha2Sum(stack.pop())
stack.push(h[:])
case opcode == 0xab: // OP_CODESEPARATOR
sta = idx
case opcode == 0xac || opcode == 0xad: // OP_CHECKSIG || OP_CHECKSIGVERIFY
if stack.size() < 2 {
if DBG_ERR {
println("Stack too short for opcode", opcode)
}
return false
}
var ok bool
pk := stack.pop()
si := stack.pop()
if len(si) > 9 {
sh := tx.SignatureHash(delSig(p[sta:], si), inp, int32(si[len(si)-1]))
ok = btc.EcdsaVerify(pk, si, sh)
if !ok && DBG_ERR {
println("EcdsaVerify fail 1")
}
}
if DBG_SCR {
println("ver:", ok)
}
if opcode == 0xad {
if !ok { // OP_CHECKSIGVERIFY
return false
}
} else { // OP_CHECKSIG
stack.pushBool(ok)
}
case opcode == 0xae || opcode == 0xaf: //OP_CHECKMULTISIG || OP_CHECKMULTISIGVERIFY
//println("OP_CHECKMULTISIG ...")
//stack.print()
if stack.size() < 1 {
if DBG_ERR {
println("OP_CHECKMULTISIG: Stack too short A")
}
return false
}
i := 1
keyscnt := stack.topInt(-i)
if keyscnt < 0 || keyscnt > 20 {
println("OP_CHECKMULTISIG: Wrong number of keys")
return false
}
opcnt += int(keyscnt)