Skip to content

Commit 7e2d783

Browse files
author
Qi Xiao
committed
Add CIP compatibility block height switches
1 parent 675c738 commit 7e2d783

File tree

6 files changed

+76
-68
lines changed

6 files changed

+76
-68
lines changed

blockproducer/branch.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func newBranch(
7878
}
7979
inst.packed[k] = v
8080
// Apply to preview
81-
if err = inst.preview.apply(v); err != nil {
81+
if err = inst.preview.apply(v, bn.height); err != nil {
8282
return
8383
}
8484
}
@@ -154,7 +154,7 @@ func (b *branch) applyBlock(n *blockNode) (br *branch, err error) {
154154
}
155155
cpy.packed[k] = v
156156
// Apply to preview
157-
if err = cpy.preview.apply(v); err != nil {
157+
if err = cpy.preview.apply(v, n.height); err != nil {
158158
return
159159
}
160160
}
@@ -199,7 +199,7 @@ func (b *branch) produceBlock(
199199
out := make([]pi.Transaction, 0, packCount)
200200
for _, v := range txs {
201201
var k = v.Hash()
202-
if ierr = cpy.preview.apply(v); ierr != nil {
202+
if ierr = cpy.preview.apply(v, h); ierr != nil {
203203
continue
204204
}
205205
delete(cpy.unpacked, k)

blockproducer/chain.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func NewChainWithContext(ctx context.Context, cfg *Config) (c *Chain, err error)
168168
if !existed {
169169
var init = newMetaState()
170170
for _, v := range cfg.Genesis.Transactions {
171-
if ierr = init.apply(v); ierr != nil {
171+
if ierr = init.apply(v, 0); ierr != nil {
172172
err = errors.Wrap(ierr, "failed to initialize immutable state")
173173
return
174174
}
@@ -723,7 +723,7 @@ func (c *Chain) replaceAndSwitchToBranch(
723723
for _, b := range newIrres {
724724
txCount += b.txCount
725725
for _, tx := range b.load().Transactions {
726-
if err := c.immutable.apply(tx); err != nil {
726+
if err := c.immutable.apply(tx, newBranch.head.height); err != nil {
727727
log.WithError(err).Fatal("failed to apply block to immutable database")
728728
}
729729
delete(resultTxPool, tx.Hash()) // Remove confirmed transaction

blockproducer/chain_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
. "github.com/smartystreets/goconvey/convey"
2828

2929
pi "github.com/CovenantSQL/CovenantSQL/blockproducer/interfaces"
30+
"github.com/CovenantSQL/CovenantSQL/conf"
3031
"github.com/CovenantSQL/CovenantSQL/crypto"
3132
"github.com/CovenantSQL/CovenantSQL/crypto/asymmetric"
3233
"github.com/CovenantSQL/CovenantSQL/crypto/hash"
@@ -325,7 +326,7 @@ func TestChain(t *testing.T) {
325326
So(err, ShouldBeNil)
326327
err = chain.storeTx(t1)
327328
So(err, ShouldBeNil)
328-
err = chain.produceBlock(begin.Add(chain.period).UTC())
329+
err = chain.produceBlock(begin.Add(chain.period * conf.BPHeightCIPFixProvideService).UTC())
329330
So(err, ShouldBeNil)
330331
bal2, loaded = chain.headBranch.preview.loadAccountTokenBalance(addr1, types.Particle)
331332
So(loaded, ShouldBeTrue)
@@ -334,7 +335,7 @@ func TestChain(t *testing.T) {
334335
So(bal1-bal2, ShouldEqual, po1.Deposit)
335336
err = chain.storeTx(t2)
336337
So(err, ShouldBeNil)
337-
err = chain.produceBlock(begin.Add(2 * chain.period).UTC())
338+
err = chain.produceBlock(begin.Add(chain.period * (conf.BPHeightCIPFixProvideService + 1)).UTC())
338339
So(err, ShouldBeNil)
339340
bal3, loaded = chain.headBranch.preview.loadAccountTokenBalance(addr1, types.Particle)
340341
So(bal3, ShouldEqual, bal2)

blockproducer/metastate.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -509,22 +509,24 @@ func (s *metaState) increaseNonce(addr proto.AccountAddress) (err error) {
509509
return
510510
}
511511

512-
func (s *metaState) updateProviderList(tx *types.ProvideService) (err error) {
512+
func (s *metaState) updateProviderList(tx *types.ProvideService, height uint32) (err error) {
513513
sender, err := crypto.PubKeyHash(tx.Signee)
514514
if err != nil {
515515
err = errors.Wrap(err, "updateProviderList failed")
516516
return
517517
}
518518

519-
// load previous provider object
520-
po, loaded := s.loadProviderObject(sender)
521-
if loaded {
522-
// refund
523-
if err = s.increaseAccountStableBalance(sender, po.Deposit); err != nil {
524-
return
525-
}
519+
if height >= conf.BPHeightCIPFixProvideService {
520+
// load previous provider object
521+
po, loaded := s.loadProviderObject(sender)
522+
if loaded {
523+
// refund
524+
if err = s.increaseAccountStableBalance(sender, po.Deposit); err != nil {
525+
return
526+
}
526527

527-
s.deleteProviderObject(sender)
528+
s.deleteProviderObject(sender)
529+
}
528530
}
529531

530532
// deposit
@@ -1124,7 +1126,7 @@ func (s *metaState) transferSQLChainTokenBalance(transfer *types.Transfer) (err
11241126
return
11251127
}
11261128

1127-
func (s *metaState) applyTransaction(tx pi.Transaction) (err error) {
1129+
func (s *metaState) applyTransaction(tx pi.Transaction, height uint32) (err error) {
11281130
switch t := tx.(type) {
11291131
case *types.Transfer:
11301132
err = s.transferSQLChainTokenBalance(t)
@@ -1135,7 +1137,7 @@ func (s *metaState) applyTransaction(tx pi.Transaction) (err error) {
11351137
case *types.BaseAccount:
11361138
err = s.storeBaseAccount(t.Address, &t.Account)
11371139
case *types.ProvideService:
1138-
err = s.updateProviderList(t)
1140+
err = s.updateProviderList(t, height)
11391141
case *types.CreateDatabase:
11401142
err = s.matchProvidersWithUser(t)
11411143
case *types.UpdatePermission:
@@ -1146,7 +1148,7 @@ func (s *metaState) applyTransaction(tx pi.Transaction) (err error) {
11461148
err = s.updateBilling(t)
11471149
case *pi.TransactionWrapper:
11481150
// call again using unwrapped transaction
1149-
err = s.applyTransaction(t.Unwrap())
1151+
err = s.applyTransaction(t.Unwrap(), height)
11501152
default:
11511153
err = ErrUnknownTransactionType
11521154
}
@@ -1170,7 +1172,7 @@ func (s *metaState) generateGenesisBlock(dbID proto.DatabaseID, tx *types.Create
11701172
return
11711173
}
11721174

1173-
func (s *metaState) apply(t pi.Transaction) (err error) {
1175+
func (s *metaState) apply(t pi.Transaction, height uint32) (err error) {
11741176
log.Infof("get tx: %s", t.GetTransactionType())
11751177
// NOTE(leventeliu): bypass pool in this method.
11761178
var (
@@ -1195,7 +1197,7 @@ func (s *metaState) apply(t pi.Transaction) (err error) {
11951197
return
11961198
}
11971199
// Try to apply transaction to metaState
1198-
if err = s.applyTransaction(t); err != nil {
1200+
if err = s.applyTransaction(t, height); err != nil {
11991201
log.WithError(err).Debug("apply transaction failed")
12001202
return
12011203
}

0 commit comments

Comments
 (0)