Browse Source

Update Master

master
yuriy0803 5 years ago
parent
commit
ccb56e8710
  1. 4
      api.json
  2. 2
      main.go
  3. 14
      payouts/payer.go
  4. 49
      payouts/unlocker.go
  5. 1
      proxy/config.go
  6. 4
      proxy/handlers.go
  7. 19
      proxy/miner.go

4
api.json

@ -2,7 +2,8 @@
"threads": 4, "threads": 4,
"coin": "etc", "coin": "etc",
"name": "main", "name": "main",
"pplns": 9000, "pplns": 9000,
"network": "classic",
"proxy": { "proxy": {
"enabled": true, "enabled": true,
@ -16,6 +17,7 @@
"hashrateExpiration": "3h", "hashrateExpiration": "3h",
"healthCheck": true, "healthCheck": true,
"debug": true,
"maxFails": 100, "maxFails": 100,
"stratum": { "stratum": {

2
main.go

@ -33,7 +33,7 @@ func startApi() {
} }
func startBlockUnlocker() { func startBlockUnlocker() {
u := payouts.NewBlockUnlocker(&cfg.BlockUnlocker, backend) u := payouts.NewBlockUnlocker(&cfg.BlockUnlocker, backend, &cfg.Network)
u.Start() u.Start()
} }

14
payouts/payer.go

@ -5,10 +5,10 @@ import (
"log" "log"
"math/big" "math/big"
"os" "os"
"os/exec" "os/exec"
"strconv" "strconv"
"sync"
"time" "time"
"sync"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
@ -30,9 +30,9 @@ type PayoutsConfig struct {
GasPrice string `json:"gasPrice"` GasPrice string `json:"gasPrice"`
AutoGas bool `json:"autoGas"` AutoGas bool `json:"autoGas"`
// In Shannon // In Shannon
Threshold int64 `json:"threshold"` Threshold int64 `json:"threshold"`
BgSave bool `json:"bgsave"` BgSave bool `json:"bgsave"`
ConcurrentTx int `json:"concurrentTx"` ConcurrentTx int `json:"concurrentTx"`
} }
func (self PayoutsConfig) GasHex() string { func (self PayoutsConfig) GasHex() string {
@ -108,7 +108,7 @@ func (u *PayoutsProcessor) Start() {
func (u *PayoutsProcessor) process() { func (u *PayoutsProcessor) process() {
if u.halt { if u.halt {
log.Println("Payments suspended due to last critical error:", u.lastFail) log.Println("Payments suspended due to last critical error:", u.lastFail)
os.Exit(1) os.Exit(1)
return return
} }
mustPay := 0 mustPay := 0
@ -233,7 +233,7 @@ func (u *PayoutsProcessor) process() {
break break
} }
} }
wg.Done() wg.Done()
}(txHash, login, &wg) }(txHash, login, &wg)
if waitingCount > u.config.ConcurrentTx { if waitingCount > u.config.ConcurrentTx {

49
payouts/unlocker.go

@ -3,8 +3,8 @@ package payouts
import ( import (
"fmt" "fmt"
"log" "log"
"os"
"math/big" "math/big"
"os"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -27,14 +27,12 @@ type UnlockerConfig struct {
Interval string `json:"interval"` Interval string `json:"interval"`
Daemon string `json:"daemon"` Daemon string `json:"daemon"`
Timeout string `json:"timeout"` Timeout string `json:"timeout"`
Ecip1017FBlock int64 `json:"ecip1017FBlock"`
Ecip1017EraRounds *big.Int `json:"ecip1017EraRounds"`
} }
const minDepth = 16 const minDepth = 16
// const ecip1017FBlock = 0 // mordor
// var ecip1017EraRounds = big.NewInt(2000000) // mordor
const ecip1017FBlock = 5000000 // mainnet
var ecip1017EraRounds = big.NewInt(5000000) // mainnet
var disinflationRateQuotient = big.NewInt(4) // Disinflation rate quotient for ECIP1017 var disinflationRateQuotient = big.NewInt(4) // Disinflation rate quotient for ECIP1017
var disinflationRateDivisor = big.NewInt(5) // Disinflation rate divisor for ECIP1017 var disinflationRateDivisor = big.NewInt(5) // Disinflation rate divisor for ECIP1017
var big32 = big.NewInt(32) var big32 = big.NewInt(32)
@ -50,7 +48,16 @@ type BlockUnlocker struct {
lastFail error lastFail error
} }
func NewBlockUnlocker(cfg *UnlockerConfig, backend *storage.RedisClient) *BlockUnlocker { func NewBlockUnlocker(cfg *UnlockerConfig, backend *storage.RedisClient, network *string) *BlockUnlocker {
if *network == "classic" {
cfg.Ecip1017FBlock = 5000000
cfg.Ecip1017EraRounds = big.NewInt(5000000)
} else if *network == "mordor" {
cfg.Ecip1017FBlock = 0
cfg.Ecip1017EraRounds = big.NewInt(2000000)
} else {
log.Fatalln("Invalid network set", network)
}
if len(cfg.PoolFeeAddress) != 0 && !util.IsValidHexAddress(cfg.PoolFeeAddress) { if len(cfg.PoolFeeAddress) != 0 && !util.IsValidHexAddress(cfg.PoolFeeAddress) {
log.Fatalln("Invalid poolFeeAddress", cfg.PoolFeeAddress) log.Fatalln("Invalid poolFeeAddress", cfg.PoolFeeAddress)
@ -170,7 +177,7 @@ func (u *BlockUnlocker) unlockCandidates(candidates []*storage.BlockData) (*Unlo
orphan = false orphan = false
result.uncles++ result.uncles++
err := handleUncle(height, uncle, candidate) err := handleUncle(height, uncle, candidate, u.config)
if err != nil { if err != nil {
u.halt = true u.halt = true
u.lastFail = err u.lastFail = err
@ -220,7 +227,8 @@ func (u *BlockUnlocker) handleBlock(block *rpc.GetBlockReply, candidate *storage
return err return err
} }
candidate.Height = correctHeight candidate.Height = correctHeight
reward := getConstReward(candidate.Height) era := GetBlockEra(big.NewInt(candidate.Height), u.config.Ecip1017EraRounds)
reward := getConstReward(era)
// Add reward for including uncles // Add reward for including uncles
uncleReward := getRewardForUncle(reward) uncleReward := getRewardForUncle(reward)
@ -244,12 +252,13 @@ func (u *BlockUnlocker) handleBlock(block *rpc.GetBlockReply, candidate *storage
return nil return nil
} }
func handleUncle(height int64, uncle *rpc.GetBlockReply, candidate *storage.BlockData) error { func handleUncle(height int64, uncle *rpc.GetBlockReply, candidate *storage.BlockData, cfg *UnlockerConfig) error {
uncleHeight, err := strconv.ParseInt(strings.Replace(uncle.Number, "0x", "", -1), 16, 64) uncleHeight, err := strconv.ParseInt(strings.Replace(uncle.Number, "0x", "", -1), 16, 64)
if err != nil { if err != nil {
return err return err
} }
reward := getUncleReward(new(big.Int).SetInt64(uncleHeight), new(big.Int).SetInt64(height), getConstReward(height)) era := GetBlockEra(big.NewInt(height), cfg.Ecip1017EraRounds)
reward := getUncleReward(new(big.Int).SetInt64(uncleHeight), new(big.Int).SetInt64(height), era, getConstReward(era))
candidate.Height = height candidate.Height = height
candidate.UncleHeight = uncleHeight candidate.UncleHeight = uncleHeight
candidate.Orphan = false candidate.Orphan = false
@ -261,7 +270,7 @@ func handleUncle(height int64, uncle *rpc.GetBlockReply, candidate *storage.Bloc
func (u *BlockUnlocker) unlockPendingBlocks() { func (u *BlockUnlocker) unlockPendingBlocks() {
if u.halt { if u.halt {
log.Println("Unlocking suspended due to last critical error:", u.lastFail) log.Println("Unlocking suspended due to last critical error:", u.lastFail)
os.Exit(1) os.Exit(1)
return return
} }
@ -347,7 +356,7 @@ func (u *BlockUnlocker) unlockPendingBlocks() {
entries = append(entries, fmt.Sprintf("\tREWARD %v: %v: %v Shannon", block.RoundKey(), login, reward)) entries = append(entries, fmt.Sprintf("\tREWARD %v: %v: %v Shannon", block.RoundKey(), login, reward))
per := new(big.Rat) per := new(big.Rat)
if val, ok := percents[login]; ok { if val, ok := percents[login]; ok {
per = val per = val
} }
u.backend.WriteReward(login, reward, per, true, block) u.backend.WriteReward(login, reward, per, true, block)
} }
@ -496,9 +505,9 @@ func (u *BlockUnlocker) calculateRewards(block *storage.BlockData) (*big.Rat, *b
return revenue, minersProfit, poolProfit, rewards, percents, nil return revenue, minersProfit, poolProfit, rewards, percents, nil
} }
func calculateRewardsForShares(shares map[string]int64, total int64, reward *big.Rat)(map[string]int64, map[string]*big.Rat) { func calculateRewardsForShares(shares map[string]int64, total int64, reward *big.Rat) (map[string]int64, map[string]*big.Rat) {
rewards := make(map[string]int64) rewards := make(map[string]int64)
percents := make(map[string]*big.Rat) percents := make(map[string]*big.Rat)
for login, n := range shares { for login, n := range shares {
percents[login] = big.NewRat(n, total) percents[login] = big.NewRat(n, total)
@ -560,15 +569,9 @@ func GetBlockEra(blockNum, eraLength *big.Int) *big.Int {
return new(big.Int).Sub(d, dremainder) return new(big.Int).Sub(d, dremainder)
} }
func getConstReward(height int64) *big.Int { func getConstReward(era *big.Int) *big.Int {
var blockReward = homesteadReward var blockReward = homesteadReward
var bigHeight = new(big.Int).SetInt64(height)
// Ensure value 'era' is configured.
era := GetBlockEra(bigHeight, ecip1017EraRounds)
wr := GetBlockWinnerRewardByEra(era, blockReward) wr := GetBlockWinnerRewardByEra(era, blockReward)
// wurs := GetBlockWinnerRewardForUnclesByEra(era, uncles, blockReward) // wurs "winner uncle rewards"
// wr.Add(wr, wurs)
return wr return wr
} }
@ -576,9 +579,7 @@ func getRewardForUncle(blockReward *big.Int) *big.Int {
return new(big.Int).Div(blockReward, big32) //return new(big.Int).Div(reward, new(big.Int).SetInt64(32)) return new(big.Int).Div(blockReward, big32) //return new(big.Int).Div(reward, new(big.Int).SetInt64(32))
} }
func getUncleReward(uHeight *big.Int, height *big.Int, reward *big.Int) *big.Int { func getUncleReward(uHeight *big.Int, height *big.Int, era *big.Int, reward *big.Int) *big.Int {
// Ensure value 'era' is configured.
era := GetBlockEra(height, ecip1017EraRounds)
// Era 1 (index 0): // Era 1 (index 0):
// An extra reward to the winning miner for including uncles as part of the block, in the form of an extra 1/32 (0.15625ETC) per uncle included, up to a maximum of two (2) uncles. // An extra reward to the winning miner for including uncles as part of the block, in the form of an extra 1/32 (0.15625ETC) per uncle included, up to a maximum of two (2) uncles.
if era.Cmp(big.NewInt(0)) == 0 { if era.Cmp(big.NewInt(0)) == 0 {

1
proxy/config.go

@ -16,6 +16,7 @@ type Config struct {
Threads int `json:"threads"` Threads int `json:"threads"`
Network string `json:"network"`
Coin string `json:"coin"` Coin string `json:"coin"`
Pplns int64 `json:"pplns"` Pplns int64 `json:"pplns"`
Redis storage.Config `json:"redis"` Redis storage.Config `json:"redis"`

4
proxy/handlers.go

@ -1,10 +1,10 @@
package proxy package proxy
import ( import (
"errors"
"log" "log"
"regexp" "regexp"
"strings" "strings"
"errors"
"github.com/yuriy0803/open-etc-pool-friends/rpc" "github.com/yuriy0803/open-etc-pool-friends/rpc"
"github.com/yuriy0803/open-etc-pool-friends/util" "github.com/yuriy0803/open-etc-pool-friends/util"
@ -91,7 +91,7 @@ func (s *ProxyServer) handleSubmitRPC(cs *Session, login, id string, params []st
if !ok { if !ok {
cs.lastErr = errors.New("High rate of invalid shares") cs.lastErr = errors.New("High rate of invalid shares")
} }
}(s, cs, login, id, params) }(s, cs, login, id, params)
return true, nil return true, nil
} }

19
proxy/miner.go

@ -6,14 +6,27 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/ethereum/ethash"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/yuriy0803/go-etchash"
) )
var hasher = ethash.New() var ecip1099FBlockClassic uint64 = 11700000 // classic mainnet
var ecip1099FBlockMordor uint64 = 2520000 // mordor
func (s *ProxyServer) processShare(login, id, ip string, t *BlockTemplate, params []string) (bool, bool) { var hasher *etchash.Etchash = nil
func (s *ProxyServer) processShare(login, id, ip string, t *BlockTemplate, params []string) (bool, bool) {
if hasher == nil {
if s.config.Network == "classic" {
hasher = etchash.New(&ecip1099FBlockClassic)
} else if s.config.Network == "mordor" {
hasher = etchash.New(&ecip1099FBlockMordor)
} else {
// unknown network
log.Printf("Unknown network configuration %s", s.config.Network)
return false, false
}
}
nonceHex := params[0] nonceHex := params[0]
hashNoNonce := params[1] hashNoNonce := params[1]
mixDigest := params[2] mixDigest := params[2]

Loading…
Cancel
Save