github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/client/common/mining.go (about)

     1  package common
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"io/ioutil"
     7  
     8  	"github.com/piotrnar/gocoin/lib/btc"
     9  )
    10  
    11  type oneMinerId struct {
    12  	Name string
    13  	Tag  []byte
    14  }
    15  
    16  var MinerIds []oneMinerId
    17  
    18  // return miner ID of the given coinbase transaction
    19  func TxMiner(cbtx *btc.Tx) (string, int) {
    20  	txdat := cbtx.Serialize()
    21  	for i, m := range MinerIds {
    22  		if bytes.Equal(m.Tag, []byte("_p2pool_")) { // P2Pool
    23  			if len(cbtx.TxOut) > 10 &&
    24  				bytes.Equal(cbtx.TxOut[len(cbtx.TxOut)-1].Pk_script[:2], []byte{0x6A, 0x28}) {
    25  				return m.Name, i
    26  			}
    27  		} else if bytes.Equal(m.Tag, []byte("_RSK_")) { // RSK Pool
    28  			if len(cbtx.TxOut) > 1 {
    29  				txo := cbtx.TxOut[len(cbtx.TxOut)-1]
    30  				if len(txo.Pk_script) >= 10 && txo.Pk_script[0] == 0x6A && string(txo.Pk_script[2:10]) == "RSKBLOCK" {
    31  					return m.Name, i
    32  				}
    33  			}
    34  		} else if bytes.Contains(txdat, m.Tag) {
    35  			return m.Name, i
    36  		}
    37  	}
    38  
    39  	for _, txo := range cbtx.TxOut {
    40  		adr := btc.NewAddrFromPkScript(txo.Pk_script, Testnet)
    41  		if adr != nil {
    42  			return adr.String(), -1
    43  		}
    44  	}
    45  
    46  	return "", -1
    47  }
    48  
    49  func ReloadMiners() {
    50  	d, _ := ioutil.ReadFile("miners.json")
    51  	if d != nil {
    52  		var MinerIdFile [][3]string
    53  		e := json.Unmarshal(d, &MinerIdFile)
    54  		if e != nil {
    55  			println("miners.json", e.Error())
    56  			return
    57  		}
    58  		MinerIds = nil
    59  		for _, r := range MinerIdFile {
    60  			var rec oneMinerId
    61  			rec.Name = r[0]
    62  			if r[1] != "" {
    63  				rec.Tag = []byte(r[1])
    64  			} else {
    65  				if a, _ := btc.NewAddrFromString(r[2]); a != nil {
    66  					rec.Tag = a.OutScript()
    67  				} else {
    68  					println("Error in miners.json for", r[0])
    69  					continue
    70  				}
    71  			}
    72  			MinerIds = append(MinerIds, rec)
    73  		}
    74  	}
    75  }