diff --git a/address/address.go b/address/address.go index 8ced2130..0fe0a748 100644 --- a/address/address.go +++ b/address/address.go @@ -213,6 +213,8 @@ func toHrp(network types.Network) (string, error) { return "ckb", nil case types.NetworkTest: return "ckt", nil + case types.NetworkPreview: + return "ckt", nil default: return "", errors.New("unknown network") } diff --git a/collector/builder/builder.go b/collector/builder/builder.go index 5cf6288c..e4a215a2 100644 --- a/collector/builder/builder.go +++ b/collector/builder/builder.go @@ -30,7 +30,7 @@ type SimpleTransactionBuilder struct { // // To create an empty builder without script handlers, just uses '&SimpleTransactionBuilder{}'. func NewSimpleTransactionBuilder(network types.Network) *SimpleTransactionBuilder { - if network == types.NetworkMain || network == types.NetworkTest { + if network == types.NetworkMain || network == types.NetworkTest || network == types.NetworkPreview { s := SimpleTransactionBuilder{} s.Register(handler.NewSecp256k1Blake160SighashAllScriptHandler(network)) s.Register(handler.NewSecp256k1Blake160MultisigAllScriptHandler(network)) diff --git a/collector/handler/ckb.go b/collector/handler/ckb.go index 868a1b47..7e512295 100644 --- a/collector/handler/ckb.go +++ b/collector/handler/ckb.go @@ -19,6 +19,8 @@ func NewSecp256k1Blake160SighashAllScriptHandler(network types.Network) *Secp256 txHash = types.HexToHash("0x71a7ba8fc96349fea0ed3a5c47992e3b4084b031a42264a018e0072e8172e46c") } else if network == types.NetworkTest { txHash = types.HexToHash("0xf8de3bb47d055cdf460d93a2a6e1b05f7432f9777c8c474abf4eec1d4aee5d37") + } else if network == types.NetworkPreview { + txHash = types.HexToHash("0x0fab65924f2784f17ad7f86d6aef4b04ca1ca237102a68961594acebc5c77816") } else { return nil } @@ -66,6 +68,8 @@ func NewSecp256k1Blake160MultisigAllScriptHandler(network types.Network) *Secp25 txHash = types.HexToHash("0x71a7ba8fc96349fea0ed3a5c47992e3b4084b031a42264a018e0072e8172e46c") } else if network == types.NetworkTest { txHash = types.HexToHash("0xf8de3bb47d055cdf460d93a2a6e1b05f7432f9777c8c474abf4eec1d4aee5d37") + } else if network == types.NetworkPreview { + txHash = types.HexToHash("0x0fab65924f2784f17ad7f86d6aef4b04ca1ca237102a68961594acebc5c77816") } else { return nil } diff --git a/collector/handler/dao.go b/collector/handler/dao.go index d1ecd59a..39ab49d6 100644 --- a/collector/handler/dao.go +++ b/collector/handler/dao.go @@ -34,6 +34,8 @@ func NewDaoScriptHandler(network types.Network) *DaoScriptHandler { txHash = types.HexToHash("0xe2fb199810d49a4d8beec56718ba2593b665db9d52299a0f9e6e75416d73ff5c") } else if network == types.NetworkTest { txHash = types.HexToHash("0x8f8c79eb6671709633fe6a46de93c0fedc9c1b8a6527a18d3983879542635c9f") + } else if network == types.NetworkPreview { + txHash = types.HexToHash("0xe93c55bea88e10c64d9b218ee2b504bc89b9e5ee912186ff904c1827360a5362") } else { return nil } diff --git a/collector/handler/omnilock.go b/collector/handler/omnilock.go index 98bac93e..459ab1af 100644 --- a/collector/handler/omnilock.go +++ b/collector/handler/omnilock.go @@ -64,6 +64,28 @@ func NewOmnilockScriptHandler(network types.Network) *OmnilockScriptHandler { }, CodeHash: systemscript.GetCodeHash(network, systemscript.Omnilock), } + case types.NetworkPreview: + return &OmnilockScriptHandler{ + SingleSignCellDep: &types.CellDep{ + OutPoint: &types.OutPoint{ + TxHash: types.HexToHash("0x0fab65924f2784f17ad7f86d6aef4b04ca1ca237102a68961594acebc5c77816"), + Index: 0, + }, + DepType: types.DepTypeDepGroup, + }, + MultiSignCellDep: &types.CellDep{ + OutPoint: &types.OutPoint{ + TxHash: types.HexToHash("0x0fab65924f2784f17ad7f86d6aef4b04ca1ca237102a68961594acebc5c77816"), + Index: 1, + }, + DepType: types.DepTypeDepGroup, + }, + CellDep: &types.CellDep{ + OutPoint: systemscript.GetInfo(network, systemscript.Omnilock).OutPoint, + DepType: systemscript.GetInfo(network, systemscript.Omnilock).DepType, + }, + CodeHash: systemscript.GetCodeHash(network, systemscript.Omnilock), + } default: return nil } diff --git a/crypto/bech32/bech32.go b/crypto/bech32/bech32.go index f57289f5..7bbc2047 100644 --- a/crypto/bech32/bech32.go +++ b/crypto/bech32/bech32.go @@ -11,7 +11,9 @@ const charset = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" var gen = []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} const BECH32M_CONST = 0x2bc830a3 + type Encoding uint + const ( BECH32 Encoding = iota BECH32M @@ -42,7 +44,7 @@ func Decode(bech string) (Encoding, string, []byte, error) { decoded, err := toBytes(data) if err != nil { - return BECH32, "", nil, errors.New(fmt.Sprintf("failed converting data to bytes: %v", err)) + return BECH32, "", nil, errors.New(fmt.Sprintf("failed converting data to bytes: %v", err)) } ints := make([]int, len(decoded)) diff --git a/crypto/secp256k1/key_test.go b/crypto/secp256k1/key_test.go index 34843739..8bb5191f 100644 --- a/crypto/secp256k1/key_test.go +++ b/crypto/secp256k1/key_test.go @@ -15,4 +15,4 @@ func TestPubKey(t *testing.T) { assert.Equal(t, common.FromHex("0x04a0a7a7597b019828a1dda6ed52ab25181073ec3a9825d28b9abbb932fe1ec83dd117a8eef7649c25be5a591d08f80ffe7e9c14100ad1b58ac78afa606a576453"), encoded) encoded = k.PubKey() assert.Equal(t, common.FromHex("0x03a0a7a7597b019828a1dda6ed52ab25181073ec3a9825d28b9abbb932fe1ec83d"), encoded) -} \ No newline at end of file +} diff --git a/indexer/indexer_test.go b/indexer/indexer_test.go index 4e4ec8eb..e83bff9b 100644 --- a/indexer/indexer_test.go +++ b/indexer/indexer_test.go @@ -78,7 +78,7 @@ func TestGetCellsMaxLimit(t *testing.T) { } resp, err := c.GetCells(context.Background(), s, SearchOrderAsc, math.MaxUint32, "") checkError(t, err) - // TODO fix later + // TODO fix later // assert.Equal(t, 36, len(resp.Objects)) // Check response when `WithData` == true in request diff --git a/rpc/client.go b/rpc/client.go index be721eb5..d565c881 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -152,6 +152,9 @@ type Client interface { // SendTransaction send new transaction into transaction pool. SendTransaction(ctx context.Context, tx *types.Transaction) (*types.Hash, error) + // SendTestTransaction send new transaction into transaction pool. + SendTestTransaction(ctx context.Context, tx *types.Transaction) (*types.Hash, error) + /// Test if a transaction can be accepted by the transaction pool without inserting it into the pool or rebroadcasting it to peers. /// The parameters and errors of this method are the same as `send_transaction`. TestTxPoolAccept(ctx context.Context, tx *types.Transaction) (*types.EntryCompleted, error) @@ -167,6 +170,9 @@ type Client interface { // ClearTxPool Removes all transactions from the transaction pool. ClearTxPool(ctx context.Context) error + // Removes all transactions from the verification queue. + ClearTxVerifyQueue(ctx context.Context) error + ////// Stats // GetBlockchainInfo return state info of blockchain GetBlockchainInfo(ctx context.Context) (*types.BlockchainInfo, error) @@ -685,6 +691,17 @@ func (cli *client) SendTransaction(ctx context.Context, tx *types.Transaction) ( return &result, err } +func (cli *client) SendTestTransaction(ctx context.Context, tx *types.Transaction) (*types.Hash, error) { + var result types.Hash + + err := cli.c.CallContext(ctx, &result, "send_test_transaction", *tx, "passthrough") + if err != nil { + return nil, err + } + + return &result, err +} + // TestTxPoolAccept(ctx context.Context, tx *types.Transaction) (*types.EntryCompleted, error) func (cli *client) TestTxPoolAccept(ctx context.Context, tx *types.Transaction) (*types.EntryCompleted, error) { var result types.EntryCompleted @@ -728,6 +745,10 @@ func (cli *client) ClearTxPool(ctx context.Context) error { return cli.c.CallContext(ctx, nil, "clear_tx_pool") } +func (cli *client) ClearTxVerifyQueue(ctx context.Context) error { + return cli.c.CallContext(ctx, nil, "clear_tx_verify_queue") +} + func (cli *client) GetBlockchainInfo(ctx context.Context) (*types.BlockchainInfo, error) { var result types.BlockchainInfo err := cli.c.CallContext(ctx, &result, "get_blockchain_info") diff --git a/types/chain.go b/types/chain.go index bc5b6967..c5e0612e 100644 --- a/types/chain.go +++ b/types/chain.go @@ -231,9 +231,11 @@ type CellWithStatus struct { } type TxStatus struct { - Status TransactionStatus `json:"status"` - BlockHash *Hash `json:"block_hash"` - Reason *string `json:"reason"` + Status TransactionStatus `json:"status"` + BlockHash *Hash `json:"block_hash"` + BlockNumber *uint64 `json:"block_number"` + TxIndex *uint `json:"tx_index"` + Reason *string `json:"reason"` } type TransactionWithStatus struct { diff --git a/types/common.go b/types/common.go index e943d3df..496eb34f 100644 --- a/types/common.go +++ b/types/common.go @@ -17,6 +17,7 @@ const ( NetworkMain Network = iota NetworkTest + NetworkPreview WitnessTypeLock WitnessType = iota WitnessTypeInputType diff --git a/types/json.go b/types/json.go index ec4df79f..7c421ae2 100644 --- a/types/json.go +++ b/types/json.go @@ -413,6 +413,10 @@ type jsonSyncState struct { FastTime hexutil.Uint64 `json:"fast_time"` LowTime hexutil.Uint64 `json:"low_time"` NormalTime hexutil.Uint64 `json:"normal_time"` + TipHash Hash `json:"tip_hash"` + TipNumber hexutil.Uint64 `json:"tip_number"` + UnverifiedTipHash Hash `json:"unverified_tip_hash"` + UnverifiedTipNumber hexutil.Uint64 `json:"unverified_tip_number"` } func (t *SyncState) UnmarshalJSON(input []byte) error { @@ -429,6 +433,10 @@ func (t *SyncState) UnmarshalJSON(input []byte) error { FastTime: uint64(jsonObj.FastTime), LowTime: uint64(jsonObj.LowTime), NormalTime: uint64(jsonObj.NormalTime), + TipHash: jsonObj.TipHash, + TipNumber: uint64(jsonObj.TipNumber), + UnverifiedTipHash: jsonObj.UnverifiedTipHash, + UnverifiedTipNumber: uint64(jsonObj.UnverifiedTipNumber), } return nil } @@ -756,6 +764,53 @@ func (r *FeeRateStatics) MarshalJSON() ([]byte, error) { return json.Marshal(jsonObj) } +type jsonTxStatus struct { + Status TransactionStatus `json:"status"` + BlockHash *Hash `json:"block_hash"` + BlockNumber *hexutil.Uint64 `json:"block_number"` + TxIndex *hexutil.Uint `json:"tx_index"` + Reason *string `json:"reason"` +} + +func (r *TxStatus) MarshalJSON() ([]byte, error) { + jsonObj := &jsonTxStatus{ + Status: r.Status, + BlockHash: r.BlockHash, + Reason: r.Reason, + } + + if r.BlockNumber != nil { + jsonObj.BlockNumber = (*hexutil.Uint64)(r.BlockNumber) + } + if r.TxIndex != nil { + jsonObj.TxIndex = (*hexutil.Uint)(r.TxIndex) + } + return json.Marshal(jsonObj) +} + +func (r *TxStatus) UnmarshalJSON(input []byte) error { + var result jsonTxStatus + if err := json.Unmarshal(input, &result); err != nil { + return err + } + + *r = TxStatus{ + Status: result.Status, + BlockHash: result.BlockHash, + Reason: result.Reason, + } + + if result.BlockNumber != nil { + r.BlockNumber = (*uint64)(result.BlockNumber) + } + + if result.TxIndex != nil { + r.TxIndex = (*uint)(result.TxIndex) + } + + return nil +} + type jsonTransactionWithStatus struct { Transaction *Transaction `json:"transaction"` Cycles *hexutil.Uint64 `json:"cycles"` diff --git a/types/json_test.go b/types/json_test.go index c59670f9..824fa4e2 100644 --- a/types/json_test.go +++ b/types/json_test.go @@ -158,6 +158,8 @@ func TestJsonTransactionWithStatus(t *testing.T) { "cycles": "0x16e04e", "time_added_to_pool": null, "tx_status": { + "block_number": "0x55e4b2", + "tx_index": "0x0", "block_hash": "0xe1ed2d2282aad742a95abe51c21d50b1c19e194f21fbd1ed2516f82bd042579a", "status": "committed", "reason": null @@ -177,6 +179,8 @@ func TestRejectedJsonTransactionWithStatus(t *testing.T) { "cycles": null, "time_added_to_pool": null, "tx_status": { + "block_number": "0x55e4b2", + "tx_index": "0x0", "block_hash": "0xe1ed2d2282aad742a95abe51c21d50b1c19e194f21fbd1ed2516f82bd042579a", "status": "rejected", "reason": "{\"type\":\"Resolve\",\"description\":\"Resolve failed Dead(OutPoint(0xb7c0dff4c715fe47950f5192fa275bbfe76735eeba0017b7da77d5cd6e6a501200000000))\"}" @@ -198,6 +202,8 @@ func TestUnknownJsonTransactionWithStatus(t *testing.T) { "cycles": null, "time_added_to_pool": null, "tx_status": { + "block_number": "0x55e4b2", + "tx_index": "0x0", "block_hash": "0x7b00ed399a69eb6b4191ce45e8337835bf3ecadabb8d7281de50fa07fb2034f1", "status": "unknown", "reason": null diff --git a/types/net.go b/types/net.go index b5ab6697..42536275 100644 --- a/types/net.go +++ b/types/net.go @@ -66,4 +66,8 @@ type SyncState struct { FastTime uint64 `json:"fast_time"` LowTime uint64 `json:"low_time"` NormalTime uint64 `json:"normal_time"` + TipHash Hash `json:"tip_hash"` + TipNumber uint64 `json:"tip_number"` + UnverifiedTipHash Hash `json:"unverified_tip_hash"` + UnverifiedTipNumber uint64 `json:"unverified_tip_number"` } diff --git a/types/pool.go b/types/pool.go index ba02cecf..494920e4 100644 --- a/types/pool.go +++ b/types/pool.go @@ -1,15 +1,19 @@ package types type TxPoolInfo struct { - TipHash Hash `json:"tip_hash"` - TipNumber uint64 `json:"tip_number"` + LastTxsUpdatedAt uint64 `json:"last_txs_updated_at"` + MaxTxPoolSize uint64 `json:"max_tx_pool_size"` + MinFeeRate uint64 `json:"min_fee_rate"` + MinRbfRate uint64 `json:"min_fee_rate"` + Orphan uint64 `json:"orphan"` Pending uint64 `json:"pending"` Proposed uint64 `json:"proposed"` - Orphan uint64 `json:"orphan"` - TotalTxSize uint64 `json:"total_tx_size"` + TipHash Hash `json:"tip_hash"` + TipNumber uint64 `json:"tip_number"` TotalTxCycles uint64 `json:"total_tx_cycles"` - MinFeeRate uint64 `json:"min_fee_rate"` - LastTxsUpdatedAt uint64 `json:"last_txs_updated_at"` + TotalTxSize uint64 `json:"total_tx_size"` + TxSizeLimit uint64 `json:"tx_size_limit"` + VerifyQueueSize uint64 `json:"verify_queue_size"` } type RawTxPool struct {