add support tari-randomx
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user