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
066afd76
Commit
066afd76
authored
Nov 22, 2018
by
Litian
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into evm_abi
parents
5e474972
5e8dbeec
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
35 deletions
+56
-35
ticket.go
plugin/consensus/ticket/ticket.go
+37
-35
ticket_test.go
plugin/consensus/ticket/ticket_test.go
+19
-0
No files found.
plugin/consensus/ticket/ticket.go
View file @
066afd76
...
...
@@ -39,8 +39,8 @@ func init() {
// Client export ticket client struct
type
Client
struct
{
*
drivers
.
BaseClient
//ticket
list
for miner
t
list
*
ty
.
ReplyTicketLis
t
//ticket
map
for miner
t
icketsMap
map
[
string
]
*
ty
.
Ticke
t
privmap
map
[
string
]
crypto
.
PrivKey
ticketmu
sync
.
Mutex
done
chan
struct
{}
...
...
@@ -68,7 +68,13 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
if
subcfg
.
GenesisBlockTime
>
0
{
cfg
.
GenesisBlockTime
=
subcfg
.
GenesisBlockTime
}
t
:=
&
Client
{
c
,
&
ty
.
ReplyTicketList
{},
nil
,
sync
.
Mutex
{},
make
(
chan
struct
{}),
&
subcfg
}
t
:=
&
Client
{
BaseClient
:
c
,
ticketsMap
:
make
(
map
[
string
]
*
ty
.
Ticket
),
privmap
:
nil
,
ticketmu
:
sync
.
Mutex
{},
done
:
make
(
chan
struct
{}),
subcfg
:
&
subcfg
}
c
.
SetChild
(
t
)
go
t
.
flushTicketBackend
()
return
t
...
...
@@ -188,16 +194,17 @@ func (client *Client) getTickets() ([]*ty.Ticket, []crypto.PrivKey, error) {
func
(
client
*
Client
)
getTicketCount
()
int64
{
client
.
ticketmu
.
Lock
()
defer
client
.
ticketmu
.
Unlock
()
if
client
.
tlist
==
nil
{
return
0
}
return
int64
(
len
(
client
.
tlist
.
Tickets
))
return
int64
(
len
(
client
.
ticketsMap
))
}
func
(
client
*
Client
)
setTicket
(
tlist
*
ty
.
ReplyTicketList
,
privmap
map
[
string
]
crypto
.
PrivKey
)
{
client
.
ticketmu
.
Lock
()
defer
client
.
ticketmu
.
Unlock
()
client
.
tlist
=
tlist
client
.
ticketsMap
=
make
(
map
[
string
]
*
ty
.
Ticket
)
for
_
,
ticket
:=
range
tlist
.
Tickets
{
client
.
ticketsMap
[
ticket
.
GetTicketId
()]
=
ticket
}
//client.tlist = tlist
client
.
privmap
=
privmap
tlog
.
Debug
(
"setTicket"
,
"n"
,
len
(
tlist
.
GetTickets
()))
}
...
...
@@ -464,27 +471,32 @@ func printBInt(data *big.Int) string {
return
strings
.
Repeat
(
"0"
,
64
-
len
(
txt
))
+
txt
}
func
(
client
*
Client
)
searchTargetTicket
(
parent
,
block
*
types
.
Block
)
(
*
ty
.
Ticket
,
crypto
.
PrivKey
,
*
big
.
Int
,
[]
byte
,
int
,
error
)
{
func
(
client
*
Client
)
searchTargetTicket
(
parent
,
block
*
types
.
Block
)
(
*
ty
.
Ticket
,
crypto
.
PrivKey
,
*
big
.
Int
,
[]
byte
,
string
,
error
)
{
bits
:=
parent
.
Difficulty
diff
,
modify
,
err
:=
client
.
getNextTarget
(
parent
,
bits
)
if
err
!=
nil
{
return
nil
,
nil
,
nil
,
nil
,
0
,
err
return
nil
,
nil
,
nil
,
nil
,
""
,
err
}
client
.
ticketmu
.
Lock
()
defer
client
.
ticketmu
.
Unlock
()
for
i
:=
0
;
i
<
len
(
client
.
tlist
.
Tickets
);
i
++
{
ticket
:=
client
.
tlist
.
Tickets
[
i
]
for
ticketID
,
ticket
:=
range
client
.
ticketsMap
{
if
ticket
==
nil
{
tlog
.
Warn
(
"Client searchTargetTicket ticket is nil"
,
"ticketID"
,
ticketID
)
continue
}
//已经到成熟
器
if
!
ticket
.
IsGenesis
&&
block
.
BlockTime
-
ticket
.
CreateTime
<=
types
.
GetP
(
block
.
Height
)
.
TicketFrozenTime
{
//已经到成熟
期
if
!
ticket
.
GetIsGenesis
()
&&
(
block
.
BlockTime
-
ticket
.
GetCreateTime
()
<=
types
.
GetP
(
block
.
Height
)
.
TicketFrozenTime
)
{
continue
}
//find priv key
priv
:=
client
.
privmap
[
ticket
.
MinerAddress
]
privHash
,
err
:=
genPrivHash
(
priv
,
ticket
.
TicketId
)
// 查找私钥
priv
,
ok
:=
client
.
privmap
[
ticket
.
MinerAddress
]
if
!
ok
{
tlog
.
Error
(
"Client searchTargetTicket can't find private key"
,
"MinerAddress"
,
ticket
.
MinerAddress
)
continue
}
privHash
,
err
:=
genPrivHash
(
priv
,
ticketID
)
if
err
!=
nil
{
tlog
.
Error
(
"Client searchTargetTicket genPrivHash "
,
"error"
,
err
)
continue
}
currentdiff
:=
client
.
getCurrentTarget
(
block
.
BlockTime
,
ticket
.
TicketId
,
modify
,
privHash
)
...
...
@@ -493,36 +505,26 @@ func (client *Client) searchTargetTicket(parent, block *types.Block) (*ty.Ticket
}
tlog
.
Info
(
"currentdiff"
,
"hex"
,
printBInt
(
currentdiff
))
tlog
.
Info
(
"FindBlock"
,
"height------->"
,
block
.
Height
,
"ntx"
,
len
(
block
.
Txs
))
return
ticket
,
priv
,
diff
,
modify
,
i
,
nil
return
ticket
,
priv
,
diff
,
modify
,
ticketID
,
nil
}
return
nil
,
nil
,
nil
,
nil
,
0
,
nil
return
nil
,
nil
,
nil
,
nil
,
""
,
nil
}
func
(
client
*
Client
)
delTicket
(
ticket
*
ty
.
Ticket
,
index
int
)
{
func
(
client
*
Client
)
delTicket
(
ticket
ID
string
)
{
client
.
ticketmu
.
Lock
()
defer
client
.
ticketmu
.
Unlock
()
//1. 结构体没有被重新调整过
oldticket
:=
client
.
tlist
.
Tickets
[
index
]
if
oldticket
.
TicketId
==
ticket
.
TicketId
{
client
.
tlist
.
Tickets
[
index
]
=
nil
}
//2. 全表search
for
i
:=
0
;
i
<
len
(
client
.
tlist
.
Tickets
);
i
++
{
oldticket
=
client
.
tlist
.
Tickets
[
i
]
if
oldticket
==
nil
{
continue
}
if
oldticket
.
TicketId
==
ticket
.
TicketId
{
client
.
tlist
.
Tickets
[
i
]
=
nil
if
client
.
ticketsMap
==
nil
||
len
(
ticketID
)
==
0
{
return
}
if
_
,
ok
:=
client
.
ticketsMap
[
ticketID
];
ok
{
delete
(
client
.
ticketsMap
,
ticketID
)
}
}
// Miner ticket miner function
func
(
client
*
Client
)
Miner
(
parent
,
block
*
types
.
Block
)
bool
{
//add miner address
ticket
,
priv
,
diff
,
modify
,
index
,
err
:=
client
.
searchTargetTicket
(
parent
,
block
)
ticket
,
priv
,
diff
,
modify
,
ticketID
,
err
:=
client
.
searchTargetTicket
(
parent
,
block
)
if
err
!=
nil
{
tlog
.
Error
(
"Miner"
,
"err"
,
err
)
newblock
,
err
:=
client
.
RequestLastBlock
()
...
...
@@ -543,7 +545,7 @@ func (client *Client) Miner(parent, block *types.Block) bool {
if
err
!=
nil
{
return
false
}
client
.
delTicket
(
ticket
,
index
)
client
.
delTicket
(
ticket
ID
)
return
true
}
...
...
plugin/consensus/ticket/ticket_test.go
View file @
066afd76
...
...
@@ -7,6 +7,8 @@ package ticket
import
(
"testing"
"github.com/33cn/plugin/plugin/dapp/ticket/types"
_
"github.com/33cn/chain33/system"
"github.com/33cn/chain33/util/testnode"
_
"github.com/33cn/plugin/plugin/dapp/init"
...
...
@@ -23,3 +25,20 @@ func TestTicket(t *testing.T) {
err
:=
mock33
.
WaitHeight
(
100
)
assert
.
Nil
(
t
,
err
)
}
func
TestTicketMap
(
t
*
testing
.
T
)
{
c
:=
Client
{}
ticketList
:=
&
types
.
ReplyTicketList
{}
ticketList
.
Tickets
=
[]
*
types
.
Ticket
{
{
TicketId
:
"1111"
},
{
TicketId
:
"2222"
},
{
TicketId
:
"3333"
},
{
TicketId
:
"4444"
},
}
assert
.
Equal
(
t
,
c
.
getTicketCount
(),
int64
(
0
))
c
.
setTicket
(
ticketList
,
nil
)
assert
.
Equal
(
t
,
c
.
getTicketCount
(),
int64
(
4
))
c
.
delTicket
(
"3333"
)
assert
.
Equal
(
t
,
c
.
getTicketCount
(),
int64
(
3
))
}
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