github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/tools/verify_tx/verify_tx.go (about) 1 // +build windows 2 3 // On Windows OS copy this file to gocoin\client\usif\textui to enable consensus checking 4 // Make sure you have proper "libbitcoinconsensus-0.dll" in a folder where OS can find it. 5 6 package main 7 8 import ( 9 "encoding/hex" 10 "fmt" 11 "github.com/piotrnar/gocoin/lib/btc" 12 "github.com/piotrnar/gocoin/lib/script" 13 "syscall" 14 "unsafe" 15 ) 16 17 const ( 18 DllName = "libbitcoinconsensus-0.dll" 19 ProcName = "bitcoinconsensus_verify_script" 20 ) 21 22 23 var ( 24 bitcoinconsensus_verify_script *syscall.Proc 25 use_consensus_lib bool 26 ) 27 28 29 func consensus_verify_script(pkScr []byte, i int, tx *btc.Tx, ver_flags uint32) bool { 30 txTo := tx.Serialize() 31 32 var pkscr_ptr, pkscr_len uintptr // default to 0/null 33 if pkScr != nil { 34 pkscr_ptr = uintptr(unsafe.Pointer(&pkScr[0])) 35 pkscr_len = uintptr(len(pkScr)) 36 } 37 r1, _, _ := syscall.Syscall9(bitcoinconsensus_verify_script.Addr(), 7, 38 pkscr_ptr, pkscr_len, 39 uintptr(unsafe.Pointer(&txTo[0])), uintptr(len(txTo)), 40 uintptr(i), uintptr(ver_flags), 0, 0, 0) 41 42 return r1 == 1 43 } 44 45 46 func load_dll() { 47 dll, er := syscall.LoadDLL(DllName) 48 if er!=nil { 49 println(er.Error()) 50 println("WARNING: Consensus verificatrion disabled") 51 return 52 } 53 bitcoinconsensus_verify_script, er = dll.FindProc(ProcName) 54 if er!=nil { 55 println(er.Error()) 56 println("WARNING: Consensus verificatrion disabled") 57 return 58 } 59 fmt.Println("Using", DllName, "to ensure consensus rules") 60 use_consensus_lib = true 61 } 62 63 func main() { 64 load_dll() 65 pkscript, _ := hex.DecodeString("76a9147d22f6c9cca35cb4071971fe442da58546aaeb5988ac") 66 d, _ := hex.DecodeString("0100000002232e0afdd9bcad5e3ace8a19ab8ad0ed8cebd6213b098e36cdc8b25af1d5cd30010000006b483045022077768255f192427bd2841555cfc86fdb7332e18c5c530b3b6028cd034a339f9c022100b3876037f63559ca8a2766a86c8dc62d41c869abc539ab983ce8eccf448f117f012102a33ac1e78cd3ff49bde292da2efcf273509d0869fe81571dfb49528c8287a8fcffffffff2fc90cf473e6ce6177818f705f6e96c7ad42f921f23b660ea27f653346e6a8a9010000006a47304402206d5be8061f712fba560b9966e037f7c53cff377b0c15d8c62bd0a2bcb195048602200522601341cdf574e3a39ba0397d8fe5608e37fd46b3fda2684386207ca9bf69012102a33ac1e78cd3ff49bde292da2efcf273509d0869fe81571dfb49528c8287a8fcffffffff0200a86100000000001976a914ff8e92b694527dd77660f873eb3a86eda5ed459f88ac70110100000000001976a9147d22f6c9cca35cb4071971fe442da58546aaeb5988ac00000000") 67 tx, _ := btc.NewTx(d) 68 i := 0 69 value := uint64(1000000) 70 flags := uint32(script.STANDARD_VERIFY_FLAGS) 71 println(flags) 72 res := script.VerifyTxScript(pkscript, &script.SigChecker{Amount:value, Idx:i, Tx:tx}, flags) 73 println("Gocoin:", res) 74 if use_consensus_lib { 75 res = consensus_verify_script(pkscript, i, tx, flags) 76 println("Consen:", res) 77 } 78 }