Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
validator
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Odysseus
validator
Commits
6ed000d0
Commit
6ed000d0
authored
Mar 13, 2024
by
贾浩@五瓣科技
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rename: witness -> validator
parent
82884287
Changes
19
Show whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
1929 additions
and
213 deletions
+1929
-213
Makefile
Makefile
+8
-8
rpc.go
api/rpc.go
+8
-8
flags.go
cmd/validator/flags.go
+2
-2
main.go
cmd/validator/main.go
+11
-11
config.go
conf/config.go
+1
-1
config.toml
config.toml
+1
-1
validator.go
contract/validator.go
+1718
-0
chain.go
core/chain.go
+11
-11
interface.go
core/interface.go
+35
-35
job.go
core/job.go
+10
-10
quest.go
core/quest.go
+12
-12
statedb.go
core/statedb.go
+6
-6
tree.go
core/tree.go
+25
-25
witness.go
core/witness.go
+75
-75
go.mod
go.mod
+1
-1
db.go
quest/db.go
+1
-1
proof.go
quest/proof.go
+1
-1
readme.md
readme.md
+2
-4
version.go
version/version.go
+1
-1
No files found.
Makefile
View file @
6ed000d0
...
@@ -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
:
...
...
api/rpc.go
View file @
6ed000d0
...
@@ -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
)
...
...
cmd/
witness
/flags.go
→
cmd/
validator
/flags.go
View file @
6ed000d0
...
@@ -62,8 +62,8 @@ var (
...
@@ -62,8 +62,8 @@ var (
Usage
:
"The address of the store contract"
,
Usage
:
"The address of the store contract"
,
}
}
witness
ContractFlag
=
&
cli
.
StringFlag
{
validator
ContractFlag
=
&
cli
.
StringFlag
{
Name
:
"
witness
-contract"
,
Name
:
"
validator
-contract"
,
Usage
:
"The address of the reward contract"
,
Usage
:
"The address of the reward contract"
,
}
}
...
...
cmd/
witness
/main.go
→
cmd/
validator
/main.go
View file @
6ed000d0
...
@@ -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
,
witness
ContractFlag
,
validator
ContractFlag
,
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
(
witness
ContractFlag
.
Name
),
ValidatorContract
:
ctx
.
String
(
validator
ContractFlag
.
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
.
Run
Witness
(
q
,
cfg
)
w
:=
core
.
Run
Validator
(
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
)
}
}
conf/config.go
View file @
6ed000d0
...
@@ -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
...
...
config.toml
View file @
6ed000d0
...
@@ -12,7 +12,7 @@ private-key = "529f4efb80ac534f17d873104c71881c0970dbd5a886f183f63c5c6bb7a1fcd9"
...
@@ -12,7 +12,7 @@ private-key = "529f4efb80ac534f17d873104c71881c0970dbd5a886f183f63c5c6bb7a1fcd9"
store-contract
=
"0x7Cd36Bc2a477f60A14f08442179B2f626bE026Ea"
store-contract
=
"0x7Cd36Bc2a477f60A14f08442179B2f626bE026Ea"
witness-contract
=
"0x
f49133dD7B7ed75fA0f877413D293c05Bff0D8F0
"
witness-contract
=
"0x
60376A7A4F5013CCca347A9B320D0b8dD57D87F4
"
commit-time
=
3600
# utc + n seconds
commit-time
=
3600
# utc + n seconds
...
...
contract/
witness
.go
→
contract/
validator
.go
View file @
6ed000d0
This source diff could not be displayed because it is too large. You can
view the blob
instead.
core/chain.go
View file @
6ed000d0
...
@@ -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
,
witness
Ca
string
)
*
ChainRPC
{
func
newChain
(
rpc
,
privateKey
,
storageCa
,
validator
Ca
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
(
witness
Ca
),
ethRpc
)
validator
,
err
:=
contract
.
NewValidator
(
common
.
HexToAddress
(
validator
Ca
),
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
(
date
Timestamp
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
...
...
core/interface.go
View file @
6ed000d0
...
@@ -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
()
{
...
...
core/job.go
View file @
6ed000d0
...
@@ -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
}
}
...
...
core/quest.go
View file @
6ed000d0
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
*
witness
v1
.
ValidatedProof
)
{
func
(
v
*
Validator
)
verifyProof
(
dbProof
*
quest
.
ProofModel
)
(
miner
common
.
Address
,
proof
*
validator
v1
.
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
=
&
witness
v1
.
ValidatedProof
{
proof
=
&
validator
v1
.
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
...
...
core/statedb.go
View file @
6ed000d0
...
@@ -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
*
witness
v1
.
MinerObject
)
{
func
(
s
*
StateDB
)
GetMinerObject
(
miner
common
.
Address
)
(
object
*
validator
v1
.
MinerObject
)
{
object
=
&
witness
v1
.
MinerObject
{}
object
=
&
validator
v1
.
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
*
witness
v1
.
MinerObject
)
(
err
error
)
{
func
(
s
*
StateDB
)
UpdateMinerObject
(
miner
common
.
Address
,
object
*
validator
v1
.
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
[]
*
witness
v1
.
MinerObject
)
{
func
(
s
*
StateDB
)
IterAllObject
()
(
objects
[]
*
validator
v1
.
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
:=
&
witness
v1
.
MinerObject
{}
object
:=
&
validator
v1
.
MinerObject
{}
err
:=
proto
.
Unmarshal
(
v
,
object
)
err
:=
proto
.
Unmarshal
(
v
,
object
)
if
err
!=
nil
{
if
err
!=
nil
{
continue
continue
...
...
core/tree.go
View file @
6ed000d0
...
@@ -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
]
*
witness
v1
.
ValidatedProof
)
(
root
common
.
Hash
,
sum
*
big
.
Int
,
err
error
)
{
func
(
v
*
Validator
)
CommitMST
(
proofMap
map
[
common
.
Address
]
*
validator
v1
.
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
[]
*
witness
v1
.
MinerObject
)
(
root
common
.
Hash
,
err
error
)
{
func
(
v
*
Validator
)
CommitMT
(
objects
[]
*
validator
v1
.
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
}
}
core/witness.go
View file @
6ed000d0
...
@@ -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
]
*
witness
v1
.
ValidatedProof
pendingProof
map
[
int64
]
map
[
common
.
Address
]
*
validator
v1
.
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
Run
Witness
(
q
*
quest
.
Quest
,
cfg
*
conf
.
Config
)
*
Witness
{
func
Run
Validator
(
q
*
quest
.
Quest
,
cfg
*
conf
.
Config
)
*
Validator
{
_rpc
:=
newChain
(
cfg
.
ChainRPC
,
cfg
.
PrivateKey
,
cfg
.
StoreContract
,
cfg
.
Witness
Contract
)
_rpc
:=
newChain
(
cfg
.
ChainRPC
,
cfg
.
PrivateKey
,
cfg
.
StoreContract
,
cfg
.
Validator
Contract
)
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
]
*
witness
v1
.
ValidatedProof
),
pendingProof
:
make
(
map
[
int64
]
map
[
common
.
Address
]
*
validator
v1
.
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
*
witness
v1
.
ValidatedProof
)
{
func
(
v
*
Validator
)
AddPendingProof
(
miner
common
.
Address
,
proof
*
validator
v1
.
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
]
*
witness
v1
.
ValidatedProof
)
v
.
pendingProof
[
v
.
todayTimestamp
()]
=
make
(
map
[
common
.
Address
]
*
validator
v1
.
ValidatedProof
)
}
}
w
.
pendingProof
[
w
.
todayTimestamp
()][
miner
]
=
&
witness
v1
.
ValidatedProof
{
Workload
:
userTodayWorkload
+
proof
.
Workload
}
v
.
pendingProof
[
v
.
todayTimestamp
()][
miner
]
=
&
validator
v1
.
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
]
*
witness
v1
.
ValidatedProof
)
{
func
(
v
*
Validator
)
Commit
()
(
dayProofs
map
[
common
.
Address
]
*
validator
v1
.
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
*
witness
v1
.
ValidatedProof
)
(
err
error
)
{
func
(
v
*
Validator
)
SealProof
(
miner
common
.
Address
,
proof
*
validator
v1
.
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
]
*
witness
v1
.
ValidatedProof
,
totalWorkload
uint64
)
{
func
(
v
*
Validator
)
RefreshPendingProof
()
(
proof
map
[
common
.
Address
]
*
validator
v1
.
ValidatedProof
,
totalWorkload
uint64
)
{
w
.
Lock
()
v
.
Lock
()
defer
w
.
Unlock
()
defer
v
.
Unlock
()
proof
=
make
(
map
[
common
.
Address
]
*
witness
v1
.
ValidatedProof
)
proof
=
make
(
map
[
common
.
Address
]
*
validator
v1
.
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
]
*
witness
v1
.
ValidatedProof
)
v
.
pendingProof
[
v
.
yesterdayTimestamp
()]
=
make
(
map
[
common
.
Address
]
*
validator
v1
.
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
)],
&
witness
v1
.
ValidatedProof
{
v
.
AddPendingProof
(
addresses
[
rand
.
Intn
(
10
)],
&
validator
v1
.
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(no
w.Year(), now.Month(), now
.Day(), 0, 0, 0, 0, time.UTC)
// today := time.Date(no
v.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
}
}
go.mod
View file @
6ed000d0
module
witness
module
validator
go 1.21
go 1.21
...
...
quest/db.go
View file @
6ed000d0
...
@@ -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"
...
...
quest/proof.go
View file @
6ed000d0
...
@@ -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"
...
...
readme.md
View file @
6ed000d0
# 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
...
...
version/version.go
View file @
6ed000d0
...
@@ -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
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment