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  }