m2pool_core/internal/server/nexa/hash_nexa.go

62 lines
1.3 KiB
Go

// hash_nexa.go
package nexa
/*
#cgo CFLAGS : -I../include
#cgo LDFLAGS: -L../lib -lnexa
#include <stdio.h>
#include <stdlib.h>
#include "nexaapi.h"
*/
import "C"
import (
//"encoding/hex"
//"log"
"unsafe"
)
func BuildPowHash(h NexaBlockHeader) []byte {
outputs := make([]byte, 32)
inb := NexaBlockHeaderToBytes(h)
//log.Println("[nexa]in", hex.EncodeToString(inb))
in := (*C.uchar)(C.CBytes(inb))
output := (*C.uchar)(C.malloc(32))
C.nexa_hash(output, in)
p := uintptr(unsafe.Pointer(output))
for i := 0; i < 32; i++ {
j := *(*byte)(unsafe.Pointer(p))
outputs[i] = j
p += unsafe.Sizeof(j)
}
C.free(unsafe.Pointer(output))
C.free(unsafe.Pointer(in))
outputs32 := make([]byte, 32)
for i := 0; i < 32; i++ {
outputs32[i] = outputs[i]
}
return outputs32
}
func BuildPowHash12(h NexaBlockHeader12) []byte {
outputs := make([]byte, 32)
inb := NexaBlockHeaderToBytes12(h)
//log.Println("[nexa]in", hex.EncodeToString(inb))
in := (*C.uchar)(C.CBytes(inb))
output := (*C.uchar)(C.malloc(32))
C.nexa_hash12(output, in)
p := uintptr(unsafe.Pointer(output))
for i := 0; i < 32; i++ {
j := *(*byte)(unsafe.Pointer(p))
outputs[i] = j
p += unsafe.Sizeof(j)
}
C.free(unsafe.Pointer(output))
C.free(unsafe.Pointer(in))
outputs32 := make([]byte, 32)
for i := 0; i < 32; i++ {
outputs32[i] = outputs[i]
}
return outputs32
}