OSDN Git Service

mov joint (#428)
authorPoseidon <shenao.78@163.com>
Mon, 28 Oct 2019 05:55:30 +0000 (13:55 +0800)
committerPaladz <yzhu101@uottawa.ca>
Mon, 28 Oct 2019 05:55:30 +0000 (13:55 +0800)
* mov joint

* bug fix

* opt code

* fix ci

* format code

application/mov/database/mock_mov_store.go
application/mov/database/mov_store.go
application/mov/database/mov_store_test.go
application/mov/match/match.go
application/mov/mov_core.go

index ecb7c2f..52d1513 100644 (file)
@@ -19,6 +19,10 @@ func (m *MockMovStore) GetMovDatabaseState() (*common.MovDatabaseState, error) {
        return m.DBState, nil
 }
 
+func (m *MockMovStore) InitDBState(height uint64, hash *bc.Hash) error {
+       return nil
+}
+
 func (m *MockMovStore) ListOrders(orderAfter *common.Order) ([]*common.Order, error) {
        tradePair := &common.TradePair{FromAssetID: orderAfter.FromAssetID, ToAssetID: orderAfter.ToAssetID}
        orders := m.OrderMap[tradePair.Key()]
index eaf04af..9be669a 100644 (file)
@@ -14,6 +14,7 @@ import (
 
 type MovStore interface {
        GetMovDatabaseState() (*common.MovDatabaseState, error)
+       InitDBState(height uint64, hash *bc.Hash) error
        ListOrders(orderAfter *common.Order) ([]*common.Order, error)
        ListTradePairsWithStart(fromAssetIDAfter, toAssetIDAfter *bc.AssetID) ([]*common.TradePair, error)
        ProcessOrders(addOrders []*common.Order, delOrders []*common.Order, blockHeader *types.BlockHeader) error
@@ -83,17 +84,19 @@ type LevelDBMovStore struct {
        db dbm.DB
 }
 
-func NewLevelDBMovStore(db dbm.DB, height uint64, hash *bc.Hash) (*LevelDBMovStore, error) {
-       if value := db.Get(bestMatchStore); value == nil {
-               state := &common.MovDatabaseState{Height: height, Hash: hash}
-               value, err := json.Marshal(state)
-               if err != nil {
-                       return nil, err
-               }
+func NewLevelDBMovStore(db dbm.DB, ) *LevelDBMovStore {
+       return &LevelDBMovStore{db: db}
+}
 
-               db.Set(bestMatchStore, value)
+func (m *LevelDBMovStore) InitDBState(height uint64, hash *bc.Hash) error {
+       state := &common.MovDatabaseState{Height: height, Hash: hash}
+       value, err := json.Marshal(state)
+       if err != nil {
+               return err
        }
-       return &LevelDBMovStore{db: db}, nil
+
+       m.db.Set(bestMatchStore, value)
+       return nil
 }
 
 func (m *LevelDBMovStore) ListOrders(orderAfter *common.Order) ([]*common.Order, error) {
index b29c2df..c35afca 100644 (file)
@@ -1535,9 +1535,9 @@ func TestMovStore(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
@@ -1969,9 +1969,9 @@ func TestListOrders(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
@@ -2382,9 +2382,9 @@ func TestAddOrders(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
@@ -2722,9 +2722,9 @@ func TestDelOrders(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
@@ -2816,9 +2816,9 @@ func TestListTradePairsWithStart(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
@@ -2923,9 +2923,9 @@ func TestUpdateTradePairs(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
@@ -2995,9 +2995,9 @@ func TestCheckMovDatabaseState(t *testing.T) {
        defer os.RemoveAll("temp")
        for i, c := range cases {
                testDB := dbm.NewDB("testdb", "leveldb", "temp")
-               movStore, err := NewLevelDBMovStore(testDB, height, &hash)
-               if err != nil {
-                       t.Fatalf("case %d: NewMovStore error %v.", i, err)
+               movStore := NewLevelDBMovStore(testDB)
+               if err := movStore.InitDBState(height, &hash); err != nil {
+                       t.Fatalf("case %d: InitDBState error %v.", i, err)
                }
 
                batch := movStore.db.NewBatch()
index 604771e..a1f5968 100644 (file)
@@ -138,7 +138,7 @@ func addMatchTxOutput(txData *types.TxData, txInput *types.TxInput, order *commo
        requestAmount := calcRequestAmount(order.Utxo.Amount, contractArgs)
        receiveAmount := vprMath.MinUint64(requestAmount, oppositeAmount)
        shouldPayAmount := CalcShouldPayAmount(receiveAmount, contractArgs)
-       isPartialTrade := order.Utxo.Amount > shouldPayAmount
+       isPartialTrade := requestAmount > receiveAmount
 
        setMatchTxArguments(txInput, isPartialTrade, len(txData.Outputs), receiveAmount)
        txData.Outputs = append(txData.Outputs, types.NewIntraChainOutput(*order.ToAssetID, receiveAmount, contractArgs.SellerProgram))
@@ -262,8 +262,12 @@ func CalcMatchedTxFee(txData *types.TxData, maxFeeRate float64) (map[bc.AssetID]
                // minus the amount of seller's receiving output
                if _, ok := sellerProgramMap[hex.EncodeToString(output.ControlProgram())]; ok {
                        assetID := *output.AssetAmount().AssetId
-                       assetFeeMap[assetID].FeeAmount -= int64(output.AssetAmount().Amount)
-                       if assetFeeMap[assetID].FeeAmount == 0 {
+                       fee, ok := assetFeeMap[assetID]
+                       if !ok {
+                               continue
+                       }
+                       fee.FeeAmount -= int64(output.AssetAmount().Amount)
+                       if fee.FeeAmount == 0 {
                                delete(assetFeeMap, assetID)
                        }
                }
index 1e68078..7e26ad0 100644 (file)
@@ -6,6 +6,7 @@ import (
        "github.com/vapor/application/mov/database"
        "github.com/vapor/application/mov/match"
        "github.com/vapor/consensus/segwit"
+       dbm "github.com/vapor/database/leveldb"
        "github.com/vapor/errors"
        "github.com/vapor/math/checked"
        "github.com/vapor/protocol/bc"
@@ -22,8 +23,17 @@ type MovCore struct {
        movStore database.MovStore
 }
 
-func NewMovCore(store database.MovStore) *MovCore {
-       return &MovCore{movStore: store}
+func NewMovCore(dbBackend, dbDir string) *MovCore {
+       movDB := dbm.NewDB("mov", dbBackend, dbDir)
+       return &MovCore{movStore: database.NewLevelDBMovStore(movDB)}
+}
+
+func (m *MovCore) Name() string {
+       return "MOV"
+}
+
+func (m *MovCore) InitChainStatus(blockHeight uint64, blockHash *bc.Hash) error {
+       return m.movStore.InitDBState(blockHeight, blockHash)
 }
 
 // ChainStatus return the current block height and block hash in dex core