Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
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
link33
plugin
Commits
db10be7e
Commit
db10be7e
authored
Sep 15, 2020
by
madengji
Committed by
vipwzw
Sep 28, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add bind miner query by miner
parent
93df499c
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
181 additions
and
90 deletions
+181
-90
parablssign.go
plugin/consensus/para/parablssign.go
+1
-1
paracross.go
plugin/dapp/paracross/commands/paracross.go
+4
-3
kv.go
plugin/dapp/paracross/executor/kv.go
+2
-2
query.go
plugin/dapp/paracross/executor/query.go
+47
-13
reward.go
plugin/dapp/paracross/executor/reward.go
+56
-63
reward.md
plugin/dapp/paracross/executor/reward.md
+59
-0
reward_test.go
plugin/dapp/paracross/executor/reward_test.go
+6
-6
paracross.proto
plugin/dapp/paracross/proto/paracross.proto
+6
-2
No files found.
plugin/consensus/para/parablssign.go
View file @
db10be7e
...
@@ -26,7 +26,7 @@ const (
...
@@ -26,7 +26,7 @@ const (
maxRcvTxCount
=
100
//channel buffer, max 100 nodes, 1 height tx or 1 txgroup per node
maxRcvTxCount
=
100
//channel buffer, max 100 nodes, 1 height tx or 1 txgroup per node
leaderSyncInt
=
15
//15s heartbeat sync interval
leaderSyncInt
=
15
//15s heartbeat sync interval
defLeaderSwitchInt
=
100
//每隔100个共识高度切换一次leader,大约6小时(按50个空块间隔计算)
defLeaderSwitchInt
=
100
//每隔100个共识高度切换一次leader,大约6小时(按50个空块间隔计算)
delaySubP2pTopic
=
3
0
//30s to sub p2p topic
delaySubP2pTopic
=
1
0
//30s to sub p2p topic
paraBlsSignTopic
=
"PARA-BLS-SIGN-TOPIC"
paraBlsSignTopic
=
"PARA-BLS-SIGN-TOPIC"
)
)
...
...
plugin/dapp/paracross/commands/paracross.go
View file @
db10be7e
...
@@ -581,19 +581,20 @@ func getNodeBindListCmd() *cobra.Command {
...
@@ -581,19 +581,20 @@ func getNodeBindListCmd() *cobra.Command {
func
addNodeBindCmdFlags
(
cmd
*
cobra
.
Command
)
{
func
addNodeBindCmdFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"node"
,
"n"
,
""
,
"super node addr to bind miner"
)
cmd
.
Flags
()
.
StringP
(
"node"
,
"n"
,
""
,
"super node addr to bind miner"
)
cmd
.
MarkFlagRequired
(
"node
"
)
cmd
.
Flags
()
.
StringP
(
"miner"
,
"m"
,
""
,
"bind miner addr
"
)
}
}
func
nodeBindInfo
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
func
nodeBindInfo
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
addr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"node"
)
node
,
_
:=
cmd
.
Flags
()
.
GetString
(
"node"
)
miner
,
_
:=
cmd
.
Flags
()
.
GetString
(
"miner"
)
var
params
rpctypes
.
Query4Jrpc
var
params
rpctypes
.
Query4Jrpc
params
.
Execer
=
pt
.
ParaX
params
.
Execer
=
pt
.
ParaX
params
.
FuncName
=
"GetNodeBindMinerList"
params
.
FuncName
=
"GetNodeBindMinerList"
params
.
Payload
=
types
.
MustPBToJSON
(
&
types
.
ReqString
{
Data
:
add
r
})
params
.
Payload
=
types
.
MustPBToJSON
(
&
pt
.
ParaNodeBindOne
{
SuperNode
:
node
,
Miner
:
mine
r
})
var
res
pt
.
RespParaNodeBindList
var
res
pt
.
RespParaNodeBindList
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"Chain33.Query"
,
params
,
&
res
)
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"Chain33.Query"
,
params
,
&
res
)
...
...
plugin/dapp/paracross/executor/kv.go
View file @
db10be7e
...
@@ -192,6 +192,6 @@ func calcParaBindMinerAddr(node, bind string) []byte {
...
@@ -192,6 +192,6 @@ func calcParaBindMinerAddr(node, bind string) []byte {
return
[]
byte
(
fmt
.
Sprintf
(
paraBindMinderAddr
+
"%s-%s"
,
node
,
bind
))
return
[]
byte
(
fmt
.
Sprintf
(
paraBindMinderAddr
+
"%s-%s"
,
node
,
bind
))
}
}
func
calcParaBindMinerNode
(
node
string
)
[]
byte
{
func
calcParaBindMinerNode
()
[]
byte
{
return
[]
byte
(
paraBindMinderNode
+
node
)
return
[]
byte
(
paraBindMinderNode
)
}
}
plugin/dapp/paracross/executor/query.go
View file @
db10be7e
...
@@ -534,29 +534,63 @@ func (p *Paracross) Query_GetHeight(req *types.ReqString) (*pt.ParacrossConsensu
...
@@ -534,29 +534,63 @@ func (p *Paracross) Query_GetHeight(req *types.ReqString) (*pt.ParacrossConsensu
return
nil
,
types
.
ErrDecode
return
nil
,
types
.
ErrDecode
}
}
func
getMinerListResp
(
db
dbm
.
KV
,
list
*
pt
.
ParaNodeBindList
)
(
types
.
Message
,
error
)
{
var
resp
pt
.
RespParaNodeBindList
resp
.
List
=
list
for
_
,
n
:=
range
list
.
Miners
{
info
,
err
:=
getBindAddrInfo
(
db
,
n
.
SuperNode
,
n
.
Miner
)
if
err
!=
nil
{
clog
.
Error
(
"Query_GetNodeBindMinerList get addr"
,
"err"
,
err
,
"node"
,
n
.
SuperNode
,
"addr"
,
n
.
Miner
)
return
nil
,
errors
.
Cause
(
err
)
}
resp
.
Details
=
append
(
resp
.
Details
,
info
)
}
return
&
resp
,
nil
}
// Query_GetNodeBindMinerList query get super node bind miner list
// Query_GetNodeBindMinerList query get super node bind miner list
func
(
p
*
Paracross
)
Query_GetNodeBindMinerList
(
in
*
types
.
ReqString
)
(
types
.
Message
,
error
)
{
func
(
p
*
Paracross
)
Query_GetNodeBindMinerList
(
in
*
pt
.
ParaNodeBindOne
)
(
types
.
Message
,
error
)
{
if
in
==
nil
||
len
(
in
.
Data
)
==
0
{
if
in
==
nil
{
return
nil
,
types
.
ErrInvalidParam
return
nil
,
types
.
ErrInvalidParam
}
}
list
,
err
:=
getBindNodeInfo
(
p
.
GetStateDB
()
,
in
.
Data
)
list
,
err
:=
getBindNodeInfo
(
p
.
GetStateDB
())
if
err
!=
nil
{
if
err
!=
nil
{
clog
.
Error
(
"Query_GetNodeBindMinerList get node"
,
"err"
,
err
,
"req"
,
in
.
Data
)
clog
.
Error
(
"Query_GetNodeBindMinerList get node"
,
"err"
,
err
)
return
nil
,
errors
.
Cause
(
err
)
return
nil
,
errors
.
Cause
(
err
)
}
}
var
resp
pt
.
RespParaNodeBindList
var
newList
pt
.
ParaNodeBindList
resp
.
List
=
list
//按node query
if
len
(
in
.
SuperNode
)
!=
0
&&
len
(
in
.
Miner
)
==
0
{
for
_
,
n
:=
range
list
.
Miners
{
if
n
.
SuperNode
==
in
.
SuperNode
{
newList
.
Miners
=
append
(
newList
.
Miners
,
n
)
}
}
return
getMinerListResp
(
p
.
GetStateDB
(),
&
newList
)
}
for
_
,
addr
:=
range
list
.
Miners
{
//按miner query
info
,
err
:=
getBindAddrInfo
(
p
.
GetStateDB
(),
in
.
Data
,
addr
)
if
len
(
in
.
SuperNode
)
==
0
&&
len
(
in
.
Miner
)
!=
0
{
if
err
!=
nil
{
for
_
,
n
:=
range
list
.
Miners
{
clog
.
Error
(
"Query_GetNodeBindMinerList get addr"
,
"err"
,
err
,
"node"
,
in
.
Data
,
"addr"
,
addr
)
if
n
.
Miner
==
in
.
Miner
{
return
nil
,
errors
.
Cause
(
err
)
newList
.
Miners
=
append
(
newList
.
Miners
,
n
)
}
}
}
resp
.
Details
=
append
(
resp
.
Details
,
info
)
return
getMinerListResp
(
p
.
GetStateDB
(),
&
newList
)
}
//按唯一绑定查询
if
len
(
in
.
SuperNode
)
!=
0
&&
len
(
in
.
Miner
)
!=
0
{
for
_
,
n
:=
range
list
.
Miners
{
if
n
.
SuperNode
==
in
.
SuperNode
&&
n
.
Miner
==
in
.
Miner
{
newList
.
Miners
=
append
(
newList
.
Miners
,
n
)
}
}
return
getMinerListResp
(
p
.
GetStateDB
(),
&
newList
)
}
}
return
&
resp
,
nil
//获取所有
return
getMinerListResp
(
p
.
GetStateDB
(),
list
)
}
}
plugin/dapp/paracross/executor/reward.go
View file @
db10be7e
...
@@ -8,6 +8,7 @@ import (
...
@@ -8,6 +8,7 @@ import (
dbm
"github.com/33cn/chain33/common/db"
dbm
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/types"
pt
"github.com/33cn/plugin/plugin/dapp/paracross/types"
pt
"github.com/33cn/plugin/plugin/dapp/paracross/types"
"github.com/golang/protobuf/proto"
)
)
const
(
const
(
...
@@ -15,36 +16,28 @@ const (
...
@@ -15,36 +16,28 @@ const (
opUnBind
=
2
opUnBind
=
2
)
)
//根据挖矿节点地址 获取委托挖矿地址
//根据挖矿共识节点地址 过滤整体共识节点映射列表, 获取委托挖矿地址
func
(
a
*
action
)
getBindAddrs
(
nodes
[]
string
,
statusHeight
int64
)
[]
*
pt
.
ParaNodeBindList
{
func
(
a
*
action
)
getBindAddrs
(
nodes
[]
string
,
statusHeight
int64
)
(
*
pt
.
ParaNodeBindList
,
error
)
{
var
lists
[]
*
pt
.
ParaNodeBindList
nodesMap
:=
make
(
map
[
string
]
bool
)
for
_
,
m
:=
range
nodes
{
for
_
,
n
:=
range
nodes
{
list
,
err
:=
getBindNodeInfo
(
a
.
db
,
m
)
nodesMap
[
n
]
=
true
if
isNotFound
(
errors
.
Cause
(
err
))
{
continue
}
if
err
!=
nil
{
clog
.
Error
(
"paracross getBindAddrs err"
,
"height"
,
statusHeight
,
"node"
,
m
)
continue
}
lists
=
append
(
lists
,
list
)
}
}
return
lists
var
newLists
pt
.
ParaNodeBindList
list
,
err
:=
getBindNodeInfo
(
a
.
db
)
}
if
err
!=
nil
{
clog
.
Error
(
"paracross getBindAddrs err"
,
"height"
,
statusHeight
)
func
isBindAddrFound
(
bindAddrs
[]
*
pt
.
ParaNodeBindList
)
bool
{
return
nil
,
err
if
len
(
bindAddrs
)
<=
0
{
return
false
}
}
//这样检索是按照list的映射顺序,不是按照nodes的顺序(需要循环嵌套)
for
_
,
addr
:=
range
bindAdd
rs
{
for
_
,
m
:=
range
list
.
Mine
rs
{
if
len
(
addr
.
Miners
)
>
0
{
if
nodesMap
[
m
.
SuperNode
]
{
return
true
newLists
.
Miners
=
append
(
newLists
.
Miners
,
m
)
}
}
}
}
return
false
return
&
newLists
,
nil
}
}
func
(
a
*
action
)
rewardSuperNode
(
coinReward
int64
,
miners
[]
string
,
statusHeight
int64
)
(
*
types
.
Receipt
,
int64
,
error
)
{
func
(
a
*
action
)
rewardSuperNode
(
coinReward
int64
,
miners
[]
string
,
statusHeight
int64
)
(
*
types
.
Receipt
,
int64
,
error
)
{
...
@@ -70,21 +63,19 @@ func (a *action) rewardSuperNode(coinReward int64, miners []string, statusHeight
...
@@ -70,21 +63,19 @@ func (a *action) rewardSuperNode(coinReward int64, miners []string, statusHeight
}
}
//奖励委托挖矿账户
//奖励委托挖矿账户
func
(
a
*
action
)
rewardBindAddr
(
coinReward
int64
,
bindList
[]
*
pt
.
ParaNodeBindList
,
statusHeight
int64
)
(
*
types
.
Receipt
,
int64
,
error
)
{
func
(
a
*
action
)
rewardBindAddr
(
coinReward
int64
,
bindList
*
pt
.
ParaNodeBindList
,
statusHeight
int64
)
(
*
types
.
Receipt
,
int64
,
error
)
{
if
coinReward
<=
0
{
if
coinReward
<=
0
{
return
nil
,
0
,
nil
return
nil
,
0
,
nil
}
}
//有可能一个bindAddr 在多个node绑定,这里会累计上去
//有可能一个bindAddr 在多个node绑定,这里会累计上去
var
bindAddrList
[]
*
pt
.
ParaBindMinerInfo
var
bindAddrList
[]
*
pt
.
ParaBindMinerInfo
for
_
,
node
:=
range
bindList
{
for
_
,
node
:=
range
bindList
.
Miners
{
for
_
,
miner
:=
range
node
.
Miners
{
info
,
err
:=
getBindAddrInfo
(
a
.
db
,
node
.
SuperNode
,
node
.
Miner
)
info
,
err
:=
getBindAddrInfo
(
a
.
db
,
node
.
SuperNode
,
miner
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
0
,
err
return
nil
,
0
,
err
}
bindAddrList
=
append
(
bindAddrList
,
info
)
}
}
bindAddrList
=
append
(
bindAddrList
,
info
)
}
}
var
totalCoins
int64
var
totalCoins
int64
...
@@ -127,18 +118,21 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
...
@@ -127,18 +118,21 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
}
}
//超级节点地址
//超级节点地址
minerAddrs
:=
getMiner
s
(
stat
.
Details
,
nodeStatus
.
BlockHash
)
nodeAddrs
:=
getSuperNode
s
(
stat
.
Details
,
nodeStatus
.
BlockHash
)
//委托地址
//委托地址
bindAddrs
:=
a
.
getBindAddrs
(
minerAddrs
,
nodeStatus
.
Height
)
bindAddrs
,
err
:=
a
.
getBindAddrs
(
nodeAddrs
,
nodeStatus
.
Height
)
if
err
!=
nil
{
return
nil
,
err
}
//奖励超级节点
//奖励超级节点
minderRewards
:=
coinReward
minderRewards
:=
coinReward
//如果有委托挖矿地址,则超级节点分baseReward部分,否则全部
//如果有委托挖矿地址,则超级节点分baseReward部分,否则全部
if
isBindAddrFound
(
bindAddrs
)
{
if
len
(
bindAddrs
.
Miners
)
>
0
{
minderRewards
=
coinBaseReward
minderRewards
=
coinBaseReward
}
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
r
,
change
,
err
:=
a
.
rewardSuperNode
(
minderRewards
,
miner
Addrs
,
nodeStatus
.
Height
)
r
,
change
,
err
:=
a
.
rewardSuperNode
(
minderRewards
,
node
Addrs
,
nodeStatus
.
Height
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -167,8 +161,8 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
...
@@ -167,8 +161,8 @@ func (a *action) reward(nodeStatus *pt.ParacrossNodeStatus, stat *pt.ParacrossHe
return
receipt
,
nil
return
receipt
,
nil
}
}
// get
Miner
s 获取提交共识消息的矿工地址
// get
SuperNode
s 获取提交共识消息的矿工地址
func
get
Miner
s
(
detail
*
pt
.
ParacrossStatusDetails
,
blockHash
[]
byte
)
[]
string
{
func
get
SuperNode
s
(
detail
*
pt
.
ParacrossStatusDetails
,
blockHash
[]
byte
)
[]
string
{
addrs
:=
make
([]
string
,
0
)
addrs
:=
make
([]
string
,
0
)
for
i
,
hash
:=
range
detail
.
BlockHash
{
for
i
,
hash
:=
range
detail
.
BlockHash
{
if
bytes
.
Equal
(
hash
,
blockHash
)
{
if
bytes
.
Equal
(
hash
,
blockHash
)
{
...
@@ -210,8 +204,8 @@ func makeAddrBindReceipt(node, addr string, prev, current *pt.ParaBindMinerInfo)
...
@@ -210,8 +204,8 @@ func makeAddrBindReceipt(node, addr string, prev, current *pt.ParaBindMinerInfo)
}
}
}
}
func
makeNodeBindReceipt
(
addr
string
,
prev
,
current
*
pt
.
ParaNodeBindList
)
*
types
.
Receipt
{
func
makeNodeBindReceipt
(
prev
,
current
*
pt
.
ParaNodeBindList
)
*
types
.
Receipt
{
key
:=
calcParaBindMinerNode
(
addr
)
key
:=
calcParaBindMinerNode
()
log
:=
&
pt
.
ReceiptParaNodeBindListUpdate
{
log
:=
&
pt
.
ReceiptParaNodeBindListUpdate
{
Prev
:
prev
,
Prev
:
prev
,
Current
:
current
,
Current
:
current
,
...
@@ -233,51 +227,50 @@ func makeNodeBindReceipt(addr string, prev, current *pt.ParaNodeBindList) *types
...
@@ -233,51 +227,50 @@ func makeNodeBindReceipt(addr string, prev, current *pt.ParaNodeBindList) *types
//绑定到超级节点
//绑定到超级节点
func
(
a
*
action
)
bind2Node
(
node
string
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
bind2Node
(
node
string
)
(
*
types
.
Receipt
,
error
)
{
info
,
err
:=
getBindNodeInfo
(
a
.
db
,
node
)
list
,
err
:=
getBindNodeInfo
(
a
.
db
)
if
err
!=
nil
&&
!
isNotFound
(
errors
.
Cause
(
err
))
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"bind2Node"
)
return
nil
,
errors
.
Wrap
(
err
,
"bind2Node"
)
}
}
//found
old
:=
proto
.
Clone
(
list
)
.
(
*
pt
.
ParaNodeBindList
)
if
info
!=
nil
{
list
.
Miners
=
append
(
list
.
Miners
,
&
pt
.
ParaNodeBindOne
{
SuperNode
:
node
,
Miner
:
a
.
fromaddr
})
listCopy
:=
*
info
info
.
Miners
=
append
(
info
.
Miners
,
a
.
fromaddr
)
return
makeNodeBindReceipt
(
old
,
list
),
nil
return
makeNodeBindReceipt
(
node
,
&
listCopy
,
info
),
nil
}
//unfound
var
list
pt
.
ParaNodeBindList
list
.
SuperNode
=
node
list
.
Miners
=
append
(
list
.
Miners
,
a
.
fromaddr
)
return
makeNodeBindReceipt
(
node
,
nil
,
&
list
),
nil
}
}
//从超级节点解绑
//从超级节点解绑
func
(
a
*
action
)
unbind2Node
(
node
string
)
(
*
types
.
Receipt
,
error
)
{
func
(
a
*
action
)
unbind2Node
(
node
string
)
(
*
types
.
Receipt
,
error
)
{
list
,
err
:=
getBindNodeInfo
(
a
.
db
,
node
)
list
,
err
:=
getBindNodeInfo
(
a
.
db
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"unbind2Node"
)
return
nil
,
errors
.
Wrap
(
err
,
"unbind2Node"
)
}
}
newList
:=
&
pt
.
ParaNodeBindList
{
SuperNode
:
list
.
SuperNode
}
newList
:=
&
pt
.
ParaNodeBindList
{}
old
:=
proto
.
Clone
(
list
)
.
(
*
pt
.
ParaNodeBindList
)
for
_
,
m
:=
range
list
.
Miners
{
for
_
,
m
:=
range
list
.
Miners
{
if
m
!=
a
.
fromaddr
{
if
m
.
SuperNode
!=
node
&&
m
.
Miner
!=
a
.
fromaddr
{
newList
.
Miners
=
append
(
newList
.
Miners
,
m
)
newList
.
Miners
=
append
(
newList
.
Miners
,
m
)
}
}
}
}
return
makeNodeBindReceipt
(
node
,
list
,
newList
),
nil
return
makeNodeBindReceipt
(
old
,
newList
),
nil
}
}
func
getBindNodeInfo
(
db
dbm
.
KV
,
node
string
)
(
*
pt
.
ParaNodeBindList
,
error
)
{
func
getBindNodeInfo
(
db
dbm
.
KV
)
(
*
pt
.
ParaNodeBindList
,
error
)
{
key
:=
calcParaBindMinerNode
(
node
)
var
list
pt
.
ParaNodeBindList
key
:=
calcParaBindMinerNode
()
data
,
err
:=
db
.
Get
(
key
)
data
,
err
:=
db
.
Get
(
key
)
if
isNotFound
(
err
)
{
return
&
list
,
nil
}
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get key failed
node=%s"
,
node
)
return
nil
,
errors
.
Wrapf
(
err
,
"get key failed
"
)
}
}
var
list
pt
.
ParaNodeBindList
err
=
types
.
Decode
(
data
,
&
list
)
err
=
types
.
Decode
(
data
,
&
list
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"decode failed
node=%s"
,
node
)
return
nil
,
errors
.
Wrapf
(
err
,
"decode failed
"
)
}
}
return
&
list
,
nil
return
&
list
,
nil
}
}
...
...
plugin/dapp/paracross/executor/reward.md
0 → 100644
View file @
db10be7e
# 平行链共识节点挖矿奖励规则
>平行链共识节点是参与平行链共识安全的节点,发送共识交易,同时享受平行链挖矿奖励
## 共识节点资格
1.
共识节点需要加入共识节点账户组才具有发送共识交易的资格,不然即使发送也不会被接受
1.
新的共识节点需要共识节点账户组成员超过2/3投票通过才可以加入共识节点账户组
## 共识节点挖矿奖励
1.
共识节点根据本地计算的区块哈希发送共识交易参与共识,共识达成后促使达成共识的节点享受挖矿奖励
1.
比如共识账户组有4个挖矿账户A,B,C,D,其中A,B,C,D都依次发送共识交易,基于超过2/3的规则,在C的共识交易收到后即达成共识,那么奖励将分给A,B,C,而D是在达成共识后发送的,不享受挖矿奖励
## 奖励规则和金额
>奖励规则和金额可配置
```
[mver.consensus.paracross]
#超级节点挖矿奖励
coinReward=18
#发展基金奖励
coinDevFund=12
#如果超级节点上绑定了委托账户,则奖励超级节点coinBaseReward,其余部分(coinReward-coinBaseReward)按权重分给委托账户
coinBaseReward=3
#委托账户最少解绑定时间(按小时)
unBindTime=24
```
1.
每个区块产生的挖矿总奖励如配置项是coinDevFund+coinReward=30,共识达成后,发展基金账户分走12,剩余的18个coin平均分给达成共识的节点
1.
如果有绑定挖矿的账户绑定了共识节点进行挖矿,则共识节点平分基础的coinBaseReward,剩余部分(coinReward-coinBaseReward)按绑定挖矿锁定币的权重数量分给绑定挖矿的节点。
## 绑定挖矿命令
1.
生成 绑定/解绑定 挖矿 的交易(未签名)
```
{
"method" : "Chain33.CreateTransaction",
"params" : [
{
"execer" : "{user.p.para}.paracross",
"actionName" : "ParaBindMiner",
"payload" : {
"bindAction":"1"
"bindCoins" : 5,
"targetNode" : "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4",
}
}
],
}
```
**参数说明:**
|参数|类型|说明|
|----|----|----|
|method|string|Chain33.CreateTransaction|
|execer|string|必须是平行链的执行器user.p.para.paracross,title:user.p.para.按需调整|
|actionName|string|ParaBindMiner|
|bindAction|string|绑定:1,解绑定:2|
|bindCoins|int|绑定挖矿冻结币的份额,需冻结平行链原生代币,解绑定不需要此配置|
|targetNode|string|绑定目标共识节点,需要是共识账户组的成员|
plugin/dapp/paracross/executor/reward_test.go
View file @
db10be7e
...
@@ -83,14 +83,14 @@ func (suite *RewardTestSuite) TestRewardBindAddr() {
...
@@ -83,14 +83,14 @@ func (suite *RewardTestSuite) TestRewardBindAddr() {
key
=
calcParaBindMinerAddr
(
node
,
addr2
)
key
=
calcParaBindMinerAddr
(
node
,
addr2
)
suite
.
stateDB
.
Set
(
key
,
data
)
suite
.
stateDB
.
Set
(
key
,
data
)
list
:=
&
pt
.
ParaNodeBindList
{
node1
:=
&
pt
.
ParaNodeBindOne
{
SuperNode
:
node
,
Miner
:
addr
}
SuperNode
:
node
,
node2
:=
&
pt
.
ParaNodeBindOne
{
SuperNode
:
node
,
Miner
:
addr2
}
Miners
:
[]
string
{
addr
,
addr2
},
}
lists
:=
[]
*
pt
.
ParaNodeBindList
{
list
}
list
:=
&
pt
.
ParaNodeBindList
{}
list
.
Miners
=
append
(
list
.
Miners
,
node1
)
list
.
Miners
=
append
(
list
.
Miners
,
node2
)
recp
,
change
,
err
:=
suite
.
action
.
rewardBindAddr
(
50000005
,
list
s
,
1
)
recp
,
change
,
err
:=
suite
.
action
.
rewardBindAddr
(
50000005
,
list
,
1
)
suite
.
Nil
(
err
)
suite
.
Nil
(
err
)
suite
.
Equal
(
int64
(
5
),
change
)
suite
.
Equal
(
int64
(
5
),
change
)
suite
.
Equal
(
int32
(
types
.
ExecOk
),
recp
.
Ty
)
suite
.
Equal
(
int32
(
types
.
ExecOk
),
recp
.
Ty
)
...
...
plugin/dapp/paracross/proto/paracross.proto
View file @
db10be7e
...
@@ -180,9 +180,13 @@ message ReceiptParaBindMinerInfo{
...
@@ -180,9 +180,13 @@ message ReceiptParaBindMinerInfo{
ParaBindMinerInfo
current
=
3
;
ParaBindMinerInfo
current
=
3
;
}
}
message
ParaNodeBind
List
{
message
ParaNodeBind
One
{
string
superNode
=
1
;
string
superNode
=
1
;
repeated
string
miners
=
2
;
string
miner
=
2
;
}
message
ParaNodeBindList
{
repeated
ParaNodeBindOne
miners
=
1
;
}
}
message
ReceiptParaNodeBindListUpdate
{
message
ReceiptParaNodeBindListUpdate
{
...
...
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