Skip to content

Commit

Permalink
Merge pull request #14 from nervina-labs/script_id_and_tx_hash
Browse files Browse the repository at this point in the history
Add lock_script_id and tx_hash
  • Loading branch information
duanyytop authored Jul 27, 2022
2 parents dfe14cc + 199e99a commit d169946
Show file tree
Hide file tree
Showing 24 changed files with 487 additions and 189 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@
.idea/
storage/
bin/
test/
test/
.vscode/
9 changes: 5 additions & 4 deletions cmd/syncer/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,23 @@ package main

import (
"fmt"
"log"
"os"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/app"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/config"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/data"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/service"
"gopkg.in/natefinch/lumberjack.v2"
"log"
"os"
)

func newApp(logger *logger.Logger, blockSyncSvc *service.BlockSyncService, checkInfoCleanerSvc *service.CheckInfoCleanerService, metadataSyncSvc *service.MetadataSyncService, invalidDataCleanerSvc *service.InvalidDataCleaner, m *data.DBMigration) *app.App {
func newApp(logger *logger.Logger, blockSyncSvc *service.BlockSyncService, checkInfoCleanerSvc *service.CheckInfoCleanerService, metadataSyncSvc *service.MetadataSyncService, invalidDataCleanerSvc *service.InvalidDataCleaner, withdrawExtraInfoService *service.WithdrawExtraInfoService, m *data.DBMigration) *app.App {
return app.NewApp(
app.Name("cota-nft-entries-syncer"),
app.Version("0.0.1"),
app.Logger(logger),
app.Services(blockSyncSvc, checkInfoCleanerSvc, metadataSyncSvc, invalidDataCleanerSvc), app.Migration(m))
app.Services(blockSyncSvc, checkInfoCleanerSvc, metadataSyncSvc, invalidDataCleanerSvc, withdrawExtraInfoService), app.Migration(m))
}

func main() {
Expand Down
5 changes: 4 additions & 1 deletion cmd/syncer/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion internal/biz/biz.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ import (

var ProviderSet = wire.NewSet(NewCheckInfoUsecase, NewRegisterCotaKvPairUsecase, NewDefineCotaNftKvPairUsecase,
NewHoldCotaNftKvPairUsecase, NewWithdrawCotaNftKvPairUsecase, NewClaimedCotaNftKvPairUsecase, NewSyncKvPairUsecase,
NewMintCotaKvPairUsecase, NewTransferCotaKvPairUsecase, NewIssuerInfoUsecase, NewClassInfoUsecase, NewInvalidDataUsecase)
NewMintCotaKvPairUsecase, NewTransferCotaKvPairUsecase, NewIssuerInfoUsecase, NewClassInfoUsecase, NewInvalidDataUsecase, NewWithdrawExtraInfoUsecase)

type Entry struct {
InputType []byte
OutputType []byte
LockScript *ckbTypes.Script
TxIndex uint32
Version uint8
TxHash ckbTypes.Hash
}
3 changes: 3 additions & 0 deletions internal/biz/withdraw_cota_nft_kv_pair.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package biz

import (
"context"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
)

Expand All @@ -12,12 +13,14 @@ type WithdrawCotaNftKvPair struct {
TokenIndex uint32
OutPoint string
OutPointCrc uint32
TxHash string
State uint8
Configure uint8
Characteristic string
ReceiverLockScriptId uint
LockHash string
LockHashCrc uint32
LockScriptId uint
Version uint8
}

Expand Down
43 changes: 43 additions & 0 deletions internal/biz/withdraw_extra_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package biz

import (
"context"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
)

type WithdrawQueryInfo struct {
BlockNumber uint64
OutPoint string
LockHash string
}

type WithdrawExtraInfoRepo interface {
CreateExtraInfo(ctx context.Context, outPoint string, txHash string, lockScriptId uint) error
FindQueryInfos(ctx context.Context, page int, pageSize int) ([]WithdrawQueryInfo, error)
FindOrCreateScript(ctx context.Context, script *Script) error
}

type WithdrawExtraInfoUsecase struct {
repo WithdrawExtraInfoRepo
logger *logger.Logger
}

func NewWithdrawExtraInfoUsecase(repo WithdrawExtraInfoRepo, logger *logger.Logger) *WithdrawExtraInfoUsecase {
return &WithdrawExtraInfoUsecase{
repo: repo,
logger: logger,
}
}

func (uc *WithdrawExtraInfoUsecase) CreateExtraInfo(ctx context.Context, outPoint string, txHash string, lockScriptId uint) error {
return uc.repo.CreateExtraInfo(ctx, outPoint, txHash, lockScriptId)
}

func (uc *WithdrawExtraInfoUsecase) FindQueryInfos(ctx context.Context, page int, pageSize int) ([]WithdrawQueryInfo, error) {
return uc.repo.FindQueryInfos(ctx, page, pageSize)
}

func (uc *WithdrawExtraInfoUsecase) FindOrCreateScript(ctx context.Context, script *Script) error {
return uc.repo.FindOrCreateScript(ctx, script)
}
17 changes: 8 additions & 9 deletions internal/data/block_syncer.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ func (bp BlockSyncer) Sync(ctx context.Context, block *ckbTypes.Block, checkInfo
var entryVec []biz.Entry
kvPair := biz.KvPair{}
for index, tx := range block.Transactions {
// ParseRegistryEntries TODO 拆到独立到 repo 中
if bp.hasCotaRegistryCell(tx.Outputs, systemScripts.CotaRegistryType) && bp.isUpdateCotaRegistryTx(tx.Witnesses[0]) {
registers, err := bp.registerCotaUsecase.ParseRegistryEntries(ctx, block.Header.Number, tx)
if err != nil && err.Error() == "No data" {
Expand Down Expand Up @@ -101,60 +100,60 @@ func (bp BlockSyncer) parseCotaEntries(blockNumber uint64, entries []biz.Entry)
for _, entry := range entries {
if len(entry.InputType) > 0 {
switch entry.InputType[0] {
// Define 创建 DefineCota Kv pairs
// Define: Create DefineCota Kv pairs
case 1:
defineCotas, err := bp.defineCotaUsecase.ParseDefineCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.DefineCotas = append(kvPair.DefineCotas, defineCotas...)
// Mint 更新 DefineCota Kv pairs 创建 withdrawCota kv pairs
// Mint: Update DefineCota Kv pairs and create withdrawCota kv pairs
case 2:
updatedDefineCotas, withdrawCotas, err := bp.mintCotaUsecase.ParseMintCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.UpdatedDefineCotas = append(kvPair.UpdatedDefineCotas, updatedDefineCotas...)
kvPair.WithdrawCotas = append(kvPair.WithdrawCotas, withdrawCotas...)
// Withdraw 删除 HoldCota kv pairs 创建 withdrawCota kv pairs
// Withdraw: Delete HoldCota kv pairs and create withdrawCota kv pairs
case 3:
withdrawCotas, err := bp.withdrawCotaUsecase.ParseWithdrawCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.WithdrawCotas = append(kvPair.WithdrawCotas, withdrawCotas...)
// Claim 创建 HoldCota kv pairs claimedCota kv pairs
// Claim: Create HoldCota kv pairs and claimedCota kv pairs
case 4:
holdCotas, claimedCotas, err := bp.claimedCotaUsecase.ParseClaimedCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.ClaimedCotas = append(kvPair.ClaimedCotas, claimedCotas...)
kvPair.HoldCotas = append(kvPair.HoldCotas, holdCotas...)
// Update 更新 HoldCota kv pairs
// Update: Update HoldCota kv pairs
case 5:
holdCotas, err := bp.holdCotaUsecase.ParseHoldCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.UpdatedHoldCotas = append(kvPair.HoldCotas, holdCotas...)
// Transfer 创建 claimedCota kv pairs withdrawCota kv pairs
// Transfer: Create claimedCota kv pairs and withdrawCota kv pairs
case 6:
claimedCotas, withdrawCotas, err := bp.transferCotaUsecase.ParseTransferCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.ClaimedCotas = append(kvPair.ClaimedCotas, claimedCotas...)
kvPair.WithdrawCotas = append(kvPair.WithdrawCotas, withdrawCotas...)
// Claim and Update 创建 HoldCota kv pairs claimedCota kv pairs
// Claim and Update: Create HoldCota kv pairs and claimedCota kv pairs
case 7:
holdCotas, claimedCotas, err := bp.claimedCotaUsecase.ParseClaimedUpdateCotaEntries(blockNumber, entry)
if err != nil {
return kvPair, err
}
kvPair.ClaimedCotas = append(kvPair.ClaimedCotas, claimedCotas...)
kvPair.HoldCotas = append(kvPair.HoldCotas, holdCotas...)
// Transfer and Update 创建 claimedCota kv pairs withdrawCota kv pairs
// Transfer and Update: Create claimedCota kv pairs and withdrawCota kv pairs
case 8:
claimedCotas, withdrawCotas, err := bp.transferCotaUsecase.ParseTransferUpdateCotaEntries(blockNumber, entry)
if err != nil {
Expand Down
31 changes: 14 additions & 17 deletions internal/data/claimed_cota_nft_kv_pair.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import (
"context"
"encoding/binary"
"encoding/hex"
"hash/crc32"
"time"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/biz"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
"github.com/nervina-labs/cota-smt-go/smt"
"hash/crc32"
"time"
)

var _ biz.ClaimedCotaNftKvPairRepo = (*claimedCotaNftKvPairRepo)(nil)
Expand Down Expand Up @@ -54,17 +55,12 @@ func (rp claimedCotaNftKvPairRepo) DeleteClaimedCotaNftKvPairs(ctx context.Conte
}

func (rp claimedCotaNftKvPairRepo) ParseClaimedCotaEntries(blockNumber uint64, entry biz.Entry) (holdCotas []biz.HoldCotaNftKvPair, claimedCotas []biz.ClaimedCotaNftKvPair, err error) {
return rp.generateV0ToV2ClaimedKvPair(blockNumber, entry)
}
var (
holdCotaKeyVec *smt.HoldCotaNFTKeyVec
holdCotaValueVec *smt.HoldCotaNFTValueVec
claimedCotaKeyVec *smt.ClaimCotaNFTKeyVec
)

func (rp claimedCotaNftKvPairRepo) ParseClaimedUpdateCotaEntries(blockNumber uint64, entry biz.Entry) (holdCotas []biz.HoldCotaNftKvPair, claimedCotas []biz.ClaimedCotaNftKvPair, err error) {
return rp.generateV0ToV2ClaimedUpdateKvPair(blockNumber, entry)
}

func (rp claimedCotaNftKvPairRepo) generateV0ToV2ClaimedKvPair(blockNumber uint64, entry biz.Entry) (holdCotas []biz.HoldCotaNftKvPair, claimedCotas []biz.ClaimedCotaNftKvPair, err error) {
var holdCotaKeyVec *smt.HoldCotaNFTKeyVec = nil
var holdCotaValueVec *smt.HoldCotaNFTValueVec = nil
var claimedCotaKeyVec *smt.ClaimCotaNFTKeyVec = nil
if entry.Version == 0 {
entries := smt.ClaimCotaNFTEntriesFromSliceUnchecked(entry.InputType[1:])
holdCotaKeyVec = entries.HoldKeys()
Expand Down Expand Up @@ -114,10 +110,12 @@ func (rp claimedCotaNftKvPairRepo) generateV0ToV2ClaimedKvPair(blockNumber uint6
return
}

func (rp claimedCotaNftKvPairRepo) generateV0ToV2ClaimedUpdateKvPair(blockNumber uint64, entry biz.Entry) (holdCotas []biz.HoldCotaNftKvPair, claimedCotas []biz.ClaimedCotaNftKvPair, err error) {
var holdCotaKeyVec *smt.HoldCotaNFTKeyVec = nil
var holdCotaValueVec *smt.HoldCotaNFTValueVec = nil
var claimedCotaKeyVec *smt.ClaimCotaNFTKeyVec = nil
func (rp claimedCotaNftKvPairRepo) ParseClaimedUpdateCotaEntries(blockNumber uint64, entry biz.Entry) (holdCotas []biz.HoldCotaNftKvPair, claimedCotas []biz.ClaimedCotaNftKvPair, err error) {
var (
holdCotaKeyVec *smt.HoldCotaNFTKeyVec
holdCotaValueVec *smt.HoldCotaNFTValueVec
claimedCotaKeyVec *smt.ClaimCotaNFTKeyVec
)
if entry.Version == 0 {
entries := smt.ClaimUpdateCotaNFTEntriesFromSliceUnchecked(entry.InputType[1:])
holdCotaKeyVec = entries.HoldKeys()
Expand Down Expand Up @@ -167,4 +165,3 @@ func (rp claimedCotaNftKvPairRepo) generateV0ToV2ClaimedUpdateKvPair(blockNumber
}
return
}

6 changes: 4 additions & 2 deletions internal/data/cota_witness_args_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package data

import (
"context"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/biz"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/data/blockchain"
ckbTypes "github.com/nervosnetwork/ckb-sdk-go/types"
Expand Down Expand Up @@ -37,8 +38,7 @@ func (c CotaWitnessArgsParser) isCotaCell(output *ckbTypes.CellOutput, cotaType
return output.Type.CodeHash == cotaType.CodeHash && output.Type.HashType == cotaType.HashType
}

// inputs 中 cota cells 的个数一定与 outputs 中 cota cells 的个数相等
// 批量注册多个 cota cell 的时候 input 里可能没有 cota cell
// There are not cota cells in inputs for registry, otherwise the amount of cota cells in inputs and outputs must be same
func (c CotaWitnessArgsParser) cotaEntries(tx *ckbTypes.Transaction, txIndex uint32, cotaType SystemScript) ([]biz.Entry, error) {
inputCotaCellGroups, err := c.inputCotaCellGroups(tx.Inputs, cotaType)
if err != nil {
Expand Down Expand Up @@ -81,6 +81,7 @@ func (c CotaWitnessArgsParser) cotaEntries(tx *ckbTypes.Transaction, txIndex uin
LockScript: cotaCell.output.Lock,
TxIndex: txIndex,
Version: cotaCell.outputData[0],
TxHash: tx.Hash,
})
}
if witnessArgs.InputType().IsSome() {
Expand All @@ -93,6 +94,7 @@ func (c CotaWitnessArgsParser) cotaEntries(tx *ckbTypes.Transaction, txIndex uin
LockScript: cotaCell.output.Lock,
TxIndex: txIndex,
Version: cotaCell.outputData[0],
TxHash: tx.Hash,
})
}
}
Expand Down
2 changes: 1 addition & 1 deletion internal/data/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
var ProviderSet = wire.NewSet(NewData, NewDBMigration, NewCheckInfoRepo, NewRegisterCotaKvPairRepo,
NewDefineCotaNftKvPairRepo, NewHoldCotaNftKvPairRepo, NewWithdrawCotaNftKvPairRepo, NewClaimedCotaNftKvPairRepo,
NewKvPairRepo, NewSystemScripts, NewCkbNodeClient, NewBlockSyncer, NewMetadataSyncer, NewCotaWitnessArgsParser,
NewMintCotaKvPairRepo, NewTransferCotaKvPairRepo, NewIssuerInfoRepo, NewClassInfoRepo, NewInvalidDateRepo)
NewMintCotaKvPairRepo, NewTransferCotaKvPairRepo, NewIssuerInfoRepo, NewClassInfoRepo, NewInvalidDateRepo, NewWithdrawExtraInfoRepo)

type Data struct {
db *gorm.DB
Expand Down
5 changes: 3 additions & 2 deletions internal/data/define_cota_nft_kv_pair.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import (
"context"
"encoding/binary"
"encoding/hex"
"hash/crc32"
"time"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/biz"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
"github.com/nervina-labs/cota-smt-go/smt"
"hash/crc32"
"time"
)

var _ biz.DefineCotaNftKvPairRepo = (*defineCotaNftKvPairRepo)(nil)
Expand Down
5 changes: 3 additions & 2 deletions internal/data/hold_cota_nft_kv_pair.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import (
"context"
"encoding/binary"
"encoding/hex"
"hash/crc32"
"time"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/biz"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
"github.com/nervina-labs/cota-smt-go/smt"
"hash/crc32"
"time"
)

var _ biz.HoldCotaNftKvPairRepo = (*holdCotaNftKvPairRepo)(nil)
Expand Down
11 changes: 7 additions & 4 deletions internal/data/kv_pair.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ package data
import (
"context"
"errors"
"hash/crc32"
"time"

"github.com/nervina-labs/cota-nft-entries-syncer/internal/biz"
"github.com/nervina-labs/cota-nft-entries-syncer/internal/logger"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"hash/crc32"
"time"
)

var _ biz.KvPairRepo = (*kvPairRepo)(nil)
Expand Down Expand Up @@ -134,12 +135,14 @@ func (rp kvPairRepo) CreateCotaEntryKvPairs(ctx context.Context, checkInfo biz.C
TokenIndex: cota.TokenIndex,
OutPoint: cota.OutPoint,
OutPointCrc: cota.OutPointCrc,
TxHash: cota.TxHash,
State: cota.State,
Configure: cota.Configure,
Characteristic: cota.Characteristic,
ReceiverLockScriptId: cota.ReceiverLockScriptId,
LockHash: cota.LockHash,
LockHashCrc: cota.LockHashCrc,
LockScriptId: cota.LockScriptId,
Version: cota.Version,
}
}
Expand Down Expand Up @@ -473,7 +476,7 @@ func (rp kvPairRepo) CreateMetadataKvPairs(ctx context.Context, checkInfo biz.Ch
if err := tx.Model(IssuerInfoVersion{}).WithContext(ctx).Create(issuerInfoVersions).Error; err != nil {
return err
}
// upsert issuer info
// insert issuer info
issuerInfos := make([]IssuerInfo, len(kvPair.IssuerInfos))
for i, issuer := range kvPair.IssuerInfos {
issuerInfos[i] = IssuerInfo{
Expand Down Expand Up @@ -556,7 +559,7 @@ func (rp kvPairRepo) CreateMetadataKvPairs(ctx context.Context, checkInfo biz.Ch
if err := tx.Model(ClassInfoVersion{}).WithContext(ctx).Create(classInfoVersions).Error; err != nil {
return err
}
// upsert class info
// insert class info
classInfos := make([]ClassInfo, len(kvPair.ClassInfos))
for i, class := range kvPair.ClassInfos {
classInfos[i] = ClassInfo{
Expand Down
Loading

0 comments on commit d169946

Please sign in to comment.