Commit 6ed000d0 authored by 贾浩@五瓣科技's avatar 贾浩@五瓣科技

rename: witness -> validator

parent 82884287
...@@ -9,21 +9,21 @@ BUILDTIME=$(shell git show -s --format=%cd) ...@@ -9,21 +9,21 @@ BUILDTIME=$(shell git show -s --format=%cd)
default: all default: all
all: clean witness all: clean validator
BUILD_FLAGS=-ldflags "\ BUILD_FLAGS=-ldflags "\
-X 'witness/version.GOVersion=$(GOVERSION)' \ -X 'validator/version.GOVersion=$(GOVERSION)' \
-X 'witness/version.GitHash=$(GITHASH)' \ -X 'validator/version.GitHash=$(GITHASH)' \
-X 'witness/version.BuildTime=$(BUILDTIME)' \ -X 'validator/version.BuildTime=$(BUILDTIME)' \
-X 'witness/version.GitBranch=$(GITBRANCH)'" -X 'validator/version.GitBranch=$(GITBRANCH)'"
witness: validator:
go build $(BUILD_FLAGS) -v -o=${GOBIN}/$@ ./cmd/witness go build $(BUILD_FLAGS) -v -o=${GOBIN}/$@ ./cmd/validator
dev: dev:
go build $(BUILD_FLAGS) -v -o=${GOBIN}/$@ -gcflags "all=-N -l" ./cmd/witness go build $(BUILD_FLAGS) -v -o=${GOBIN}/$@ -gcflags "all=-N -l" ./cmd/validator
clean: clean:
......
...@@ -4,13 +4,13 @@ import ( ...@@ -4,13 +4,13 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"time" "time"
"witness/core" "validator/core"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
var witness *core.Witness var validator *core.Validator
func rpcHandle(w http.ResponseWriter, r *http.Request) { func rpcHandle(w http.ResponseWriter, r *http.Request) {
req := &jsonrpcMessage{} req := &jsonrpcMessage{}
...@@ -115,7 +115,7 @@ func getWithdrawProofs(params []byte, resp *jsonrpcMessage) { ...@@ -115,7 +115,7 @@ func getWithdrawProofs(params []byte, resp *jsonrpcMessage) {
date = paramList[1] date = paramList[1]
} }
workload, proofs := witness.GetMerkleProof(common.HexToAddress(paramList[0]), date) workload, proofs := validator.GetMerkleProof(common.HexToAddress(paramList[0]), date)
temp := map[string]interface{}{ temp := map[string]interface{}{
"workload": workload, "workload": workload,
...@@ -145,7 +145,7 @@ func getPendingWorkload(params []byte, resp *jsonrpcMessage) { ...@@ -145,7 +145,7 @@ func getPendingWorkload(params []byte, resp *jsonrpcMessage) {
return return
} }
workload, globalWorkload := witness.GetPendingWorkload(common.HexToAddress(addressList[0])) workload, globalWorkload := validator.GetPendingWorkload(common.HexToAddress(addressList[0]))
temp := map[string]interface{}{ temp := map[string]interface{}{
"workload": workload, "workload": workload,
"global_workload": globalWorkload, "global_workload": globalWorkload,
...@@ -197,7 +197,7 @@ func getDailyMerkleNodes(params []byte, resp *jsonrpcMessage) { ...@@ -197,7 +197,7 @@ func getDailyMerkleNodes(params []byte, resp *jsonrpcMessage) {
rootHash = common.HexToHash(paramList[3].(string)) rootHash = common.HexToHash(paramList[3].(string))
} }
nodes := witness.GetDailyMerkleNodes(date, depth, rootHash) nodes := validator.GetDailyMerkleNodes(date, depth, rootHash)
resp.Result, _ = json.Marshal(nodes) resp.Result, _ = json.Marshal(nodes)
} }
...@@ -243,15 +243,15 @@ func getDailyMerkleSumNodes(params []byte, resp *jsonrpcMessage) { ...@@ -243,15 +243,15 @@ func getDailyMerkleSumNodes(params []byte, resp *jsonrpcMessage) {
rootHash = common.HexToHash(paramList[3].(string)) rootHash = common.HexToHash(paramList[3].(string))
} }
nodes, vals := witness.GetDailyMerkleSumNodes(date, depth, rootHash) nodes, vals := validator.GetDailyMerkleSumNodes(date, depth, rootHash)
resp.Result, _ = json.Marshal(map[string]interface{}{ resp.Result, _ = json.Marshal(map[string]interface{}{
"nodes": nodes, "nodes": nodes,
"values": vals, "values": vals,
}) })
} }
func StartJSONRPC(listenAddress string, w *core.Witness) { func StartJSONRPC(listenAddress string, w *core.Validator) {
witness = w validator = w
http.HandleFunc("/", rpcHandle) http.HandleFunc("/", rpcHandle)
log.WithField("listen", listenAddress).Info("start JSON-RPC server") log.WithField("listen", listenAddress).Info("start JSON-RPC server")
err := http.ListenAndServe(listenAddress, nil) err := http.ListenAndServe(listenAddress, nil)
......
...@@ -62,8 +62,8 @@ var ( ...@@ -62,8 +62,8 @@ var (
Usage: "The address of the store contract", Usage: "The address of the store contract",
} }
witnessContractFlag = &cli.StringFlag{ validatorContractFlag = &cli.StringFlag{
Name: "witness-contract", Name: "validator-contract",
Usage: "The address of the reward contract", Usage: "The address of the reward contract",
} }
......
...@@ -3,11 +3,11 @@ package main ...@@ -3,11 +3,11 @@ package main
import ( import (
"net/http" "net/http"
"os" "os"
"witness/api" "validator/api"
"witness/conf" "validator/conf"
"witness/core" "validator/core"
"witness/quest" "validator/quest"
"witness/version" "validator/version"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
...@@ -25,7 +25,7 @@ var ( ...@@ -25,7 +25,7 @@ var (
privateKeyFlag, privateKeyFlag,
chainRPCFlag, chainRPCFlag,
storeContractFlag, storeContractFlag,
witnessContractFlag, validatorContractFlag,
commitTimeFlag, commitTimeFlag,
questHostFlag, questHostFlag,
questPortFlag, questPortFlag,
...@@ -38,8 +38,8 @@ var ( ...@@ -38,8 +38,8 @@ var (
func main() { func main() {
app := cli.App{} app := cli.App{}
app.Flags = wrapFlags(append(appFlags, []cli.Flag{}...)) app.Flags = wrapFlags(append(appFlags, []cli.Flag{}...))
app.Name = "witness" app.Name = "validator"
app.Usage = "this is witness" app.Usage = "this is validator"
app.Version = version.Version app.Version = version.Version
app.Before = func(c *cli.Context) error { app.Before = func(c *cli.Context) error {
return loadFlagsFromConfig(c, app.Flags) return loadFlagsFromConfig(c, app.Flags)
...@@ -62,7 +62,7 @@ func run(ctx *cli.Context) { ...@@ -62,7 +62,7 @@ func run(ctx *cli.Context) {
PrivateKey: ctx.String(privateKeyFlag.Name), PrivateKey: ctx.String(privateKeyFlag.Name),
ChainRPC: ctx.String(chainRPCFlag.Name), ChainRPC: ctx.String(chainRPCFlag.Name),
StoreContract: ctx.String(storeContractFlag.Name), StoreContract: ctx.String(storeContractFlag.Name),
WitnessContract: ctx.String(witnessContractFlag.Name), ValidatorContract: ctx.String(validatorContractFlag.Name),
DataDir: ctx.String(dataDirFlag.Name), DataDir: ctx.String(dataDirFlag.Name),
CommitTime: ctx.Int(commitTimeFlag.Name), CommitTime: ctx.Int(commitTimeFlag.Name),
} }
...@@ -79,7 +79,7 @@ func run(ctx *cli.Context) { ...@@ -79,7 +79,7 @@ func run(ctx *cli.Context) {
} }
q := quest.NewQuest(qCfg) q := quest.NewQuest(qCfg)
w := core.RunWitness(q, cfg) w := core.RunValidator(q, cfg)
// runGrpcServer(cfg.GRPCListenAddr, w) // runGrpcServer(cfg.GRPCListenAddr, w)
runJSONRPCServer(cfg.RPCListenAddr, w) runJSONRPCServer(cfg.RPCListenAddr, w)
select {} select {}
...@@ -105,6 +105,6 @@ func runMetrics(listen string) { ...@@ -105,6 +105,6 @@ func runMetrics(listen string) {
}() }()
} }
func runJSONRPCServer(listen string, w *core.Witness) { func runJSONRPCServer(listen string, w *core.Validator) {
go api.StartJSONRPC(listen, w) go api.StartJSONRPC(listen, w)
} }
...@@ -8,7 +8,7 @@ type Config struct { ...@@ -8,7 +8,7 @@ type Config struct {
ChainRPC string ChainRPC string
PrivateKey string PrivateKey string
StoreContract string StoreContract string
WitnessContract string ValidatorContract string
RewardContract string RewardContract string
DataDir string DataDir string
CommitTime int CommitTime int
......
...@@ -12,7 +12,7 @@ private-key = "529f4efb80ac534f17d873104c71881c0970dbd5a886f183f63c5c6bb7a1fcd9" ...@@ -12,7 +12,7 @@ private-key = "529f4efb80ac534f17d873104c71881c0970dbd5a886f183f63c5c6bb7a1fcd9"
store-contract = "0x7Cd36Bc2a477f60A14f08442179B2f626bE026Ea" store-contract = "0x7Cd36Bc2a477f60A14f08442179B2f626bE026Ea"
witness-contract = "0xf49133dD7B7ed75fA0f877413D293c05Bff0D8F0" witness-contract = "0x60376A7A4F5013CCca347A9B320D0b8dD57D87F4"
commit-time = 3600 # utc + n seconds commit-time = 3600 # utc + n seconds
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
"fmt" "fmt"
"math/big" "math/big"
"time" "time"
"witness/contract" "validator/contract"
"github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2"
"github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum"
...@@ -24,10 +24,10 @@ type ChainRPC struct { ...@@ -24,10 +24,10 @@ type ChainRPC struct {
chainID *big.Int chainID *big.Int
privateKey *ecdsa.PrivateKey privateKey *ecdsa.PrivateKey
storageContract *contract.AddressStorage storageContract *contract.AddressStorage
witnessContract *contract.Witness validatorContract *contract.Validator
} }
func newChain(rpc, privateKey, storageCa, witnessCa string) *ChainRPC { func newChain(rpc, privateKey, storageCa, validatorCa string) *ChainRPC {
ethRpc, err := ethclient.Dial(rpc) ethRpc, err := ethclient.Dial(rpc)
if err != nil { if err != nil {
panic(err) panic(err)
...@@ -48,7 +48,7 @@ func newChain(rpc, privateKey, storageCa, witnessCa string) *ChainRPC { ...@@ -48,7 +48,7 @@ func newChain(rpc, privateKey, storageCa, witnessCa string) *ChainRPC {
panic(err) panic(err)
} }
witness, err := contract.NewWitness(common.HexToAddress(witnessCa), ethRpc) validator, err := contract.NewValidator(common.HexToAddress(validatorCa), ethRpc)
if err != nil { if err != nil {
panic(err) panic(err)
} }
...@@ -65,7 +65,7 @@ func newChain(rpc, privateKey, storageCa, witnessCa string) *ChainRPC { ...@@ -65,7 +65,7 @@ func newChain(rpc, privateKey, storageCa, witnessCa string) *ChainRPC {
} }
k, _ := btcec.PrivKeyFromBytes(binPrivateKey) k, _ := btcec.PrivKeyFromBytes(binPrivateKey)
return &ChainRPC{rpc: ethRpc, storageContract: storage, witnessContract: witness, chainID: chainID, privateKey: k.ToECDSA()} return &ChainRPC{rpc: ethRpc, storageContract: storage, validatorContract: validator, chainID: chainID, privateKey: k.ToECDSA()}
} }
func (r *ChainRPC) GetContainerAddresses() (addrs []common.Address, err error) { func (r *ChainRPC) GetContainerAddresses() (addrs []common.Address, err error) {
...@@ -81,7 +81,7 @@ func (r *ChainRPC) GetWorkloadThreshold(totalWorkload uint64) (threshold *big.In ...@@ -81,7 +81,7 @@ func (r *ChainRPC) GetWorkloadThreshold(totalWorkload uint64) (threshold *big.In
return big.NewInt(1), nil return big.NewInt(1), nil
} }
func (r *ChainRPC) SubmitProofs(date string, merkleSumTreeRoot, merkleTreeRoot common.Hash) (txHash common.Hash, err error) { func (r *ChainRPC) SubmitProofs(dateTimestamp int64, merkleSumTreeRoot, merkleTreeRoot common.Hash) (txHash common.Hash, err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute) ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel() defer cancel()
opts, err := bind.NewKeyedTransactorWithChainID(r.privateKey, r.chainID) opts, err := bind.NewKeyedTransactorWithChainID(r.privateKey, r.chainID)
...@@ -90,7 +90,7 @@ func (r *ChainRPC) SubmitProofs(date string, merkleSumTreeRoot, merkleTreeRoot c ...@@ -90,7 +90,7 @@ func (r *ChainRPC) SubmitProofs(date string, merkleSumTreeRoot, merkleTreeRoot c
} }
opts.Context = ctx opts.Context = ctx
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
signedTx, err := r.witnessContract.SubmitMerkleRoot(opts, date, merkleSumTreeRoot, merkleTreeRoot) signedTx, err := r.validatorContract.SubmitMerkleRoot(opts, big.NewInt(dateTimestamp), merkleSumTreeRoot, merkleTreeRoot)
if err != nil { if err != nil {
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
continue continue
......
...@@ -3,43 +3,43 @@ package core ...@@ -3,43 +3,43 @@ package core
import ( import (
"fmt" "fmt"
"math/big" "math/big"
"witness/tree" "validator/tree"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func (w *Witness) GetPendingWorkload(address common.Address) (workload, globalWorkload uint64) { func (v *Validator) GetPendingWorkload(address common.Address) (workload, globalWorkload uint64) {
wl, err := w.q.GetPendingWorkload(w.todayTimestamp(), address.Hex()) wl, err := v.q.GetPendingWorkload(v.todayTimestamp(), address.Hex())
if err != nil { if err != nil {
log.WithError(err).Error("failed to get pending workload") log.WithError(err).Error("failed to get pending workload")
return return
} }
log.WithField("workload", wl).Debug("quest get pending workload") log.WithField("workload", wl).Debug("quest get pending workload")
return wl, w.pendingWorkload return wl, v.pendingWorkload
} }
func (w *Witness) GetMerkleProof(address common.Address, date string) (balance string, proofs []common.Hash) { func (v *Validator) GetMerkleProof(address common.Address, date string) (balance string, proofs []common.Hash) {
if date == "" { if date == "" {
date = w.date date = v.date
} }
w.Lock() v.Lock()
cacheTree, ok := w.mtTreeCache[date] cacheTree, ok := v.mtTreeCache[date]
w.Unlock() v.Unlock()
if !ok { if !ok {
if ok = w.LoadMerkleTree(date); !ok { if ok = v.LoadMerkleTree(date); !ok {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"date": date, "date": date,
}).Error("load merkle proof empty") }).Error("load merkle proof empty")
return "0", nil return "0", nil
} }
} }
w.Lock() v.Lock()
cacheTree = w.mtTreeCache[date] cacheTree = v.mtTreeCache[date]
w.Unlock() v.Unlock()
dateStateRootKey := fmt.Sprintf("sroot:%s", date) dateStateRootKey := fmt.Sprintf("sroot:%s", date)
dateStateRoot, err := w.lvdb.Get([]byte(dateStateRootKey)) dateStateRoot, err := v.lvdb.Get([]byte(dateStateRootKey))
if err != nil { if err != nil {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"key": dateStateRootKey, "key": dateStateRootKey,
...@@ -48,10 +48,10 @@ func (w *Witness) GetMerkleProof(address common.Address, date string) (balance s ...@@ -48,10 +48,10 @@ func (w *Witness) GetMerkleProof(address common.Address, date string) (balance s
return "0", nil return "0", nil
} }
var sdb *StateDB var sdb *StateDB
if date == w.date { if date == v.date {
sdb = w.state sdb = v.state
} else { } else {
sdb, err = NewStateDB(w.lvdb, common.BytesToHash(dateStateRoot)) sdb, err = NewStateDB(v.lvdb, common.BytesToHash(dateStateRoot))
if err != nil { if err != nil {
log.WithError(err).Error("failed to create state db") log.WithError(err).Error("failed to create state db")
return "0", nil return "0", nil
...@@ -72,24 +72,24 @@ func (w *Witness) GetMerkleProof(address common.Address, date string) (balance s ...@@ -72,24 +72,24 @@ func (w *Witness) GetMerkleProof(address common.Address, date string) (balance s
return object.Balance, proofs return object.Balance, proofs
} }
func (w *Witness) GetDailyMerkleNodes(date string, depth int, rootHash common.Hash) (nodes [][]common.Hash) { func (v *Validator) GetDailyMerkleNodes(date string, depth int, rootHash common.Hash) (nodes [][]common.Hash) {
if date == "" { if date == "" {
date = w.date date = v.date
} }
w.Lock() v.Lock()
cacheTree, ok := w.mtTreeCache[date] cacheTree, ok := v.mtTreeCache[date]
w.Unlock() v.Unlock()
if !ok { if !ok {
if ok = w.LoadMerkleTree(date); !ok { if ok = v.LoadMerkleTree(date); !ok {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"date": date, "date": date,
}).Error("load merkle proof empty") }).Error("load merkle proof empty")
return nil return nil
} }
} }
w.Lock() v.Lock()
cacheTree = w.mtTreeCache[date] cacheTree = v.mtTreeCache[date]
w.Unlock() v.Unlock()
rootNode := cacheTree.GetRootNode() rootNode := cacheTree.GetRootNode()
if rootHash.Hex() == (common.Hash{}).Hex() { if rootHash.Hex() == (common.Hash{}).Hex() {
...@@ -100,24 +100,24 @@ func (w *Witness) GetDailyMerkleNodes(date string, depth int, rootHash common.Ha ...@@ -100,24 +100,24 @@ func (w *Witness) GetDailyMerkleNodes(date string, depth int, rootHash common.Ha
return tree.MerkleTreeTraversal(rootNode, depth) return tree.MerkleTreeTraversal(rootNode, depth)
} }
func (w *Witness) GetDailyMerkleSumNodes(date string, depth int, rootHash common.Hash) (nodesHash [][]common.Hash, nodesVal [][]string) { func (v *Validator) GetDailyMerkleSumNodes(date string, depth int, rootHash common.Hash) (nodesHash [][]common.Hash, nodesVal [][]string) {
if date == "" { if date == "" {
date = w.date date = v.date
} }
w.Lock() v.Lock()
cacheTree, ok := w.mstTreeCache[date] cacheTree, ok := v.mstTreeCache[date]
w.Unlock() v.Unlock()
if !ok { if !ok {
if ok = w.LoadMerkleSumTree(date); !ok { if ok = v.LoadMerkleSumTree(date); !ok {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"date": date, "date": date,
}).Error("load merkle sum proof empty") }).Error("load merkle sum proof empty")
return nil, nil return nil, nil
} }
} }
w.Lock() v.Lock()
cacheTree = w.mstTreeCache[date] cacheTree = v.mstTreeCache[date]
w.Unlock() v.Unlock()
rootNode := cacheTree.GetRoot() rootNode := cacheTree.GetRoot()
if rootHash.Hex() == (common.Hash{}).Hex() { if rootHash.Hex() == (common.Hash{}).Hex() {
......
...@@ -7,40 +7,40 @@ import ( ...@@ -7,40 +7,40 @@ import (
) )
// UpdateContractAddressJob 定时更新合约内的地址 // UpdateContractAddressJob 定时更新合约内的地址
func (w *Witness) UpdateContractAddressJob() { func (v *Validator) UpdateContractAddressJob() {
ticker := time.NewTicker(time.Minute * 10) ticker := time.NewTicker(time.Minute * 10)
defer ticker.Stop() defer ticker.Stop()
log.Info("start update address task") log.Info("start update address task")
for { for {
addrs, err := w.rpc.GetContainerAddresses() addrs, err := v.rpc.GetContainerAddresses()
if err != nil { if err != nil {
log.WithError(err).Error("failed to get container addresses") log.WithError(err).Error("failed to get container addresses")
} else { } else {
w.containerAddresses = addrs v.containerAddresses = addrs
} }
addrs, err = w.rpc.GetNMAddresses() addrs, err = v.rpc.GetNMAddresses()
if err != nil { if err != nil {
log.WithError(err).Error("failed to get NM addresses") log.WithError(err).Error("failed to get NM addresses")
} else { } else {
w.nmAddresses = addrs v.nmAddresses = addrs
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"container_count": len(w.containerAddresses), "container_count": len(v.containerAddresses),
"nm_count": len(w.nmAddresses), "nm_count": len(v.nmAddresses),
}).Info("store contract update address") }).Info("store contract update address")
<-ticker.C <-ticker.C
} }
} }
// UpdateGlobalWorkloadJob 定时从quest更新全局workload // UpdateGlobalWorkloadJob 定时从quest更新全局workload
func (w *Witness) UpdateGlobalWorkloadJob() { func (v *Validator) UpdateGlobalWorkloadJob() {
ticker := time.NewTicker(time.Second * 30) ticker := time.NewTicker(time.Second * 30)
defer ticker.Stop() defer ticker.Stop()
log.Info("start update global workload task") log.Info("start update global workload task")
for { for {
wl := w.GetGlobalWorkload() wl := v.GetGlobalWorkload()
if wl > 0 { if wl > 0 {
w.pendingWorkload = wl v.pendingWorkload = wl
} }
<-ticker.C <-ticker.C
} }
......
package core package core
import ( import (
"witness/quest" "validator/quest"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
witnessv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/witness/v1" validatorv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/validator/v1"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func (w *Witness) LoadPendingProofs(startTimestamp, endTimestamp int64) { func (v *Validator) LoadPendingProofs(startTimestamp, endTimestamp int64) {
defaultLimit := 100 defaultLimit := 100
lastTaskID := "" lastTaskID := ""
var dbProofs []*quest.ProofModel var dbProofs []*quest.ProofModel
var err error var err error
for { for {
dbProofs, err = w.q.GetProofs(startTimestamp, endTimestamp, lastTaskID, defaultLimit) dbProofs, err = v.q.GetProofs(startTimestamp, endTimestamp, lastTaskID, defaultLimit)
if err != nil { if err != nil {
log.WithError(err).Error("failed to get proofs") log.WithError(err).Error("failed to get proofs")
return return
...@@ -27,16 +27,16 @@ func (w *Witness) LoadPendingProofs(startTimestamp, endTimestamp int64) { ...@@ -27,16 +27,16 @@ func (w *Witness) LoadPendingProofs(startTimestamp, endTimestamp int64) {
} }
for _, dbProof := range dbProofs { for _, dbProof := range dbProofs {
miner, proof := w.verifyProof(dbProof) miner, proof := v.verifyProof(dbProof)
if proof != nil { if proof != nil {
w.AddPendingProof(miner, proof) v.AddPendingProof(miner, proof)
} }
lastTaskID = dbProof.TaskId lastTaskID = dbProof.TaskId
} }
} }
} }
func (w *Witness) verifyProof(dbProof *quest.ProofModel) (miner common.Address, proof *witnessv1.ValidatedProof) { func (v *Validator) verifyProof(dbProof *quest.ProofModel) (miner common.Address, proof *validatorv1.ValidatedProof) {
if dbProof.TaskWorkload == 0 { if dbProof.TaskWorkload == 0 {
return return
} }
...@@ -46,7 +46,7 @@ func (w *Witness) verifyProof(dbProof *quest.ProofModel) (miner common.Address, ...@@ -46,7 +46,7 @@ func (w *Witness) verifyProof(dbProof *quest.ProofModel) (miner common.Address,
return return
} }
containerSigner := crypto.PubkeyToAddress(*containerPubKey) containerSigner := crypto.PubkeyToAddress(*containerPubKey)
verified := w.IsContainerAddress(containerSigner) verified := v.IsContainerAddress(containerSigner)
if !verified { if !verified {
log.WithFields(log.Fields{"taskid": dbProof.TaskId, "signer": containerSigner.Hex()}).Error("invalid container signature") log.WithFields(log.Fields{"taskid": dbProof.TaskId, "signer": containerSigner.Hex()}).Error("invalid container signature")
return return
...@@ -70,21 +70,21 @@ func (w *Witness) verifyProof(dbProof *quest.ProofModel) (miner common.Address, ...@@ -70,21 +70,21 @@ func (w *Witness) verifyProof(dbProof *quest.ProofModel) (miner common.Address,
} }
nmAddress := crypto.PubkeyToAddress(*nmPubKey) nmAddress := crypto.PubkeyToAddress(*nmPubKey)
verified = w.IsNMAddress(nmAddress) verified = v.IsNMAddress(nmAddress)
if !verified { if !verified {
log.WithFields(log.Fields{"taskid": dbProof.TaskId, "signer": nmAddress.Hex()}).Error("invalid manager signature") log.WithFields(log.Fields{"taskid": dbProof.TaskId, "signer": nmAddress.Hex()}).Error("invalid manager signature")
return return
} }
proof = &witnessv1.ValidatedProof{ proof = &validatorv1.ValidatedProof{
Workload: dbProof.TaskWorkload, Workload: dbProof.TaskWorkload,
Timestamp: uint64(dbProof.TaskFinishTimestamp), Timestamp: uint64(dbProof.TaskFinishTimestamp),
} }
return common.HexToAddress(dbProof.TaskProfitAccount), proof return common.HexToAddress(dbProof.TaskProfitAccount), proof
} }
func (w *Witness) GetGlobalWorkload() uint64 { func (v *Validator) GetGlobalWorkload() uint64 {
workload, err := w.q.GetGlobalWorkload(w.todayTimestamp()) workload, err := v.q.GetGlobalWorkload(v.todayTimestamp())
if err != nil { if err != nil {
log.WithError(err).Error("failed to get global workload") log.WithError(err).Error("failed to get global workload")
return 0 return 0
......
...@@ -8,7 +8,7 @@ import ( ...@@ -8,7 +8,7 @@ import (
"github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/trie"
"github.com/ethereum/go-ethereum/trie/trienode" "github.com/ethereum/go-ethereum/trie/trienode"
"github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/proto"
witnessv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/witness/v1" validatorv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/validator/v1"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
...@@ -30,8 +30,8 @@ func NewStateDB(lvdb ethdb.KeyValueStore, root common.Hash) (statedb *StateDB, e ...@@ -30,8 +30,8 @@ func NewStateDB(lvdb ethdb.KeyValueStore, root common.Hash) (statedb *StateDB, e
}, nil }, nil
} }
func (s *StateDB) GetMinerObject(miner common.Address) (object *witnessv1.MinerObject) { func (s *StateDB) GetMinerObject(miner common.Address) (object *validatorv1.MinerObject) {
object = &witnessv1.MinerObject{} object = &validatorv1.MinerObject{}
k := crypto.Keccak256(miner.Bytes()) k := crypto.Keccak256(miner.Bytes())
v, err := s.trie.Get(k) v, err := s.trie.Get(k)
if err != nil { if err != nil {
...@@ -44,7 +44,7 @@ func (s *StateDB) GetMinerObject(miner common.Address) (object *witnessv1.MinerO ...@@ -44,7 +44,7 @@ func (s *StateDB) GetMinerObject(miner common.Address) (object *witnessv1.MinerO
return return
} }
func (s *StateDB) UpdateMinerObject(miner common.Address, object *witnessv1.MinerObject) (err error) { func (s *StateDB) UpdateMinerObject(miner common.Address, object *validatorv1.MinerObject) (err error) {
k := crypto.Keccak256(miner.Bytes()) k := crypto.Keccak256(miner.Bytes())
v, err := proto.Marshal(object) v, err := proto.Marshal(object)
if err != nil { if err != nil {
...@@ -77,7 +77,7 @@ func (s *StateDB) Commit() (root common.Hash, err error) { ...@@ -77,7 +77,7 @@ func (s *StateDB) Commit() (root common.Hash, err error) {
return root, err return root, err
} }
func (s *StateDB) IterAllObject() (objects []*witnessv1.MinerObject) { func (s *StateDB) IterAllObject() (objects []*validatorv1.MinerObject) {
iter, err := s.trie.NodeIterator(nil) iter, err := s.trie.NodeIterator(nil)
if err != nil { if err != nil {
return return
...@@ -87,7 +87,7 @@ func (s *StateDB) IterAllObject() (objects []*witnessv1.MinerObject) { ...@@ -87,7 +87,7 @@ func (s *StateDB) IterAllObject() (objects []*witnessv1.MinerObject) {
continue continue
} }
v := iter.LeafBlob() v := iter.LeafBlob()
object := &witnessv1.MinerObject{} object := &validatorv1.MinerObject{}
err := proto.Unmarshal(v, object) err := proto.Unmarshal(v, object)
if err != nil { if err != nil {
continue continue
......
...@@ -6,18 +6,18 @@ import ( ...@@ -6,18 +6,18 @@ import (
"math/big" "math/big"
"sort" "sort"
"time" "time"
"witness/tree" "validator/tree"
"witness/util" "validator/util"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
witnessv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/witness/v1" validatorv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/validator/v1"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/errors"
) )
// CommitMST commit workload of per day // CommitMST commit workload of per day
func (w *Witness) CommitMST(proofMap map[common.Address]*witnessv1.ValidatedProof) (root common.Hash, sum *big.Int, err error) { func (v *Validator) CommitMST(proofMap map[common.Address]*validatorv1.ValidatedProof) (root common.Hash, sum *big.Int, err error) {
if len(proofMap) == 0 { if len(proofMap) == 0 {
return common.Hash{}, big.NewInt(0), nil return common.Hash{}, big.NewInt(0), nil
} }
...@@ -43,22 +43,22 @@ func (w *Witness) CommitMST(proofMap map[common.Address]*witnessv1.ValidatedProo ...@@ -43,22 +43,22 @@ func (w *Witness) CommitMST(proofMap map[common.Address]*witnessv1.ValidatedProo
rootNode := mstTree.GetRoot() rootNode := mstTree.GetRoot()
err = w.lvdb.Put([]byte(fmt.Sprintf("mstroot:%s", w.date)), root.Bytes()) err = v.lvdb.Put([]byte(fmt.Sprintf("mstroot:%s", v.date)), root.Bytes())
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
} }
err = w.lvdb.Put([]byte(fmt.Sprintf("mstsum:%s", w.date)), sum.Bytes()) err = v.lvdb.Put([]byte(fmt.Sprintf("mstsum:%s", v.date)), sum.Bytes())
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
} }
err = w.lvdb.Put([]byte(fmt.Sprintf("mstk:%s", w.date)), dbKey) err = v.lvdb.Put([]byte(fmt.Sprintf("mstk:%s", v.date)), dbKey)
if err != nil { if err != nil {
return return
} }
err = w.lvdb.Put([]byte(fmt.Sprintf("mstv:%s", w.date)), dbVal) err = v.lvdb.Put([]byte(fmt.Sprintf("mstv:%s", v.date)), dbVal)
if err != nil { if err != nil {
return return
} }
...@@ -72,7 +72,7 @@ func (w *Witness) CommitMST(proofMap map[common.Address]*witnessv1.ValidatedProo ...@@ -72,7 +72,7 @@ func (w *Witness) CommitMST(proofMap map[common.Address]*witnessv1.ValidatedProo
} }
// CommitMT commit all workload // CommitMT commit all workload
func (w *Witness) CommitMT(objects []*witnessv1.MinerObject) (root common.Hash, err error) { func (v *Validator) CommitMT(objects []*validatorv1.MinerObject) (root common.Hash, err error) {
if len(objects) == 0 { if len(objects) == 0 {
return common.Hash{}, nil return common.Hash{}, nil
} }
...@@ -93,24 +93,24 @@ func (w *Witness) CommitMT(objects []*witnessv1.MinerObject) (root common.Hash, ...@@ -93,24 +93,24 @@ func (w *Witness) CommitMT(objects []*witnessv1.MinerObject) (root common.Hash,
root = mtTree.GetRoot() root = mtTree.GetRoot()
st := time.Now() st := time.Now()
err = w.lvdb.Put([]byte(fmt.Sprintf("mtroot:%s", w.date)), root.Bytes()) err = v.lvdb.Put([]byte(fmt.Sprintf("mtroot:%s", v.date)), root.Bytes())
if err != nil { if err != nil {
return return
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"k": fmt.Sprintf("mtroot:%s", w.date), "k": fmt.Sprintf("mtroot:%s", v.date),
"v": root.String(), "v": root.String(),
}).Debug() }).Debug()
err = w.lvdb.Put([]byte(fmt.Sprintf("mtk:%s", w.date)), dbProofs) err = v.lvdb.Put([]byte(fmt.Sprintf("mtk:%s", v.date)), dbProofs)
if err != nil { if err != nil {
return return
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"k": fmt.Sprintf("mtk:%s", w.date), "k": fmt.Sprintf("mtk:%s", v.date),
"v_length": len(dbProofs), "v_length": len(dbProofs),
}).Debug() }).Debug()
w.mtTreeCache[w.date] = mtTree v.mtTreeCache[v.date] = mtTree
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"root": root.Hex(), "root": root.Hex(),
...@@ -120,12 +120,12 @@ func (w *Witness) CommitMT(objects []*witnessv1.MinerObject) (root common.Hash, ...@@ -120,12 +120,12 @@ func (w *Witness) CommitMT(objects []*witnessv1.MinerObject) (root common.Hash,
return return
} }
func (w *Witness) LoadMerkleTree(date string) (ok bool) { func (v *Validator) LoadMerkleTree(date string) (ok bool) {
if date == "" { if date == "" {
return false return false
} }
merkleTreeKey := fmt.Sprintf("mtk:%s", date) merkleTreeKey := fmt.Sprintf("mtk:%s", date)
data, err := w.lvdb.Get([]byte(merkleTreeKey)) data, err := v.lvdb.Get([]byte(merkleTreeKey))
if err != nil { if err != nil {
if err == errors.ErrNotFound { if err == errors.ErrNotFound {
return return
...@@ -149,19 +149,19 @@ func (w *Witness) LoadMerkleTree(date string) (ok bool) { ...@@ -149,19 +149,19 @@ func (w *Witness) LoadMerkleTree(date string) (ok bool) {
log.WithError(err).Error("failed to load merkle proof") log.WithError(err).Error("failed to load merkle proof")
return return
} }
w.Lock() v.Lock()
w.mtTreeCache[date] = mTree v.mtTreeCache[date] = mTree
w.Unlock() v.Unlock()
log.WithFields(log.Fields{"date": date, "root": mTree.GetRoot().Hex()}).Info("load merkle tree") log.WithFields(log.Fields{"date": date, "root": mTree.GetRoot().Hex()}).Info("load merkle tree")
return true return true
} }
func (w *Witness) LoadMerkleSumTree(date string) (ok bool) { func (v *Validator) LoadMerkleSumTree(date string) (ok bool) {
if date == "" { if date == "" {
return false return false
} }
merkleSumTreeKey := fmt.Sprintf("mstk:%s", date) merkleSumTreeKey := fmt.Sprintf("mstk:%s", date)
keyData, err := w.lvdb.Get([]byte(merkleSumTreeKey)) keyData, err := v.lvdb.Get([]byte(merkleSumTreeKey))
if err != nil { if err != nil {
if err == errors.ErrNotFound { if err == errors.ErrNotFound {
return return
...@@ -181,7 +181,7 @@ func (w *Witness) LoadMerkleSumTree(date string) (ok bool) { ...@@ -181,7 +181,7 @@ func (w *Witness) LoadMerkleSumTree(date string) (ok bool) {
} }
merkleSumTreeVal := fmt.Sprintf("mstv:%s", date) merkleSumTreeVal := fmt.Sprintf("mstv:%s", date)
valData, err := w.lvdb.Get([]byte(merkleSumTreeVal)) valData, err := v.lvdb.Get([]byte(merkleSumTreeVal))
if err != nil { if err != nil {
if err == errors.ErrNotFound { if err == errors.ErrNotFound {
return return
...@@ -202,9 +202,9 @@ func (w *Witness) LoadMerkleSumTree(date string) (ok bool) { ...@@ -202,9 +202,9 @@ func (w *Witness) LoadMerkleSumTree(date string) (ok bool) {
} }
mstTree := tree.NewMerkleSumTree(datas, bigVals) mstTree := tree.NewMerkleSumTree(datas, bigVals)
w.Lock() v.Lock()
w.mstTreeCache[date] = mstTree v.mstTreeCache[date] = mstTree
w.Unlock() v.Unlock()
log.WithFields(log.Fields{"date": date, "root": mstTree.GetRoot()}).Info("load merkle sum tree") log.WithFields(log.Fields{"date": date, "root": mstTree.GetRoot()}).Info("load merkle sum tree")
return true return true
} }
...@@ -6,23 +6,23 @@ import ( ...@@ -6,23 +6,23 @@ import (
"math/rand" "math/rand"
"sync" "sync"
"time" "time"
"witness/conf" "validator/conf"
"witness/quest" "validator/quest"
"witness/tree" "validator/tree"
"witness/util" "validator/util"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethdb/leveldb" "github.com/ethereum/go-ethereum/ethdb/leveldb"
"github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/trie"
witnessv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/witness/v1" validatorv1 "github.com/odysseus/odysseus-protocol/gen/proto/go/validator/v1"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
type Witness struct { type Validator struct {
lvdb *leveldb.Database lvdb *leveldb.Database
db *trie.Database db *trie.Database
state *StateDB state *StateDB
pendingProof map[int64]map[common.Address]*witnessv1.ValidatedProof pendingProof map[int64]map[common.Address]*validatorv1.ValidatedProof
pendingWorkload uint64 pendingWorkload uint64
mtTreeCache map[string]*tree.MerkleTree mtTreeCache map[string]*tree.MerkleTree
mstTreeCache map[string]*tree.MerkleSumTree mstTreeCache map[string]*tree.MerkleSumTree
...@@ -56,8 +56,8 @@ func getDBLastDayRoot(diskDB *leveldb.Database) (lastDay string, stateRoot commo ...@@ -56,8 +56,8 @@ func getDBLastDayRoot(diskDB *leveldb.Database) (lastDay string, stateRoot commo
return lastDay, stateRoot return lastDay, stateRoot
} }
func RunWitness(q *quest.Quest, cfg *conf.Config) *Witness { func RunValidator(q *quest.Quest, cfg *conf.Config) *Validator {
_rpc := newChain(cfg.ChainRPC, cfg.PrivateKey, cfg.StoreContract, cfg.WitnessContract) _rpc := newChain(cfg.ChainRPC, cfg.PrivateKey, cfg.StoreContract, cfg.ValidatorContract)
diskDB, err := leveldb.New(fmt.Sprintf("%s/db", cfg.DataDir), 128, 1024, "", false) diskDB, err := leveldb.New(fmt.Sprintf("%s/db", cfg.DataDir), 128, 1024, "", false)
if err != nil { if err != nil {
panic(err) panic(err)
...@@ -68,10 +68,10 @@ func RunWitness(q *quest.Quest, cfg *conf.Config) *Witness { ...@@ -68,10 +68,10 @@ func RunWitness(q *quest.Quest, cfg *conf.Config) *Witness {
if err != nil { if err != nil {
panic(err) panic(err)
} }
w := &Witness{ v := &Validator{
lvdb: diskDB, lvdb: diskDB,
state: stateDB, state: stateDB,
pendingProof: make(map[int64]map[common.Address]*witnessv1.ValidatedProof), pendingProof: make(map[int64]map[common.Address]*validatorv1.ValidatedProof),
mtTreeCache: make(map[string]*tree.MerkleTree), mtTreeCache: make(map[string]*tree.MerkleTree),
mstTreeCache: make(map[string]*tree.MerkleSumTree), mstTreeCache: make(map[string]*tree.MerkleSumTree),
rpc: _rpc, rpc: _rpc,
...@@ -79,68 +79,68 @@ func RunWitness(q *quest.Quest, cfg *conf.Config) *Witness { ...@@ -79,68 +79,68 @@ func RunWitness(q *quest.Quest, cfg *conf.Config) *Witness {
cfg: cfg, cfg: cfg,
q: q, q: q,
} }
w.LoadMerkleTree(lastDay) v.LoadMerkleTree(lastDay)
w.LoadMerkleSumTree(lastDay) v.LoadMerkleSumTree(lastDay)
go w.UpdateContractAddressJob() go v.UpdateContractAddressJob()
go w.UpdateGlobalWorkloadJob() go v.UpdateGlobalWorkloadJob()
<-time.After(time.Second * 3) <-time.After(time.Second * 3)
go w.Ticker() go v.Ticker()
// go w.Mock() // go v.Mock()
// go w.ProcessDay() // go v.ProcessDay()
return w return v
} }
func (w *Witness) AddPendingProof(miner common.Address, proof *witnessv1.ValidatedProof) { func (v *Validator) AddPendingProof(miner common.Address, proof *validatorv1.ValidatedProof) {
w.Lock() v.Lock()
defer w.Unlock() defer v.Unlock()
var userTodayWorkload uint64 var userTodayWorkload uint64
currentPendingProof, ok := w.pendingProof[w.todayTimestamp()][miner] currentPendingProof, ok := v.pendingProof[v.todayTimestamp()][miner]
if ok { if ok {
userTodayWorkload = currentPendingProof.Workload userTodayWorkload = currentPendingProof.Workload
} }
if w.pendingProof[w.todayTimestamp()] == nil { if v.pendingProof[v.todayTimestamp()] == nil {
w.pendingProof[w.todayTimestamp()] = make(map[common.Address]*witnessv1.ValidatedProof) v.pendingProof[v.todayTimestamp()] = make(map[common.Address]*validatorv1.ValidatedProof)
} }
w.pendingProof[w.todayTimestamp()][miner] = &witnessv1.ValidatedProof{Workload: userTodayWorkload + proof.Workload} v.pendingProof[v.todayTimestamp()][miner] = &validatorv1.ValidatedProof{Workload: userTodayWorkload + proof.Workload}
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"miner": miner.Hex(), "miner": miner.Hex(),
"current_workload": userTodayWorkload + proof.Workload, "current_workload": userTodayWorkload + proof.Workload,
"workload": proof.Workload, "workload": proof.Workload,
"global_workload": w.pendingWorkload, "global_workload": v.pendingWorkload,
}).Debug("add validated proof") }).Debug("add validated proof")
} }
func (w *Witness) ProcessDayJob() { func (v *Validator) ProcessDayJob() {
log.Debugln("process day job", w.yesterdayTimestamp(), w.todayTimestamp()) log.Debugln("process day job", v.yesterdayTimestamp(), v.todayTimestamp())
w.LoadPendingProofs(w.yesterdayTimestamp(), w.todayTimestamp()) v.LoadPendingProofs(v.yesterdayTimestamp(), v.todayTimestamp())
w.date = w.yesterdayString() v.date = v.yesterdayString()
dayProof := w.Commit() dayProof := v.Commit()
mstRoot, _, err := w.CommitMST(dayProof) mstRoot, _, err := v.CommitMST(dayProof)
if err != nil { if err != nil {
log.WithError(err).Error("failed to commit merkle sum tree") log.WithError(err).Error("failed to commit merkle sum tree")
return return
} }
objects := w.state.IterAllObject() objects := v.state.IterAllObject()
mtRoot, err := w.CommitMT(objects) mtRoot, err := v.CommitMT(objects)
if err != nil { if err != nil {
log.WithError(err).Error("failed to commit merkle tree") log.WithError(err).Error("failed to commit merkle tree")
return return
} }
err = w.lvdb.Put([]byte("lastday"), []byte(w.date)) err = v.lvdb.Put([]byte("lastday"), []byte(v.date))
if err != nil { if err != nil {
log.WithError(err).Error("db failed to update last day") log.WithError(err).Error("db failed to update last day")
return return
} }
txHash, err := w.rpc.SubmitProofs(w.date, mstRoot, mtRoot) txHash, err := v.rpc.SubmitProofs(v.dateToTimestamp(v.date), mstRoot, mtRoot)
if err != nil { if err != nil {
log.WithError(err).Error("submit proofs") log.WithError(err).Error("submit proofs")
return return
} }
err = w.lvdb.Put([]byte(fmt.Sprintf("txid:%s", w.date)), txHash.Bytes()) err = v.lvdb.Put([]byte(fmt.Sprintf("txid:%s", v.date)), txHash.Bytes())
if err != nil { if err != nil {
log.WithError(err).Error("db failed to save txid") log.WithError(err).Error("db failed to save txid")
return return
...@@ -149,10 +149,10 @@ func (w *Witness) ProcessDayJob() { ...@@ -149,10 +149,10 @@ func (w *Witness) ProcessDayJob() {
log.Info("process day done") log.Info("process day done")
} }
func (w *Witness) Commit() (dayProofs map[common.Address]*witnessv1.ValidatedProof) { func (v *Validator) Commit() (dayProofs map[common.Address]*validatorv1.ValidatedProof) {
st := time.Now() st := time.Now()
proof, totalWorkload := w.RefreshPendingProof() proof, totalWorkload := v.RefreshPendingProof()
balancePerWorkload, err := w.rpc.GetWorkloadThreshold(totalWorkload) balancePerWorkload, err := v.rpc.GetWorkloadThreshold(totalWorkload)
if err != nil { if err != nil {
log.WithError(err).Error("failed to get workload threshold") log.WithError(err).Error("failed to get workload threshold")
return return
...@@ -161,18 +161,18 @@ func (w *Witness) Commit() (dayProofs map[common.Address]*witnessv1.ValidatedPro ...@@ -161,18 +161,18 @@ func (w *Witness) Commit() (dayProofs map[common.Address]*witnessv1.ValidatedPro
for miner, proof := range proof { for miner, proof := range proof {
balance := big.NewInt(0).Mul(balancePerWorkload, big.NewInt(int64(proof.Workload))) balance := big.NewInt(0).Mul(balancePerWorkload, big.NewInt(int64(proof.Workload)))
proof.Balance = balance.String() proof.Balance = balance.String()
err := w.SealProof(miner, proof) err := v.SealProof(miner, proof)
if err != nil { if err != nil {
log.WithError(err).Error("failed to seal proof") log.WithError(err).Error("failed to seal proof")
return return
} }
} }
root, err := w.state.Commit() root, err := v.state.Commit()
if err != nil { if err != nil {
return return
} }
log.WithFields(log.Fields{"root": root.Hex(), "cost": time.Since(st).String()}).Info("commit state root") log.WithFields(log.Fields{"root": root.Hex(), "cost": time.Since(st).String()}).Info("commit state root")
err = w.lvdb.Put([]byte(fmt.Sprintf("sroot:%s", w.date)), root.Bytes()) err = v.lvdb.Put([]byte(fmt.Sprintf("sroot:%s", v.date)), root.Bytes())
if err != nil { if err != nil {
log.WithError(err).Error("failed to update state root") log.WithError(err).Error("failed to update state root")
return return
...@@ -180,11 +180,11 @@ func (w *Witness) Commit() (dayProofs map[common.Address]*witnessv1.ValidatedPro ...@@ -180,11 +180,11 @@ func (w *Witness) Commit() (dayProofs map[common.Address]*witnessv1.ValidatedPro
return proof return proof
} }
func (w *Witness) SealProof(miner common.Address, proof *witnessv1.ValidatedProof) (err error) { func (v *Validator) SealProof(miner common.Address, proof *validatorv1.ValidatedProof) (err error) {
minerObject := w.state.GetMinerObject(miner) minerObject := v.state.GetMinerObject(miner)
oldBalance := minerObject.Balance oldBalance := minerObject.Balance
minerObject.Balance = util.MustAddStringToBigInt(oldBalance, proof.Balance).String() minerObject.Balance = util.MustAddStringToBigInt(oldBalance, proof.Balance).String()
err = w.state.UpdateMinerObject(miner, minerObject) err = v.state.UpdateMinerObject(miner, minerObject)
if err != nil { if err != nil {
return err return err
} }
...@@ -196,12 +196,12 @@ func (w *Witness) SealProof(miner common.Address, proof *witnessv1.ValidatedProo ...@@ -196,12 +196,12 @@ func (w *Witness) SealProof(miner common.Address, proof *witnessv1.ValidatedProo
return err return err
} }
func (w *Witness) RefreshPendingProof() (proof map[common.Address]*witnessv1.ValidatedProof, totalWorkload uint64) { func (v *Validator) RefreshPendingProof() (proof map[common.Address]*validatorv1.ValidatedProof, totalWorkload uint64) {
w.Lock() v.Lock()
defer w.Unlock() defer v.Unlock()
proof = make(map[common.Address]*witnessv1.ValidatedProof) proof = make(map[common.Address]*validatorv1.ValidatedProof)
for timestamp, pendingProofMap := range w.pendingProof { for timestamp, pendingProofMap := range v.pendingProof {
if timestamp != w.todayTimestamp() { if timestamp != v.todayTimestamp() {
continue continue
} }
for miner, pendingProof := range pendingProofMap { for miner, pendingProof := range pendingProofMap {
...@@ -209,27 +209,27 @@ func (w *Witness) RefreshPendingProof() (proof map[common.Address]*witnessv1.Val ...@@ -209,27 +209,27 @@ func (w *Witness) RefreshPendingProof() (proof map[common.Address]*witnessv1.Val
totalWorkload += pendingProof.Workload totalWorkload += pendingProof.Workload
} }
} }
w.pendingProof[w.yesterdayTimestamp()] = make(map[common.Address]*witnessv1.ValidatedProof) v.pendingProof[v.yesterdayTimestamp()] = make(map[common.Address]*validatorv1.ValidatedProof)
return return
} }
func (w *Witness) Ticker() { func (v *Validator) Ticker() {
executionTime := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, w.cfg.CommitTime, 0, time.UTC).Add(w.duration()) executionTime := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, v.cfg.CommitTime, 0, time.UTC).Add(v.duration())
// executionTime := time.Now().Add(w.duration()) // executionTime := time.Now().Add(v.duration())
waitTime := executionTime.Sub(time.Now()) waitTime := executionTime.Sub(time.Now())
timer := time.NewTimer(waitTime) timer := time.NewTimer(waitTime)
log.WithField("wait_time", waitTime.String()).Info("prepare commit task") log.WithField("wait_time", waitTime.String()).Info("prepare commit task")
for { for {
<-timer.C <-timer.C
w.ProcessDayJob() v.ProcessDayJob()
executionTime = executionTime.Add(w.duration()) executionTime = executionTime.Add(v.duration())
waitTime = executionTime.Sub(time.Now()) waitTime = executionTime.Sub(time.Now())
timer.Reset(waitTime) timer.Reset(waitTime)
log.WithField("wait time", waitTime.String()).Info("prepare commit task") log.WithField("wait time", waitTime.String()).Info("prepare commit task")
} }
} }
func (w *Witness) Mock() { func (v *Validator) Mock() {
addresses := make([]common.Address, 10) addresses := make([]common.Address, 10)
rand.Seed(time.Now().Unix()) rand.Seed(time.Now().Unix())
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
...@@ -240,15 +240,15 @@ func (w *Witness) Mock() { ...@@ -240,15 +240,15 @@ func (w *Witness) Mock() {
for { for {
time.Sleep(time.Second) time.Sleep(time.Second)
w.AddPendingProof(addresses[rand.Intn(10)], &witnessv1.ValidatedProof{ v.AddPendingProof(addresses[rand.Intn(10)], &validatorv1.ValidatedProof{
Workload: uint64((rand.Int63n(9) + 1) * 100), Workload: uint64((rand.Int63n(9) + 1) * 100),
Timestamp: uint64(time.Now().Unix() - 1), Timestamp: uint64(time.Now().Unix() - 1),
}) })
} }
} }
func (w *Witness) IsContainerAddress(address common.Address) bool { func (v *Validator) IsContainerAddress(address common.Address) bool {
for _, addr := range w.containerAddresses { for _, addr := range v.containerAddresses {
if addr.Hex() == address.Hex() { if addr.Hex() == address.Hex() {
return true return true
} }
...@@ -256,8 +256,8 @@ func (w *Witness) IsContainerAddress(address common.Address) bool { ...@@ -256,8 +256,8 @@ func (w *Witness) IsContainerAddress(address common.Address) bool {
return false return false
} }
func (w *Witness) IsNMAddress(address common.Address) bool { func (v *Validator) IsNMAddress(address common.Address) bool {
for _, addr := range w.nmAddresses { for _, addr := range v.nmAddresses {
if addr.Hex() == address.Hex() { if addr.Hex() == address.Hex() {
return true return true
} }
...@@ -265,30 +265,30 @@ func (w *Witness) IsNMAddress(address common.Address) bool { ...@@ -265,30 +265,30 @@ func (w *Witness) IsNMAddress(address common.Address) bool {
return false return false
} }
func (w *Witness) todayString() string { func (v *Validator) todayString() string {
return time.Unix(w.todayTimestamp(), 0).Format("2006-01-02") return time.Unix(v.todayTimestamp(), 0).Format("2006-01-02")
} }
func (w *Witness) yesterdayString() string { func (v *Validator) yesterdayString() string {
return time.Unix(w.yesterdayTimestamp(), 0).Format("2006-01-02") return time.Unix(v.yesterdayTimestamp(), 0).Format("2006-01-02")
} }
func (w *Witness) todayTimestamp() int64 { func (v *Validator) todayTimestamp() int64 {
now := time.Now().UTC() now := time.Now().UTC()
// today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC) // today := time.Date(nov.Year(), nov.Month(), nov.Day(), 0, 0, 0, 0, time.UTC)
today := time.Date(now.Year(), now.Month(), 6, 0, 0, 0, 0, time.UTC) today := time.Date(now.Year(), now.Month(), 6, 0, 0, 0, 0, time.UTC)
return today.Unix() return today.Unix()
} }
func (w *Witness) yesterdayTimestamp() int64 { func (v *Validator) yesterdayTimestamp() int64 {
return w.todayTimestamp() - 86400 return v.todayTimestamp() - 86400
} }
func (w *Witness) dateToTimestamp(date string) int64 { func (v *Validator) dateToTimestamp(date string) int64 {
t, _ := time.ParseInLocation("2006-01-02", date, time.UTC) t, _ := time.ParseInLocation("2006-01-02", date, time.UTC)
return t.Unix() return t.Unix()
} }
func (w *Witness) duration() time.Duration { func (v *Validator) duration() time.Duration {
return 3600 * 24 * time.Second return 3600 * 24 * time.Second
} }
module witness module validator
go 1.21 go 1.21
......
...@@ -2,7 +2,7 @@ package quest ...@@ -2,7 +2,7 @@ package quest
import ( import (
"fmt" "fmt"
"witness/conf" "validator/conf"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"gorm.io/driver/postgres" "gorm.io/driver/postgres"
......
...@@ -2,7 +2,7 @@ package quest ...@@ -2,7 +2,7 @@ package quest
import ( import (
"math/big" "math/big"
"witness/util" "validator/util"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
......
# witness # Validator for AIGIC
## leveldb kv
merkle sum tree: merkle sum tree:
...@@ -15,7 +14,6 @@ merkle sum tree: ...@@ -15,7 +14,6 @@ merkle sum tree:
mstv:2020-01-01 -> val1:val2 mstv:2020-01-01 -> val1:val2
merkle tree: merkle tree:
mtroot:2020-01-01 -> root mtroot:2020-01-01 -> root
......
...@@ -9,7 +9,7 @@ var ( ...@@ -9,7 +9,7 @@ var (
) )
var mistGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{ var mistGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "witness_version_gauge", Name: "validator_version_gauge",
}, []string{"gitHash", "gitBranch", "buildTime", "goVersion", "version"}) }, []string{"gitHash", "gitBranch", "buildTime", "goVersion", "version"})
func init() { func init() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment