-
Notifications
You must be signed in to change notification settings - Fork 0
/
transaction.go
87 lines (78 loc) · 3.19 KB
/
transaction.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package serialization
import (
"math"
"github.com/Nirvana-Chain/nirvanad/domain/consensus/model/externalapi"
"github.com/pkg/errors"
)
// DomainTransactionToDbTransaction converts DomainTransaction to DbTransaction
func DomainTransactionToDbTransaction(domainTransaction *externalapi.DomainTransaction) *DbTransaction {
dbInputs := make([]*DbTransactionInput, len(domainTransaction.Inputs))
for i, domainTransactionInput := range domainTransaction.Inputs {
dbInputs[i] = &DbTransactionInput{
PreviousOutpoint: DomainOutpointToDbOutpoint(&domainTransactionInput.PreviousOutpoint),
SignatureScript: domainTransactionInput.SignatureScript,
Sequence: domainTransactionInput.Sequence,
SigOpCount: uint32(domainTransactionInput.SigOpCount),
}
}
dbOutputs := make([]*DbTransactionOutput, len(domainTransaction.Outputs))
for i, domainTransactionOutput := range domainTransaction.Outputs {
dbScriptPublicKey := ScriptPublicKeyToDBScriptPublicKey(domainTransactionOutput.ScriptPublicKey)
dbOutputs[i] = &DbTransactionOutput{
Value: domainTransactionOutput.Value,
ScriptPublicKey: dbScriptPublicKey,
}
}
return &DbTransaction{
Version: uint32(domainTransaction.Version),
Inputs: dbInputs,
Outputs: dbOutputs,
LockTime: domainTransaction.LockTime,
SubnetworkID: DomainSubnetworkIDToDbSubnetworkID(&domainTransaction.SubnetworkID),
Gas: domainTransaction.Gas,
Payload: domainTransaction.Payload,
}
}
// DbTransactionToDomainTransaction converts DbTransaction to DomainTransaction
func DbTransactionToDomainTransaction(dbTransaction *DbTransaction) (*externalapi.DomainTransaction, error) {
domainSubnetworkID, err := DbSubnetworkIDToDomainSubnetworkID(dbTransaction.SubnetworkID)
if err != nil {
return nil, err
}
domainInputs := make([]*externalapi.DomainTransactionInput, len(dbTransaction.Inputs))
for i, dbTransactionInput := range dbTransaction.Inputs {
domainPreviousOutpoint, err := DbOutpointToDomainOutpoint(dbTransactionInput.PreviousOutpoint)
if err != nil {
return nil, err
}
domainInputs[i] = &externalapi.DomainTransactionInput{
PreviousOutpoint: *domainPreviousOutpoint,
SignatureScript: dbTransactionInput.SignatureScript,
Sequence: dbTransactionInput.Sequence,
SigOpCount: byte(dbTransactionInput.SigOpCount),
}
}
domainOutputs := make([]*externalapi.DomainTransactionOutput, len(dbTransaction.Outputs))
for i, dbTransactionOutput := range dbTransaction.Outputs {
scriptPublicKey, err := DBScriptPublicKeyToScriptPublicKey(dbTransactionOutput.ScriptPublicKey)
if err != nil {
return nil, err
}
domainOutputs[i] = &externalapi.DomainTransactionOutput{
Value: dbTransactionOutput.Value,
ScriptPublicKey: scriptPublicKey,
}
}
if dbTransaction.Version > math.MaxUint16 {
return nil, errors.Errorf("The transaction version is bigger then uint16.")
}
return &externalapi.DomainTransaction{
Version: uint16(dbTransaction.Version),
Inputs: domainInputs,
Outputs: domainOutputs,
LockTime: dbTransaction.LockTime,
SubnetworkID: *domainSubnetworkID,
Gas: dbTransaction.Gas,
Payload: dbTransaction.Payload,
}, nil
}