Skip to content
This repository was archived by the owner on Sep 13, 2022. It is now read-only.

Commit d1172f2

Browse files
authored
Merge pull request #2 from nervosnetwork/rc/v0.3.0
2 parents a80bea7 + 9a65970 commit d1172f2

27 files changed

+1988
-458
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
/.idea
1+
.idea/

CHANGELOG.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# [v0.3.0](https://github.com/shaojunda/ckb-rosetta-sdk/compare/v0.2.0...v.3.0) (2020-10-10)
2+
3+
4+
### Features
5+
6+
* add cell dep related errors ([741b4d0](https://github.com/shaojunda/ckb-rosetta-sdk/commit/741b4d0))
7+
* add cell deps validator ([bfaf2ab](https://github.com/shaojunda/ckb-rosetta-sdk/commit/bfaf2ab))
8+
* add ckb types ([9fc4641](https://github.com/shaojunda/ckb-rosetta-sdk/commit/9fc4641))
9+
* add coinChange to block operations ([cfb5715](https://github.com/shaojunda/ckb-rosetta-sdk/commit/cfb5715))
10+
* add coins to accountBalance ([03cf7c7](https://github.com/shaojunda/ckb-rosetta-sdk/commit/03cf7c7))
11+
* add confg to services ([4987cca](https://github.com/shaojunda/ckb-rosetta-sdk/commit/4987cca))
12+
* add DeriveMetadata ([d570873](https://github.com/shaojunda/ckb-rosetta-sdk/commit/d570873))
13+
* add getConstructionType function ([f67867e](https://github.com/shaojunda/ckb-rosetta-sdk/commit/f67867e))
14+
* add LockType ([fc0c680](https://github.com/shaojunda/ckb-rosetta-sdk/commit/fc0c680))
15+
* add lockType to derive response metadata ([4b0b7fc](https://github.com/shaojunda/ckb-rosetta-sdk/commit/4b0b7fc))
16+
* add more error types ([d1f24b7](https://github.com/shaojunda/ckb-rosetta-sdk/commit/d1f24b7))
17+
* add more errors ([bab5d7e](https://github.com/shaojunda/ckb-rosetta-sdk/commit/bab5d7e))
18+
* add more validator ([2518e0a](https://github.com/shaojunda/ckb-rosetta-sdk/commit/2518e0a))
19+
* add rosettaTransaction types ([e0b17f0](https://github.com/shaojunda/ckb-rosetta-sdk/commit/e0b17f0))
20+
* add sign message builder ([122a8d5](https://github.com/shaojunda/ckb-rosetta-sdk/commit/122a8d5))
21+
* add signedTx builder and factory ([fdae5b0](https://github.com/shaojunda/ckb-rosetta-sdk/commit/fdae5b0))
22+
* add some util function ([2dffec7](https://github.com/shaojunda/ckb-rosetta-sdk/commit/2dffec7))
23+
* add SupportedOperationTypes ([8db5076](https://github.com/shaojunda/ckb-rosetta-sdk/commit/8db5076))
24+
* add TxSizeEstimatorFactory ([5feddd9](https://github.com/shaojunda/ckb-rosetta-sdk/commit/5feddd9))
25+
* add unsigned tx builder factory ([d36ce2d](https://github.com/shaojunda/ckb-rosetta-sdk/commit/d36ce2d))
26+
* add unsignedTxBuilderSecp256k1 ([5dfcb26](https://github.com/shaojunda/ckb-rosetta-sdk/commit/5dfcb26))
27+
* add unsignedTxBuilderSecp256k1Blake160 ([40244db](https://github.com/shaojunda/ckb-rosetta-sdk/commit/40244db))
28+
* add validateSigningType function ([3b7d14f](https://github.com/shaojunda/ckb-rosetta-sdk/commit/3b7d14f))
29+
* complete ConstructionDerive ([271100d](https://github.com/shaojunda/ckb-rosetta-sdk/commit/271100d))
30+
* complete ConstructionParse ([17d98fe](https://github.com/shaojunda/ckb-rosetta-sdk/commit/17d98fe))
31+
* complete ConstructionPayloads ([9a5956f](https://github.com/shaojunda/ckb-rosetta-sdk/commit/9a5956f))
32+
* fetch live cells on metadata endpoint ([2bdb4c1](https://github.com/shaojunda/ckb-rosetta-sdk/commit/2bdb4c1))
33+
* generate input outpoints option ([8f69d3f](https://github.com/shaojunda/ckb-rosetta-sdk/commit/8f69d3f))
34+
* implement BuildCellDeps ([380ddab](https://github.com/shaojunda/ckb-rosetta-sdk/commit/380ddab))
35+
* implement BuildHeaderDeps ([fd57a6f](https://github.com/shaojunda/ckb-rosetta-sdk/commit/fd57a6f))
36+
* implement BuildOutputs ([7f2e49d](https://github.com/shaojunda/ckb-rosetta-sdk/commit/7f2e49d))
37+
* implement BuildOutputsData ([8541cdd](https://github.com/shaojunda/ckb-rosetta-sdk/commit/8541cdd))
38+
* implement BuildVersion ([ab34495](https://github.com/shaojunda/ckb-rosetta-sdk/commit/ab34495))
39+
* set suggested fee on metadata response ([4682a88](https://github.com/shaojunda/ckb-rosetta-sdk/commit/4682a88))
40+
* unsigned tx builder interface ([eecf03b](https://github.com/shaojunda/ckb-rosetta-sdk/commit/eecf03b))
41+
* use tx size estimator ([cfd8804](https://github.com/shaojunda/ckb-rosetta-sdk/commit/cfd8804))
42+
43+
44+

builder/sign_messages_builder.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package builder
2+
3+
import (
4+
"github.com/coinbase/rosetta-sdk-go/types"
5+
"github.com/nervosnetwork/ckb-sdk-go/transaction"
6+
ckbTypes "github.com/nervosnetwork/ckb-sdk-go/types"
7+
)
8+
9+
type SignMessagesBuilder interface {
10+
BuildSignMessages(tx *ckbTypes.Transaction, inputOperations []*types.Operation) ([][]byte, error)
11+
}
12+
13+
func NewSignMessagesBuilderSecp256k1Blake160() *SignMessagesBuilderSecp256k1Blake160 {
14+
return &SignMessagesBuilderSecp256k1Blake160{}
15+
}
16+
17+
type SignMessagesBuilderSecp256k1Blake160 struct{}
18+
19+
func (s SignMessagesBuilderSecp256k1Blake160) BuildSignMessages(tx *ckbTypes.Transaction, inputOperations []*types.Operation) ([][]byte, error) {
20+
indexGroups, err := BuildIndexGroups(inputOperations)
21+
if err != nil {
22+
return nil, err
23+
}
24+
var messages [][]byte
25+
for _, indexGroup := range indexGroups {
26+
message, err := transaction.SingleSegmentSignMessage(tx, indexGroup[0], indexGroup[0]+len(indexGroup), transaction.EmptyWitnessArg)
27+
if err != nil {
28+
return nil, err
29+
}
30+
messages = append(messages, message)
31+
}
32+
return messages, nil
33+
}

builder/signed_tx_builder.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package builder
2+
3+
import (
4+
"bytes"
5+
"github.com/coinbase/rosetta-sdk-go/types"
6+
ckbRpc "github.com/nervosnetwork/ckb-sdk-go/rpc"
7+
ckbTypes "github.com/nervosnetwork/ckb-sdk-go/types"
8+
)
9+
10+
type SignedTxBuilder interface {
11+
Combine(txStr string, signatures []*types.Signature) (signedTxStr string, err error)
12+
}
13+
14+
func NewSignedTxCombinerSecp256k1Blake160() *SignedTxCombinerSecp256k1Blake160 {
15+
return &SignedTxCombinerSecp256k1Blake160{}
16+
}
17+
18+
type SignedTxCombinerSecp256k1Blake160 struct{}
19+
20+
func (c SignedTxCombinerSecp256k1Blake160) Combine(unsignedTxStr string, signatures []*types.Signature) (string, error) {
21+
unsignedTx, err := ckbRpc.TransactionFromString(unsignedTxStr)
22+
if err != nil {
23+
return "", err
24+
}
25+
emptyWitnessArg := make([]byte, 85)
26+
sIndex := 0
27+
for i, witness := range unsignedTx.Witnesses {
28+
if bytes.Compare(witness, emptyWitnessArg) == 0 {
29+
witnessArgs := &ckbTypes.WitnessArgs{
30+
Lock: signatures[sIndex].Bytes,
31+
}
32+
serializedWitness, err := witnessArgs.Serialize()
33+
if err != nil {
34+
return "", err
35+
}
36+
unsignedTx.Witnesses[i] = serializedWitness
37+
sIndex++
38+
}
39+
}
40+
signedTxStr, err := ckbRpc.TransactionString(unsignedTx)
41+
if err != nil {
42+
return "", err
43+
}
44+
return signedTxStr, nil
45+
}

builder/signing_payload_builder.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package builder
2+
3+
import (
4+
"github.com/coinbase/rosetta-sdk-go/types"
5+
"github.com/nervosnetwork/ckb-rosetta-sdk/ckb"
6+
ckbTypes "github.com/nervosnetwork/ckb-sdk-go/types"
7+
)
8+
9+
type SigningPayloadBuilder interface {
10+
BuildSigningPayload(inputOperations []*types.Operation, unsignedTx *ckbTypes.Transaction) ([]*types.SigningPayload, error)
11+
}
12+
13+
func NewSigningPayloadBuilderSecp256k1Blake160(constructionType string, signMessagesBuilder SignMessagesBuilder) *SigningPayloadBuilderSecp256k1Blake160 {
14+
return &SigningPayloadBuilderSecp256k1Blake160{constructionType, signMessagesBuilder}
15+
}
16+
17+
type SigningPayloadBuilderSecp256k1Blake160 struct {
18+
ConstructionType string
19+
signMessagesBuilder SignMessagesBuilder
20+
}
21+
22+
func (b SigningPayloadBuilderSecp256k1Blake160) BuildSigningPayload(inputOperations []*types.Operation, unsignedTx *ckbTypes.Transaction) ([]*types.SigningPayload, error) {
23+
payloads := make([]*types.SigningPayload, 0)
24+
indexGroups, err := BuildIndexGroups(inputOperations)
25+
messages, err := b.signMessagesBuilder.BuildSignMessages(unsignedTx, inputOperations)
26+
metadata, err := types.MarshalMap(&ckb.AccountIdentifierMetadata{
27+
LockType: ckb.Secp256k1Blake160Lock.String(),
28+
})
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
for i, message := range messages {
34+
index := indexGroups[i][0]
35+
operation := inputOperations[index]
36+
payloads = append(payloads, &types.SigningPayload{
37+
AccountIdentifier: &types.AccountIdentifier{
38+
Address: operation.Account.Address,
39+
Metadata: metadata,
40+
},
41+
Bytes: message,
42+
SignatureType: types.EcdsaRecovery,
43+
})
44+
}
45+
46+
return payloads, nil
47+
}

builder/unsigned_tx_builder.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package builder
2+
3+
import (
4+
ckbTypes "github.com/nervosnetwork/ckb-sdk-go/types"
5+
)
6+
7+
// UnsignedTx is an interface for different script unsignedTxBuilder
8+
type UnsignedTxBuilder interface {
9+
BuildVersion() (uint, error)
10+
BuildCellDeps() ([]*ckbTypes.CellDep, error)
11+
BuildHeaderDeps() ([]ckbTypes.Hash, error)
12+
BuildInputs() ([]*ckbTypes.CellInput, map[string]interface{}, error)
13+
BuildOutputs(options map[string]interface{}) ([]*ckbTypes.CellOutput, map[string]interface{}, error)
14+
BuildOutputsData(options map[string]interface{}) ([][]byte, error)
15+
BuildWitnesses() ([][]byte, error)
16+
Build() (*ckbTypes.Transaction, error)
17+
}
18+
19+
type UnsignedTx struct {
20+
BuildVersion func() (uint, error)
21+
BuildCellDeps func() ([]*ckbTypes.CellDep, error)
22+
BuildHeaderDeps func() ([]ckbTypes.Hash, error)
23+
BuildInputs func() ([]*ckbTypes.CellInput, map[string]interface{}, error)
24+
BuildOutputs func(options map[string]interface{}) ([]*ckbTypes.CellOutput, map[string]interface{}, error)
25+
BuildOutputsData func(options map[string]interface{}) ([][]byte, error)
26+
BuildWitnesses func() ([][]byte, error)
27+
}
28+
29+
func (utb UnsignedTx) Build() (*ckbTypes.Transaction, error) {
30+
version, err := utb.BuildVersion()
31+
cellDeps, err := utb.BuildCellDeps()
32+
if err != nil {
33+
return nil, err
34+
}
35+
headerDeps, err := utb.BuildHeaderDeps()
36+
if err != nil {
37+
return nil, err
38+
}
39+
inputs, options, err := utb.BuildInputs()
40+
if err != nil {
41+
return nil, err
42+
}
43+
outputs, outputOptions, err := utb.BuildOutputs(options)
44+
if err != nil {
45+
return nil, err
46+
}
47+
outputsData, err := utb.BuildOutputsData(outputOptions)
48+
if err != nil {
49+
return nil, err
50+
}
51+
witnesses, err := utb.BuildWitnesses()
52+
if err != nil {
53+
return nil, err
54+
}
55+
tx := &ckbTypes.Transaction{
56+
Version: version,
57+
CellDeps: cellDeps,
58+
HeaderDeps: headerDeps,
59+
Inputs: inputs,
60+
Outputs: outputs,
61+
OutputsData: outputsData,
62+
Witnesses: witnesses,
63+
}
64+
65+
return tx, nil
66+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package builder
2+
3+
import (
4+
"github.com/coinbase/rosetta-sdk-go/types"
5+
"github.com/nervosnetwork/ckb-rosetta-sdk/server/config"
6+
"github.com/nervosnetwork/ckb-sdk-go/address"
7+
ckbTypes "github.com/nervosnetwork/ckb-sdk-go/types"
8+
"strconv"
9+
)
10+
11+
var _ UnsignedTxBuilder = UnsignedTxBuilderSecp256k1{}
12+
13+
const txVersion uint = 0
14+
15+
type UnsignedTxBuilderSecp256k1 struct {
16+
UnsignedTx
17+
Cfg *config.Config
18+
InputOperations []*types.Operation
19+
OutputOperations []*types.Operation
20+
}
21+
22+
func NewUnsignedTxBuilderSecp256k1(cfg *config.Config, inputOperations []*types.Operation, outputOperations []*types.Operation) *UnsignedTxBuilderSecp256k1 {
23+
b := UnsignedTxBuilderSecp256k1{
24+
Cfg: cfg,
25+
InputOperations: inputOperations,
26+
OutputOperations: outputOperations,
27+
}
28+
b.UnsignedTx.BuildVersion = b.BuildVersion
29+
b.UnsignedTx.BuildCellDeps = b.BuildCellDeps
30+
b.UnsignedTx.BuildHeaderDeps = b.BuildHeaderDeps
31+
b.UnsignedTx.BuildInputs = b.BuildInputs
32+
b.UnsignedTx.BuildOutputs = b.BuildOutputs
33+
b.UnsignedTx.BuildOutputsData = b.BuildOutputsData
34+
b.UnsignedTx.BuildWitnesses = b.BuildWitnesses
35+
return &b
36+
}
37+
38+
func (b UnsignedTxBuilderSecp256k1) BuildVersion() (uint, error) {
39+
return txVersion, nil
40+
}
41+
42+
func (b UnsignedTxBuilderSecp256k1) BuildCellDeps() ([]*ckbTypes.CellDep, error) {
43+
var cellDeps []*ckbTypes.CellDep
44+
cellDeps = append(cellDeps, &ckbTypes.CellDep{
45+
OutPoint: &ckbTypes.OutPoint{
46+
TxHash: ckbTypes.HexToHash(b.Cfg.Secp256k1Blake160.Deps[0].TxHash),
47+
Index: b.Cfg.Secp256k1Blake160.Deps[0].Index,
48+
},
49+
DepType: ckbTypes.DepType(b.Cfg.Secp256k1Blake160.Deps[0].DepType),
50+
})
51+
52+
return cellDeps, nil
53+
}
54+
55+
func (b UnsignedTxBuilderSecp256k1) BuildHeaderDeps() ([]ckbTypes.Hash, error) {
56+
return []ckbTypes.Hash{}, nil
57+
}
58+
59+
func (b UnsignedTxBuilderSecp256k1) BuildInputs() ([]*ckbTypes.CellInput, map[string]interface{}, error) {
60+
var cellInputs []*ckbTypes.CellInput
61+
for _, operation := range b.InputOperations {
62+
outPoint, err := GenerateOutPointFromCoinIdentifier(operation.CoinChange.CoinIdentifier.Identifier)
63+
if err != nil {
64+
return nil, nil, err
65+
}
66+
cellInputs = append(cellInputs, &ckbTypes.CellInput{
67+
Since: 0,
68+
PreviousOutput: outPoint,
69+
})
70+
}
71+
return cellInputs, nil, nil
72+
}
73+
74+
func (b UnsignedTxBuilderSecp256k1) BuildOutputs(options map[string]interface{}) ([]*ckbTypes.CellOutput, map[string]interface{}, error) {
75+
var cellOutputs []*ckbTypes.CellOutput
76+
for _, operation := range b.OutputOperations {
77+
parsedAddress, err := address.Parse(operation.Account.Address)
78+
if err != nil {
79+
return nil, nil, err
80+
}
81+
capacity, err := strconv.ParseUint(operation.Amount.Value, 10, 64)
82+
if err != nil {
83+
return nil, nil, err
84+
}
85+
cellOutputs = append(cellOutputs, &ckbTypes.CellOutput{
86+
Capacity: capacity,
87+
Lock: parsedAddress.Script,
88+
})
89+
}
90+
return cellOutputs, nil, nil
91+
}
92+
93+
func (b UnsignedTxBuilderSecp256k1) BuildOutputsData(options map[string]interface{}) ([][]byte, error) {
94+
var outputsData [][]byte
95+
outputsSize := len(b.OutputOperations)
96+
for i := 0; i < outputsSize; i++ {
97+
outputsData = append(outputsData, []byte{})
98+
}
99+
return outputsData, nil
100+
}
101+
102+
func (b UnsignedTxBuilderSecp256k1) BuildWitnesses() ([][]byte, error) {
103+
cellInputsSize := len(b.InputOperations)
104+
witnesses := make([][]byte, cellInputsSize)
105+
indexGroups, err := BuildIndexGroups(b.InputOperations)
106+
if err != nil {
107+
return nil, err
108+
}
109+
for _, indexes := range indexGroups {
110+
firstIndexOfGroup := indexes[0]
111+
witnesses[firstIndexOfGroup] = make([]byte, 85) // empty witnessArg placeholder
112+
}
113+
114+
return witnesses, nil
115+
}

0 commit comments

Comments
 (0)