add support tari-randomx

This commit is contained in:
lzx
2025-09-09 14:54:04 +08:00
parent 8cc56a489e
commit 917d7118e6
26 changed files with 14297 additions and 111 deletions

View File

@@ -26,49 +26,56 @@ import (
"go.uber.org/zap"
)
const SERVER_SHA3X_VERSION string = "sha3x v0.1a"
const SERVER_RANDOMXT_VERSION string = "randomxt v0.1a"
type Sha3xBlockHeader struct {
Nonce [8]byte
Header [32]byte
Algo byte
type RandomxTBlockHeader struct {
Zero [3]byte
Nonce [8]byte
Header [32]byte
Algo byte
PowData [32]byte
}
func Sha3xBlockHeaderToBytes(h Sha3xBlockHeader) []byte {
out := make([]byte, 8+32+1)
for i := 0; i < 8; i++ {
out[i] = h.Nonce[i]
func RandomxTBlockHeaderToBytes(miningHash string) []byte {
miningHashBytes, err := hex.DecodeString(miningHash)
if err != nil || len(miningHashBytes) != 32 {
return nil
}
for i := 0; i < 32; i++ {
out[8+i] = h.Header[i]
}
out[8+32] = h.Algo
out := make([]byte, 76)
copy(out[0:3], []byte{0x00, 0x00, 0x00})
copy(out[3:35], miningHashBytes)
// nonce 8 字节默认全 0无需手动赋值
out[43] = 0x02
// 最后 32 字节也默认全 0无需赋值
return out
}
type ServerSha3xContext struct {
type ServerRandomxContext struct {
ServerCtx *coin.ServerContext
logg *zap.Logger
Sha3xJob msg.Sha3xStratumJob
RandomxTJob msg.RandomxTStratumJob
}
var logg *zap.Logger
var ServerSha3xCtx ServerSha3xContext
var ServerSha3xCtx ServerRandomxContext
var vm *RandomXValidator
type Sha3xNotify_params_msg struct {
Algo string `json:"algo"`
Blob string `json:"blob"`
Height uint32 `json:"height"`
Job_id string `json:"job_id"`
Target string `json:"target"`
type RandomxTNotify_params_msg struct {
Algo string `json:"algo"` // "rx/0"
Blob string `json:"blob"`
Height uint32 `json:"height"`
Job_id string `json:"job_id"`
Target string `json:"target"`
SeedHash string `json:"seed_hash"`
Variant string `json:"variant"` // "rx/0"
}
type Sha3xNotify_msg struct {
Jsonrpc string `json:"jsonrpc"`
Method string `json:"method"`
Params Sha3xNotify_params_msg `json:"params"`
type RandomxTNotify_msg struct {
Jsonrpc string `json:"jsonrpc"`
Method string `json:"method"`
Params RandomxTNotify_params_msg `json:"params"`
}
func handle_submit(miner *coin.MinerObj, id float64, miner_user string, job_id string, nonce2 string, ntime string, nonce string) (bool, bool, bool) {
@@ -98,7 +105,7 @@ func handle_submit(miner *coin.MinerObj, id float64, miner_user string, job_id s
//stratum.UpdateJobs(miner)
v, ok := miner.Jobs.Load(job_id)
if ok {
job := v.(msg.Sha3xStratumJob)
job := v.(msg.RandomxTStratumJob)
if job.Height < miner.CurHeight-1 {
ack.Result = false
@@ -129,19 +136,25 @@ func handle_submit(miner *coin.MinerObj, id float64, miner_user string, job_id s
nb, _ := hex.DecodeString(nonce)
var calc_hash []byte
// var calc_hash []byte
var header Sha3xBlockHeader
for i := 0; i < 8; i++ {
header.Nonce[i] = nb[i]
// var header RandomxTBlockHeader
// for i := 0; i < 8; i++ {
// header.Nonce[i] = nb[i]
// }
// for i := 0; i < 32; i++ {
// header.Header[i] = phb[i]
// }
// header.Algo = 1
// header := miner.Server.RandomxTJob.Header
submit_item.Header = hex.EncodeToString(phb)
calc_hash, _, err := vm.BuildPowHash(phb, nb)
if err != nil {
ack.Result = false
stratum.Handle_exception(miner, id, stratum.MINER_ERR_UNKNOWN)
miner.ErrOthers = miner.ErrOthers + 1
return false, false, false
}
for i := 0; i < 32; i++ {
header.Header[i] = phb[i]
}
header.Algo = 1
submit_item.Header = hex.EncodeToString(Sha3xBlockHeaderToBytes(header))
calc_hash = BuildPowHash(header)
//logg.Debug("[server]", zap.String("hash in", submit_item.Header))
//calc_hash, header := util.BuildBlockHash(&(job), true, Build_PowHash)
//logg.Debug("[server]", zap.String("calc_hash", hex.EncodeToString(calc_hash)) /*, zap.String("merkle root", hex.EncodeToString(merkle_root))*/)
@@ -455,7 +468,8 @@ func handle_submit(miner *coin.MinerObj, id float64, miner_user string, job_id s
return false, false, true
}
func Produce_block_submit(miner *coin.MinerObj /*header Sha3xBlockHeader,*/, job *msg.Sha3xStratumJob, PowHash string, SubIdx int64) {
func Produce_block_submit(miner *coin.MinerObj /*header Sha3xBlockHeader,*/, job *msg.RandomxTStratumJob, PowHash string, SubIdx int64) {
var nm msg.BlockSha3xMsg
nm.Id = job.Id
nm.Header = job.Header
@@ -497,7 +511,7 @@ func Produce_block_submit(miner *coin.MinerObj /*header Sha3xBlockHeader,*/, job
}
if miner.Server.PubCh != nil {
//miner.Server.PubCh.SendChan <- [][]byte{[]byte("blksha3x"), []byte(blk)}
err := miner.Server.PubCh.SendMessage([][]byte{[]byte("blksha3x"), []byte(blk)})
err := miner.Server.PubCh.SendMessage([][]byte{[]byte("blkrandomxt"), []byte(blk)})
if err != nil {
miner.Server.PubCh.Destroy()
miner.Server.PubCh = nil
@@ -509,12 +523,12 @@ func Produce_block_submit(miner *coin.MinerObj /*header Sha3xBlockHeader,*/, job
}
// server-->miner
func sha3x_parse_miner_notify(miner *coin.MinerObj, msg msg.Sha3xStratumJob) int {
func randomxT_parse_miner_notify(miner *coin.MinerObj, msg msg.RandomxTStratumJob) int {
if miner.Sha3xJob.Height != msg.Height {
miner.Job.IsClean = true
}
miner.Sha3xJob = msg
miner.Sha3xJob.Extranonce1 = miner.Job.Extranonce1
miner.RandomxTJob = msg
miner.RandomxTJob.Extranonce1 = miner.Job.Extranonce1
miner.Job.Extranonce2_size = msg.Extranonce2_size
//miner.Server.Logg.Info("[server]", zap.Int32("miner.Version", miner.Version), zap.Int32("msg.Version", msg.Version))
@@ -524,7 +538,7 @@ func sha3x_parse_miner_notify(miner *coin.MinerObj, msg msg.Sha3xStratumJob) int
func Init(server *coin.ServerContext) {
ServerSha3xCtx.ServerCtx = server
logg = server.Logg
logg.Info("[server]", zap.String("server_sha3x_version", SERVER_SHA3X_VERSION))
logg.Info("[server]", zap.String("server_version", SERVER_RANDOMXT_VERSION))
coin.Init_diff_db()
}
@@ -537,8 +551,8 @@ func Stop() {
}
func InitMiner(miner *coin.MinerObj) {
miner.Sha3xJob = miner.Server.Sha3xJob
miner.Sha3xJob.Extranonce1 = miner.Job.Extranonce1
miner.RandomxTJob = miner.Server.RandomxTJob
miner.RandomxTJob.Extranonce1 = miner.Job.Extranonce1
server_target := new(big.Int)
t_bytes, err := hex.DecodeString(miner.NexaJob.Target)
@@ -596,18 +610,18 @@ func Sha3xNotify(miner *coin.MinerObj) {
miner.TxLock.Lock()
//log.Println("[server]extra1, id", miner.Job.Extranonce1, miner.Job.Job_id, miner.MinerId)
var msg Sha3xNotify_msg
var msg RandomxTNotify_msg
idb := make([]byte, 4)
binary.BigEndian.PutUint32(idb, miner.JobId)
miner.Job.Job_id = hex.EncodeToString(idb)
msg.Params.Algo = "sha3x"
msg.Params.Algo = "rx/0"
msg.Params.Variant = "rx/0"
msg.Params.SeedHash = miner.Server.RandomxTJob.SeedHash
msg.Params.Job_id = miner.Job.Job_id
msg.Params.Blob = miner.Sha3xJob.Header
msg.Params.Height = miner.Sha3xJob.Height
//target_s, _ := stratum.ReverseHexStringByByte(miner.Sha3xJob.Target)
//msg.Params.Target = target_s[48:]
msg.Params.Blob = miner.RandomxTJob.Header
msg.Params.Height = miner.RandomxTJob.Height
target_new, _ := utility.DiffToTarget(miner.Difficulty)
target_str := fmt.Sprintf("%064x", target_new.Bytes())
target_strr, strerr := stratum.ReverseHexStringByByte(target_str)
@@ -617,11 +631,11 @@ func Sha3xNotify(miner *coin.MinerObj) {
//println("target=", target_str, "r=", target_strr)
msg.Params.Target = target_strr[48:]
miner.CurHeight = miner.Sha3xJob.Height
miner.CurHeight = miner.RandomxTJob.Height
miner.Sha3xJob.JobDifficulty = miner.Difficulty
miner.RandomxTJob.JobDifficulty = miner.Difficulty
miner.Jobs.LoadOrStore(miner.Job.Job_id, miner.Sha3xJob)
miner.Jobs.LoadOrStore(miner.Job.Job_id, miner.RandomxTJob)
/*var entry coin.JobListEntry
entry.Job_id = miner.Job.Job_id
@@ -691,8 +705,11 @@ func formatUint64ToHexWithPadding(val uint64) string {
return hexStr
}
var last_seed_hash string = ""
func HandleJobMsg(server *coin.ServerContext, Msg []byte) {
var result msg.Sha3xStratumJob
vm = &RandomXValidator{} // 初始化vm虚拟机指针防止出现空指针报错
var result msg.RandomxTStratumJob
server.Logg.Warn("[server]", zap.String("receive", "job"))
if err := json.Unmarshal(Msg, &result); err != nil {
@@ -701,21 +718,36 @@ func HandleJobMsg(server *coin.ServerContext, Msg []byte) {
}
result.Target = formatUint64ToHexWithPadding(result.U64target)
if last_seed_hash != result.SeedHash {
seed_hash_byte, err := hex.DecodeString(result.SeedHash)
if err != nil {
server.Logg.Error("[server]", zap.String("DecodeString", err.Error()))
return
}
vm, err = NewRandomXValidator(seed_hash_byte)
if err != nil {
server.Logg.Error("[server]", zap.String("NewRandomXValidator", err.Error()))
return
}
last_seed_hash = result.SeedHash
}
//target_new, _ := utility.DiffToTarget((float64)(result.U64target))
//target_str := fmt.Sprintf("%064x", target_new.Bytes())
//result.Target = target_str
server.Sha3xJob = msg.Sha3xStratumJob(result)
logg.Debug("[gbt]", zap.String("Target", server.Sha3xJob.Target))
server.RandomxTJob = msg.RandomxTStratumJob(result)
blobByte := RandomxTBlockHeaderToBytes(server.RandomxTJob.Header)
server.RandomxTJob.Header = hex.EncodeToString(blobByte)
logg.Debug("[gbt]", zap.String("Target", server.RandomxTJob.Target))
server.Sha3xJob.Extranonce2_size = 8
server.RandomxTJob.Extranonce2_size = 8
server.SJob.Extranonce2_size = 8
logg.Debug("[gbt]", zap.Uint32("Height", server.Sha3xJob.Height), zap.String("Target", server.Sha3xJob.Target), zap.String("Header", server.Sha3xJob.Header) /*, zap.Uint64("Timastamp", server.Sha3xJob.CurTime)*/)
targetb, _ := hex.DecodeString(server.Sha3xJob.Target)
logg.Debug("[gbt]", zap.Uint64("Id", server.Sha3xJob.Id), zap.Float64("network diff", utility.Target2Diff(utility.Reverse(targetb))))
logg.Debug("[gbt]", zap.Uint32("Height", server.RandomxTJob.Height), zap.String("Target", server.RandomxTJob.Target), zap.String("Header", server.RandomxTJob.Header) /*, zap.Uint64("Timastamp", server.Sha3xJob.CurTime)*/)
targetb, _ := hex.DecodeString(server.RandomxTJob.Target)
logg.Debug("[gbt]", zap.Uint64("Id", server.RandomxTJob.Id), zap.Float64("network diff", utility.Target2Diff(utility.Reverse(targetb))))
server.NetHight = uint64(server.Sha3xJob.Height)
server.NetTarget = server.Sha3xJob.Target
server.NetHight = uint64(server.RandomxTJob.Height)
server.NetTarget = server.RandomxTJob.Target
server.Miners.Range(func(k, v interface{}) bool {
if v != nil {
m, ok := v.(*(coin.MinerObj))
@@ -724,7 +756,7 @@ func HandleJobMsg(server *coin.ServerContext, Msg []byte) {
server.Logg.Info("[server]", zap.String("lock", "start"))
m.TxLock.Lock()
status := m.Status
cmd := sha3x_parse_miner_notify(m, server.Sha3xJob)
cmd := randomxT_parse_miner_notify(m, server.RandomxTJob)
m.TxLock.Unlock()
server.Logg.Info("[server]", zap.String("lock", "end"))
var need_notify bool = true