diff --git a/Dockerfile b/Dockerfile index d250818..628f523 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20-alpine +FROM golang:1.21-rc-alpine3.18 ENV CFLAGS="-march=native -Ofast" diff --git a/api.go b/api.go index b54ca9d..34b7719 100644 --- a/api.go +++ b/api.go @@ -3,11 +3,11 @@ package main import ( "encoding/json" "fmt" - "git.gammaspectra.live/P2Pool/p2pool-observer/index" - "golang.org/x/exp/slices" + "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index" "io" "net/http" "net/url" + "slices" "strconv" "strings" "time" @@ -171,8 +171,13 @@ func getPoolInfo(host string) map[string]any { func getPreviousBlocks(host string) (result foundBlocks) { result = getSliceFromAPI[*index.FoundBlock](host, fmt.Sprintf("/api/found_blocks?limit=%d", numberOfBlockHistoryToKeep)) //sort from oldest to newest - slices.SortFunc(result, func(a, b *index.FoundBlock) bool { - return a.MainBlock.Height < b.MainBlock.Height + slices.SortFunc(result, func(a, b *index.FoundBlock) int { + if a.MainBlock.Height < b.MainBlock.Height { + return -1 + } else if a.MainBlock.Height > b.MainBlock.Height { + return 1 + } + return 0 }) return result } diff --git a/bot.go b/bot.go index 433d522..70ae2cb 100644 --- a/bot.go +++ b/bot.go @@ -4,12 +4,11 @@ import ( "context" "flag" "fmt" + "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index" utils2 "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils" - "git.gammaspectra.live/P2Pool/p2pool-observer/index" "git.gammaspectra.live/P2Pool/p2pool-observer/types" "git.gammaspectra.live/P2Pool/p2pool-observer/utils" hbot "github.com/whyrusleeping/hellabot" - "golang.org/x/exp/slices" log2 "gopkg.in/inconshreveable/log15.v2" "gopkg.in/sorcix/irc.v2" "io" @@ -18,6 +17,7 @@ import ( "net/url" "nhooyr.io/websocket" "os" + "slices" "strings" "sync" "time" @@ -346,7 +346,7 @@ func main() { blockFound := func(e *channelEntry, b *index.FoundBlock, previous *index.FoundBlock) { effort := float64(0) if previous != nil { - effort = float64(b.CumulativeDifficulty.SubWrap(previous.CumulativeDifficulty).Mul64(100).Lo) / float64(b.MainBlock.Difficulty) + effort = float64(b.CumulativeDifficulty.Sub(previous.CumulativeDifficulty).Mul64(100).Lo) / float64(b.MainBlock.Difficulty) } bot.Msg(e.Channel, fmt.Sprintf( diff --git a/commands.go b/commands.go index 0e5cd98..4d0b53e 100644 --- a/commands.go +++ b/commands.go @@ -3,15 +3,15 @@ package main import ( "errors" "fmt" - "git.gammaspectra.live/P2Pool/p2pool-observer/index" + "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index" "git.gammaspectra.live/P2Pool/p2pool-observer/monero" "git.gammaspectra.live/P2Pool/p2pool-observer/monero/address" "git.gammaspectra.live/P2Pool/p2pool-observer/p2pool/sidechain" "git.gammaspectra.live/P2Pool/p2pool-observer/types" "git.gammaspectra.live/P2Pool/p2pool-observer/utils" hbot "github.com/whyrusleeping/hellabot" - "golang.org/x/exp/slices" "regexp" + "slices" "strings" "time" ) @@ -82,7 +82,7 @@ var commands = []command{ effort := float64(0) if previous != nil { - effort = float64(lastFound.CumulativeDifficulty.SubWrap(previous.CumulativeDifficulty).Mul64(100).Lo) / float64(lastFound.MainBlock.Difficulty) + effort = float64(lastFound.CumulativeDifficulty.Sub(previous.CumulativeDifficulty).Mul64(100).Lo) / float64(lastFound.MainBlock.Difficulty) } currentEffort := toFloat64(poolInfo["sidechain"].(map[string]any)["effort"].(map[string]any)["current"]) diff --git a/db.go b/db.go index 23532ec..ed56dd4 100644 --- a/db.go +++ b/db.go @@ -4,8 +4,8 @@ import ( "encoding/json" "git.gammaspectra.live/P2Pool/p2pool-observer/monero/address" bolt "go.etcd.io/bbolt" - "golang.org/x/exp/slices" "log" + "slices" "strings" "time" ) diff --git a/entry.go b/entry.go index e22a268..b05d83e 100644 --- a/entry.go +++ b/entry.go @@ -5,15 +5,15 @@ import ( "encoding/json" "errors" "fmt" + "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index" "git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils" - "git.gammaspectra.live/P2Pool/p2pool-observer/index" "git.gammaspectra.live/P2Pool/p2pool-observer/p2pool/sidechain" "git.gammaspectra.live/P2Pool/p2pool-observer/types" - "golang.org/x/exp/slices" "io" "log" "net/url" "nhooyr.io/websocket" + "slices" "sync" "sync/atomic" "time" @@ -120,8 +120,13 @@ func (c *channelEntry) getPreviousBlocks() { } result := getSliceFromAPI[*index.FoundBlock](c.ApiEndpoint, fmt.Sprintf("/api/found_blocks?limit=%d", numberOfBlockHistoryToKeep)) //sort from oldest to newest - slices.SortFunc(result, func(a, b *index.FoundBlock) bool { - return a.MainBlock.Height < b.MainBlock.Height + slices.SortFunc(result, func(a, b *index.FoundBlock) int { + if a.MainBlock.Height < b.MainBlock.Height { + return -1 + } else if a.MainBlock.Height > b.MainBlock.Height { + return 1 + } + return 0 }) c.PreviousBlocks = result } diff --git a/go.mod b/go.mod index 474a41b..93beca4 100644 --- a/go.mod +++ b/go.mod @@ -1,39 +1,49 @@ module git.gammaspectra.live/P2Pool/p2pool-observer-bot -go 1.20 +go 1.21 + +replace git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0 => git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0-20230722151835-f7ba2d0e1fb5 + +replace git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index v0.0.0 => git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index v0.0.0-20230722151835-f7ba2d0e1fb5 + +replace git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils v0.0.0 => git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils v0.0.0-20230722151835-f7ba2d0e1fb5 require ( - git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0-20230530064952-cd9909593157 + git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0 + git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index v0.0.0 + git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils v0.0.0 github.com/whyrusleeping/hellabot v0.0.0-20230331073038-70f5dd5c40d9 go.etcd.io/bbolt v1.3.7 - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 gopkg.in/inconshreveable/log15.v2 v2.16.0 gopkg.in/sorcix/irc.v2 v2.0.0-20200812151606-3f15758ea8c7 nhooyr.io/websocket v1.8.7 ) require ( - git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20230520084036-0f06fa066019 // indirect + git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20230701100949-027561bd2a33 // indirect git.gammaspectra.live/P2Pool/go-monero v0.0.0-20230410011208-910450c4a523 // indirect git.gammaspectra.live/P2Pool/go-randomx v0.0.0-20221027085532-f46adfce03a7 // indirect git.gammaspectra.live/P2Pool/moneroutil v0.0.0-20230527152251-7b24ed2d11ce // indirect git.gammaspectra.live/P2Pool/randomx-go-bindings v0.0.0-20230514082649-9c5f18cd5a71 // indirect - git.gammaspectra.live/P2Pool/sha3 v0.0.0-20230512064207-dde79576dc2f // indirect + git.gammaspectra.live/P2Pool/sha3 v0.0.0-20230604092430-04fe7dc6439a // indirect github.com/ake-persson/mapslice-json v0.0.0-20210720081907-22c8edf57807 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/dolthub/maphash v0.1.0 // indirect + github.com/dolthub/swiss v0.1.0 // indirect github.com/floatdrop/lru v1.3.0 // indirect github.com/ftrvxmtrx/fd v0.0.0-20150925145434-c6d800382fff // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/holiman/uint256 v1.2.2 // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/holiman/uint256 v1.2.3 // indirect github.com/inconshreveable/log15 v2.16.0+incompatible // indirect github.com/jxskiss/base62 v1.1.0 // indirect - github.com/klauspost/compress v1.16.5 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/lib/pq v1.10.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect lukechampine.com/uint128 v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 4c42db9..743a80d 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,21 @@ -git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20230520084036-0f06fa066019 h1:A256rPumLHvYEJdgOQQAHZX7zOZTSYiGcsT5rykpcH4= -git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20230520084036-0f06fa066019/go.mod h1:336HUKX25mQ1qUtzkwV9Wrqi153tTgUOKcIhpYuF2ts= +git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20230701100949-027561bd2a33 h1:BPV7iIiv8T+X7gg9/JfNmEBoH4HXOkw8CR7FN6bBwB8= +git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20230701100949-027561bd2a33/go.mod h1:336HUKX25mQ1qUtzkwV9Wrqi153tTgUOKcIhpYuF2ts= git.gammaspectra.live/P2Pool/go-monero v0.0.0-20230410011208-910450c4a523 h1:oIJzm7kQyASS0xlJ79VSWRvvfXp2Qt7M05+E20o9gwE= git.gammaspectra.live/P2Pool/go-monero v0.0.0-20230410011208-910450c4a523/go.mod h1:TAOAAV972JNDkCzyV5SkbYkKCRvcfhvvFa8LHH4Dg6g= git.gammaspectra.live/P2Pool/go-randomx v0.0.0-20221027085532-f46adfce03a7 h1:bzHDuu1IgETKqPBOlIdCE2LaZIJ+ZpROSprNn+fnzd8= git.gammaspectra.live/P2Pool/go-randomx v0.0.0-20221027085532-f46adfce03a7/go.mod h1:3kT0v4AMwT/OdorfH2gRWPwoOrUX/LV03HEeBsaXG1c= git.gammaspectra.live/P2Pool/moneroutil v0.0.0-20230527152251-7b24ed2d11ce h1:qQhXv8M7IBadycOK1daR6np7g9CKyXfA3RJMEppOyNQ= git.gammaspectra.live/P2Pool/moneroutil v0.0.0-20230527152251-7b24ed2d11ce/go.mod h1:BI6CQv7K4YAhj9V3KzlJS7Am/kVK+E/Akecd1wb77Ic= -git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0-20230530064952-cd9909593157 h1:wYhwYf3Si0NNsa7cyb3Dyw73Ms5TvQPzJks+ffs8oBU= -git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0-20230530064952-cd9909593157/go.mod h1:PLmVndZ2NCwxPmKUoTSDjQATEhqQzs0qtdRmJMHdZ9Y= +git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0-20230722151835-f7ba2d0e1fb5 h1:C2xiJEoe4tA5mrLjc5GRHHs+1J4eseC+f91MBaZKBGU= +git.gammaspectra.live/P2Pool/p2pool-observer v0.0.0-20230722151835-f7ba2d0e1fb5/go.mod h1:CBiwkHQLtf0khuwaoNLwlIV/0J/DxlOYYwJpZZ1lXoI= +git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index v0.0.0-20230722151835-f7ba2d0e1fb5 h1:yMnYXrdps4dZo+AIA5OqzkcpFdNlw/fZDK++kOT7F80= +git.gammaspectra.live/P2Pool/p2pool-observer/cmd/index v0.0.0-20230722151835-f7ba2d0e1fb5/go.mod h1:JP/P9NWCrDyXkb/sMcIqb3c0KkprZ5rFHSw5B+3duzI= +git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils v0.0.0-20230722151835-f7ba2d0e1fb5 h1:wxEWbxghMm9tz7Mkiuuoxmp87bynRD2ZDBZN+eHCvdA= +git.gammaspectra.live/P2Pool/p2pool-observer/cmd/utils v0.0.0-20230722151835-f7ba2d0e1fb5/go.mod h1:5/nifqWp6H6dqTBGexuKFeWEIz0H2tUOM3S+Cf2oN2o= git.gammaspectra.live/P2Pool/randomx-go-bindings v0.0.0-20230514082649-9c5f18cd5a71 h1:MgeHHcF+GnCJBWMSzq8XAbc8p/UhNwFruEKCPPJ74YQ= git.gammaspectra.live/P2Pool/randomx-go-bindings v0.0.0-20230514082649-9c5f18cd5a71/go.mod h1:KQaYHIxGXNHNMQELC7xGLu8xouwvP/dN7iGk681BXmk= -git.gammaspectra.live/P2Pool/sha3 v0.0.0-20230512064207-dde79576dc2f h1:dQc+lJIlbR0acDqoPAtew0lMVVnKVFO0bZpf1/wbo6Y= -git.gammaspectra.live/P2Pool/sha3 v0.0.0-20230512064207-dde79576dc2f/go.mod h1:6wZ0+whl+HZdcRve4R6Rq6jV1fmL1xCYO8Wty6lR008= +git.gammaspectra.live/P2Pool/sha3 v0.0.0-20230604092430-04fe7dc6439a h1:c24MHv/z+aBYpYNsQHcJqmFuaYInGVixJZgDCXA/4bs= +git.gammaspectra.live/P2Pool/sha3 v0.0.0-20230604092430-04fe7dc6439a/go.mod h1:6wZ0+whl+HZdcRve4R6Rq6jV1fmL1xCYO8Wty6lR008= github.com/ake-persson/mapslice-json v0.0.0-20210720081907-22c8edf57807 h1:w3nrGk00TWs/4iZ3Q0k9c0vL0e/wRziArKU4e++d/nA= github.com/ake-persson/mapslice-json v0.0.0-20210720081907-22c8edf57807/go.mod h1:fGnnfniJiO/ajHAVHqMSUSL8sE9LmU9rzclCtoeB+y8= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -20,6 +24,10 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ= +github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4= +github.com/dolthub/swiss v0.1.0 h1:EaGQct3AqeP/MjASHLiH6i4TAmgbG/c4rA6a1bzCOPc= +github.com/dolthub/swiss v0.1.0/go.mod h1:BeucyB08Vb1G9tumVN3Vp/pyY4AMUnr9p7Rz7wJ7kAQ= github.com/floatdrop/lru v1.3.0 h1:83abtaKjXcWrPmtzTAk2Ggq8DUKqI29YzrTrB8+vu0c= github.com/floatdrop/lru v1.3.0/go.mod h1:83zlXKA06Bm32JImNINCiTr0ldadvdAjUe5jSwIaw0s= github.com/ftrvxmtrx/fd v0.0.0-20150925145434-c6d800382fff h1:zk1wwii7uXmI0znwU+lqg+wFL9G5+vm5I+9rv2let60= @@ -52,12 +60,13 @@ github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gordonklaus/ineffassign v0.0.0-20210522101830-0589229737b2/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= -github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/inconshreveable/log15 v0.0.0-20200109203555-b30bc20e4fd1/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= github.com/inconshreveable/log15 v2.16.0+incompatible h1:6nvMKxtGcpgm7q0KiGs+Vc+xDvUXaBqsPKHWKsinccw= github.com/inconshreveable/log15 v2.16.0+incompatible/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= @@ -67,8 +76,8 @@ github.com/jxskiss/base62 v1.1.0 h1:A5zbF8v8WXx2xixnAKD2w+abC+sIzYJX+nxmhA6HWFw= github.com/jxskiss/base62 v1.1.0/go.mod h1:HhWAlUXvxKThfOlZbcuFzsqwtF5TcqS9ru3y5GfjWAc= github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -87,10 +96,14 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= +github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/thepudds/swisstable v0.0.0-20221011152303-9c77dc657777 h1:5u+6YWU2faS+Sr/x8j9yalMpSDUkatNOZWXV3wMUCGQ= +github.com/thepudds/swisstable v0.0.0-20221011152303-9c77dc657777/go.mod h1:4af3KxEsswy6aTzsTcwa8QZUSh4V+80oHdp1QX9uJHA= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= @@ -105,10 +118,8 @@ go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -135,11 +146,11 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -164,6 +175,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= diff --git a/position_chart.go b/position_chart.go index 96a5275..c66a995 100644 --- a/position_chart.go +++ b/position_chart.go @@ -2,25 +2,35 @@ package main import ( "git.gammaspectra.live/P2Pool/p2pool-observer/utils" - "golang.org/x/exp/slices" + "slices" ) type PositionChart struct { totalItems uint64 bucket []uint64 + perBucket int idle byte } func (p *PositionChart) Add(index int, value uint64) { - if index < 0 || index > int(p.totalItems) { + if index < 0 || index >= int(p.totalItems) { return } if len(p.bucket) == 1 { p.bucket[0] += value return } - i := uint64(index) * uint64(len(p.bucket)-1) / (p.totalItems - 1) - p.bucket[i] += value + + p.bucket[p.indexOf(index)] += value +} + +func (p *PositionChart) indexOf(index int) int { + if len(p.bucket) == 1 { + return 0 + } + i := (index*len(p.bucket) - 1) / int(p.totalItems-1) + + return i } func (p *PositionChart) Total() (result uint64) { @@ -61,11 +71,28 @@ func (p *PositionChart) String() string { return string(position) } +func (p *PositionChart) StringWithoutDelimiters() string { + position := make([]byte, len(p.bucket)) + for i, e := range utils.ReverseSlice(slices.Clone(p.bucket)) { + if e > 0 { + if e > 9 { + position[i] = '+' + } else { + position[i] = 0x30 + byte(e) + } + } else { + position[i] = p.idle + } + } + + return string(position) +} + func (p *PositionChart) StringWithSeparator(index int) string { - if index < 0 || index > int(p.totalItems) { + if index < 0 || index >= int(p.totalItems) { return p.String() } - separatorIndex := index * (len(p.bucket) - 1) / int(p.totalItems-1) + separatorIndex := p.indexOf(index) position := make([]byte, 1+2*2+len(p.bucket)) position[0], position[1] = '[', '<' position[2+separatorIndex] = '|' @@ -92,9 +119,14 @@ func NewPositionChart(size uint64, totalItems uint64) *PositionChart { if size < 1 { size = 1 } + perBucket := int(totalItems / size) + if totalItems%size > 0 { + perBucket += 1 + } return &PositionChart{ totalItems: totalItems, bucket: make([]uint64, size), + perBucket: perBucket, idle: '.', } } diff --git a/utils.go b/utils.go index 24821bb..5d364c0 100644 --- a/utils.go +++ b/utils.go @@ -5,7 +5,6 @@ import ( "git.gammaspectra.live/P2Pool/p2pool-observer/p2pool/sidechain" "git.gammaspectra.live/P2Pool/p2pool-observer/types" "git.gammaspectra.live/P2Pool/p2pool-observer/utils" - "golang.org/x/exp/constraints" "math" "strconv" "strings" @@ -59,7 +58,7 @@ func GetShareLink(host string, sideHeight uint64, mainId types.Hash) string { return fmt.Sprintf("%s/s/%s", host, utils.EncodeBinaryNumber(uHeight)) } -func GetPayoutLink[T constraints.Integer](host string, sideHeight uint64, index T, consensus *sidechain.Consensus) string { +func GetPayoutLink[T uint64 | uint32 | int](host string, sideHeight uint64, index T, consensus *sidechain.Consensus) string { payoutIndex := (sideHeight << uint64(math.Ceil(math.Log2(float64(consensus.ChainWindowSize*4))))) | uint64(index) return fmt.Sprintf("%s/p/%s", host, utils.EncodeBinaryNumber(payoutIndex)) }