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 }