github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/tools/verify_script/verify_script.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "unsafe" 6 "syscall" 7 "encoding/hex" 8 "github.com/piotrnar/gocoin/lib/btc" 9 "github.com/piotrnar/gocoin/lib/script" 10 ) 11 12 const ( 13 DllName = "libbitcoinconsensus-0.dll" 14 ProcName = "bitcoinconsensus_verify_script_with_amount" 15 ) 16 17 18 var ( 19 bitcoinconsensus_verify_script_with_amount *syscall.Proc 20 ) 21 22 23 func call_consensus_lib(pkScr []byte, amount uint64, i int, tx *btc.Tx, ver_flags uint32) bool { 24 var tmp []byte 25 if len(pkScr)!=0 { 26 tmp = make([]byte, len(pkScr)) 27 copy(tmp, pkScr) 28 } 29 txTo := tx.Serialize() 30 var pkscr_ptr, pkscr_len uintptr // default to 0/null 31 if pkScr != nil { 32 pkscr_ptr = uintptr(unsafe.Pointer(&pkScr[0])) 33 pkscr_len = uintptr(len(pkScr)) 34 } 35 r1, _, _ := syscall.Syscall9(bitcoinconsensus_verify_script_with_amount.Addr(), 8, 36 pkscr_ptr, pkscr_len, uintptr(amount), 37 uintptr(unsafe.Pointer(&txTo[0])), uintptr(len(txTo)), 38 uintptr(i), uintptr(ver_flags), 0, 0) 39 40 return r1 == 1 41 } 42 43 44 func init() { 45 dll, er := syscall.LoadDLL(DllName) 46 if er!=nil { 47 println(er.Error()) 48 println("WARNING: Consensus verificatrion disabled") 49 return 50 } 51 bitcoinconsensus_verify_script_with_amount, er = dll.FindProc(ProcName) 52 if er!=nil { 53 println(er.Error()) 54 println("WARNING: Consensus verificatrion disabled") 55 return 56 } 57 fmt.Println("Using", DllName, "to ensure consensus rules") 58 } 59 /* 60 */ 61 62 func main() { 63 pkscript, _ := hex.DecodeString("a9143d98738ba9013a53acc34686cd8e8b2ebc3612e587") 64 d, _ := hex.DecodeString("01000000010c3e18ff26e98ba39381c84d2fb9e8e198e63d0b3697f9bd57f63577c96da23f00000000d5483045022100fc4f7bfa3c536e743b02af8b7de5d4052f43db54f59692478b25c585b9df211a02203cfcfc0ed618fae6aa49b11e803ec4e5654551fb52fe2d026929f4a307fe2ef0012103d7c6052544bc42eb2bc0d27c884016adb933f15576a1a2d21cd4dd0f2de0c37d004c67635221025e37e03703f001de34123b513beaf0e4044a2dd39a1dd92ec1706f184920031a2103d7c6052544bc42eb2bc0d27c884016adb933f15576a1a2d21cd4dd0f2de0c37d52ae67010ab27576a914937fe2ee82229d282edec2606c70e755875334c088ac680f0000000130750000000000001976a914937fe2ee82229d282edec2606c70e755875334c088ac0f000000") 65 tx, _ := btc.NewTx(d) 66 tx.Hash.Calc(d) 67 println("txid", tx.Hash.String()) 68 i := 0 69 flags := uint32(script.STANDARD_VERIFY_FLAGS) //& ^uint32(script.VER_MINDATA) 70 amount := uint64(1000000) 71 //script.DBG_SCR = true 72 //script.DBG_ERR = true 73 res := script.VerifyTxScript(pkscript, &script.SigChecker{Amount:amount, Idx:i, Tx:tx}, flags) 74 if bitcoinconsensus_verify_script_with_amount!=nil { 75 resc := call_consensus_lib(pkscript, amount, i, tx, flags) 76 println(res, resc) 77 } else { 78 println(res) 79 } 80 }