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  }