@@ -3,12 +3,6 @@ package tlecore
33import (
44 "crypto/sha256"
55 "fmt"
6- "io/ioutil"
7- "os"
8- "path/filepath"
9- "strconv"
10- "sync"
11- "time"
126
137 "github.com/hyperledger/fabric-protos-go/common"
148 "github.com/hyperledger/fabric/common/policies"
@@ -20,9 +14,8 @@ import (
2014)
2115
2216type TlePeer struct {
23- tleState * Tlestate
24- nextBlockNum uint
25- mutex sync.Mutex
17+ tleState * Tlestate
18+ blockListener BlockListener
2619
2720 channelName string
2821 lc * committer.LedgerCommitter
@@ -75,13 +68,13 @@ func (p *TlePeer) vsccExtractRwsetRaw(block *common.Block, txPosition int, actio
7568}
7669
7770func (p * TlePeer ) UpdateState (block * common.Block ) error {
78- for tIdx , _ := range block .Data .Data {
71+ for tIdx := range block .Data .Data {
7972 // TODO: continue if current txn is invalid.
8073 txsfltr := ValidationFlags (block .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ])
8174 fmt .Printf ("blockNum %d, tIdx: %d, validationCode: %v\n " , tIdx , block .Header .Number , txsfltr .Flag (tIdx ))
8275 if txsfltr .IsInvalid (tIdx ) {
8376 fmt .Println ("The current txn is not valid!" )
84- // continue
77+ continue
8578 }
8679
8780 // extract rwset
@@ -118,26 +111,12 @@ func (p *TlePeer) UpdateState(block *common.Block) error {
118111 return nil
119112}
120113
121- func (p * TlePeer ) GetBlock () (* common.Block , error ) {
122- // Simulating data retrieval from somewhere
123- fmt .Printf ("Start to get block num: %d\n " , p .GetNextBlockNum ())
124- blockPath := os .Getenv ("BLOCK_PATH" )
125- if blockPath == "" {
126- blockPath = "tmpBlocks"
127- }
128- rawBlock , err := ioutil .ReadFile (filepath .Join (blockPath , "t" + strconv .Itoa (int (p .GetNextBlockNum ()))+ ".block" ))
129- if err != nil {
130- return nil , err
131- }
132- return protoutil .UnmarshalBlock (rawBlock )
133- }
134-
135- func (p * TlePeer ) ProcessBlock (block * common.Block ) error {
136- err := VerifyBlock (p .policyMgr , []byte (p .channelName ), uint64 (p .GetNextBlockNum ()), block )
114+ func (p * TlePeer ) ProcessBlock (block * common.Block , blockNum int ) error {
115+ err := VerifyBlock (p .policyMgr , []byte (p .channelName ), uint64 (blockNum ), block )
137116 if err != nil {
138117 return err
139118 }
140- fmt .Printf ("--- Verify Block %d success, start verify txn ---\n " , p . GetNextBlockNum ( ))
119+ fmt .Printf ("--- Verify Block %d success, start verify txn ---\n " , uint64 ( blockNum ))
141120 err = p .validator .Validate (block )
142121 if err != nil {
143122 return err
@@ -149,24 +128,10 @@ func (p *TlePeer) ProcessBlock(block *common.Block) error {
149128 }
150129
151130 // update state
152- p .IncrementNextBlockNum ()
153131 return p .UpdateState (block )
154132}
155133
156- func (p * TlePeer ) GetNextBlockNum () uint {
157- p .mutex .Lock ()
158- defer p .mutex .Unlock ()
159- return p .nextBlockNum
160- }
161-
162- func (p * TlePeer ) IncrementNextBlockNum () {
163- p .mutex .Lock ()
164- defer p .mutex .Unlock ()
165- p .nextBlockNum += 1
166- }
167-
168- func (p * TlePeer ) InitFabricPart () func () {
169- genesisBlock := GetGenesisBlock ()
134+ func (p * TlePeer ) InitFabricPart (genesisBlock * common.Block ) func () {
170135 peerInstance , cleanup := peer .NewFabricPeer ()
171136
172137 err := InitializeFabricPeer (peerInstance )
@@ -191,56 +156,42 @@ func (p *TlePeer) InitFabricPart() func() {
191156 p .policyMgr = policyMgr
192157 p .validator = validator
193158 p .channelName = channelName
194-
195159 return cleanup
196160}
197161
198162func (p * TlePeer ) Start () {
199- cleanup := p .InitFabricPart ()
163+ genesisBlock , err := p .blockListener .GetNextBlock ()
164+ if err != nil {
165+ fmt .Println ("Get genesis block failed: " , err )
166+ }
167+ p .blockListener .NotifySuccess ()
168+
169+ cleanup := p .InitFabricPart (genesisBlock )
200170 defer cleanup ()
201171
202- waitTime := 1
203172 for {
204- // wait several second to update one block
205- time .Sleep (time .Duration (waitTime ) * time .Second )
206-
207- block , err := p .GetBlock ()
173+ blocknum := p .blockListener .GetNextBlockNum ()
174+ block , err := p .blockListener .GetNextBlock ()
208175 if err != nil {
209176 fmt .Printf ("TlePeer GetBlock Failed, %v\n " , err )
210- waitTime = waitTime * 2
211177 continue
212178 }
213- err = p .ProcessBlock (block )
179+ err = p .ProcessBlock (block , blocknum )
214180 if err != nil {
215181 fmt .Printf ("TlePeer Process Block error, %v\n " , err )
182+ continue
216183 }
217- waitTime = 1
218- }
219- }
220-
221- func GetGenesisBlock () * common.Block {
222- // TODO get from somewhere else.
223- blockPath := os .Getenv ("BLOCK_PATH" )
224- if blockPath == "" {
225- blockPath = "tmpBlocks"
226- }
227- rawBlock0 , err := ioutil .ReadFile (filepath .Join (blockPath , "t0.block" ))
228- if err != nil {
229- panic (fmt .Sprintf ("read genesis block error, err: %v, blockPath: %s" , err , blockPath ))
230- }
231- fmt .Println ("Finish reading genesis block!!!" )
232- genesisBlock , err := protoutil .UnmarshalBlock (rawBlock0 )
233- if err != nil {
234- panic ("Unmarshal genesis block error" )
184+ p .blockListener .NotifySuccess ()
235185 }
236- return genesisBlock
237186}
238187
239188func ServePeer (tleState * Tlestate ) {
240189 // TODO change the logic here.
190+ blockListener := NewFileBlockGetter ()
191+ // blockListener := NewOrdererBlockGetter()
241192 peer := & TlePeer {
242- tleState : tleState ,
243- nextBlockNum : 1 ,
193+ tleState : tleState ,
194+ blockListener : blockListener ,
244195 }
245196 go peer .Start ()
246197}
0 commit comments