Skip to content

Commit 44695df

Browse files
committed
Handle Protocol 13
1 parent 7d87841 commit 44695df

2 files changed

Lines changed: 134 additions & 55 deletions

File tree

es/ledger_serializer_xdr.go

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,22 @@ import (
88
"github.com/stellar/go/xdr"
99
)
1010

11+
type txVersion int
12+
13+
const (
14+
v0 = iota
15+
v1 = iota
16+
)
17+
18+
type txSetMember struct {
19+
v txVersion
20+
xdrV0 *xdr.TransactionV0
21+
xdrV1 *xdr.Transaction
22+
}
23+
1124
type ledgerSerializerXDR struct {
1225
ledgerHeader *LedgerHeader
13-
transactions []xdr.Transaction
26+
txSet []txSetMember
1427
transactionResults []xdr.TransactionResultPair
1528
transactionMetas []xdr.TransactionMeta
1629
changes []xdr.LedgerEntryChanges
@@ -20,33 +33,30 @@ type ledgerSerializerXDR struct {
2033

2134
// SerializeLedger serializes ledger data into ES bulk index data
2235
func SerializeLedgerFromHistory(meta xdr.LedgerCloseMeta, buffer *bytes.Buffer) {
23-
transactions := make([]xdr.Transaction, len(meta.V0.TxSet.Txs))
24-
transactionResults := make([]xdr.TransactionResultPair, len(meta.V0.TxProcessing))
25-
changes := make([]xdr.LedgerEntryChanges, len(meta.V0.TxProcessing))
26-
transactionMetas := make([]xdr.TransactionMeta, len(meta.V0.TxProcessing))
36+
serializer := &ledgerSerializerXDR{
37+
txSet: make([]txSetMember, len(meta.V0.TxSet.Txs)),
38+
ledgerHeader: NewLedgerHeaderFromHistory(meta.V0.LedgerHeader),
39+
transactionResults: make([]xdr.TransactionResultPair, len(meta.V0.TxProcessing)),
40+
changes: make([]xdr.LedgerEntryChanges, len(meta.V0.TxProcessing)),
41+
transactionMetas: make([]xdr.TransactionMeta, len(meta.V0.TxProcessing)),
42+
buffer: buffer,
43+
}
2744

2845
for i, txe := range meta.V0.TxSet.Txs {
2946
switch txe.Type {
3047
case xdr.EnvelopeTypeEnvelopeTypeTxV0:
31-
transactions[i] = txe.V0.Tx
48+
serializer.txSet[i] = txSetMember{v: v0, xdrV0: &txe.V0.Tx}
3249
case xdr.EnvelopeTypeEnvelopeTypeTx:
33-
transactions[i] = txe.V1.Tx
50+
serializer.txSet[i] = txSetMember{v: v1, xdrV1: &txe.V1.Tx}
51+
default:
52+
log.Fatal("Unknown type")
3453
}
3554
}
3655

3756
for i, txp := range meta.V0.TxProcessing {
38-
transactionResults[i] = txp.Result
39-
changes[i] = txp.FeeProcessing
40-
transactionMetas[i] = txp.TxApplyProcessing
41-
}
42-
43-
serializer := &ledgerSerializerXDR{
44-
ledgerHeader: NewLedgerHeaderFromHistory(meta.V0.LedgerHeader),
45-
transactions: transactions,
46-
transactionResults: transactionResults,
47-
transactionMetas: transactionMetas,
48-
changes: changes,
49-
buffer: buffer,
57+
serializer.transactionResults[i] = txp.Result
58+
serializer.changes[i] = txp.FeeProcessing
59+
serializer.transactionMetas[i] = txp.TxApplyProcessing
5060
}
5161

5262
serializer.serialize()
@@ -55,16 +65,24 @@ func SerializeLedgerFromHistory(meta xdr.LedgerCloseMeta, buffer *bytes.Buffer)
5565
func (s *ledgerSerializerXDR) serialize() {
5666
SerializeForBulk(s.ledgerHeader, s.buffer)
5767

58-
for i, tx := range s.transactions {
59-
transaction, err := NewTransactionFromXDR(
60-
&transactionData{
61-
xdr: tx,
62-
result: s.transactionResults[i],
63-
index: i + 1,
64-
ledgerSeq: s.ledgerHeader.Seq,
65-
closeTime: s.ledgerHeader.CloseTime,
66-
},
67-
)
68+
for i, tx := range s.txSet {
69+
txData := transactionData{
70+
result: s.transactionResults[i],
71+
index: i + 1,
72+
ledgerSeq: s.ledgerHeader.Seq,
73+
closeTime: s.ledgerHeader.CloseTime,
74+
}
75+
76+
switch tx.v {
77+
case v0:
78+
txData.v = v0
79+
txData.xdrV0 = tx.xdrV0
80+
case v1:
81+
txData.v = v1
82+
txData.xdrV1 = tx.xdrV1
83+
}
84+
85+
transaction, err := NewTransactionFromXDR(&txData)
6886

6987
if err != nil {
7088
log.Fatal(err)
@@ -81,12 +99,17 @@ func (s *ledgerSerializerXDR) serialize() {
8199
}
82100
}
83101

84-
func (s *ledgerSerializerXDR) serializeOperations(operations []xdr.Operation, operationResults *[]xdr.OperationResult, transaction *Transaction) {
102+
func (s *ledgerSerializerXDR) serializeOperations(operations []xdr.Operation, operationResults *[]xdr.OperationResult, transaction *Transaction) error {
85103
// effectsCount := 0
86104

87105
for index, operation := range operations {
88106
result := (*operationResults)[index]
89-
operation := ProduceOperation(transaction, &operation, &result, index+1)
107+
operation, err := ProduceOperation(transaction, &operation, &result, index+1)
108+
109+
if err != nil {
110+
return err
111+
}
112+
90113
SerializeForBulk(operation, s.buffer)
91114

92115
if transaction.Successful {
@@ -104,6 +127,8 @@ func (s *ledgerSerializerXDR) serializeOperations(operations []xdr.Operation, op
104127
}
105128
}
106129
}
130+
131+
return nil
107132
}
108133

109134
func (s *ledgerSerializerXDR) serializeBalances(changes xdr.LedgerEntryChanges, transaction *Transaction, operation *Operation, source BalanceSource) int {

es/transaction.go

Lines changed: 78 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ type transactionData struct {
1919
closeTime time.Time
2020
// index of transaction in ledger
2121
index int
22-
xdr xdr.Transaction
22+
v txVersion
23+
xdrV0 *xdr.TransactionV0
24+
xdrV1 *xdr.Transaction
2325
result xdr.TransactionResultPair
2426
}
2527

@@ -110,12 +112,78 @@ func (s *ledgerSerializer) NewTransaction(row *db.TxHistoryRow, t time.Time) (*T
110112
func NewTransactionFromXDR(data *transactionData) (*Transaction, error) {
111113
resultCode := data.result.Result.Result.Code
112114

113-
//FIXME remove hardcoded network passphrase
114-
txHash, err := network.HashTransaction(
115-
data.xdr,
116-
"Public Global Stellar Network ; September 2015",
115+
var (
116+
err error
117+
txHash [32]byte
118+
sourceAccountID string
119+
maxFee int
120+
operationsCount int
121+
memo Memo
122+
timeBounds TimeBounds
117123
)
118124

125+
switch data.v {
126+
case v0:
127+
//FIXME remove hardcoded network passphrase
128+
txHash, err = network.HashTransactionV0(
129+
*data.xdrV0,
130+
"Public Global Stellar Network ; September 2015",
131+
)
132+
if err != nil {
133+
return nil, err
134+
}
135+
136+
sourceAccountID, err = util.EncodeEd25519(data.xdrV0.SourceAccountEd25519)
137+
maxFee = int(data.xdrV0.Fee)
138+
operationsCount = len(data.xdrV0.Operations)
139+
140+
if data.xdrV0.Memo.Type != xdr.MemoTypeMemoNone {
141+
value := stellar.MemoValue(data.xdrV0.Memo)
142+
143+
memo = Memo{
144+
Type: int(data.xdrV0.Memo.Type),
145+
Value: value.String,
146+
}
147+
}
148+
149+
if data.xdrV0.TimeBounds != nil {
150+
timeBounds = TimeBounds{
151+
MinTime: int64(data.xdrV0.TimeBounds.MinTime),
152+
MaxTime: int64(data.xdrV0.TimeBounds.MaxTime),
153+
}
154+
}
155+
156+
case v1:
157+
//FIXME remove hardcoded network passphrase
158+
txHash, err = network.HashTransaction(
159+
*data.xdrV1,
160+
"Public Global Stellar Network ; September 2015",
161+
)
162+
if err != nil {
163+
return nil, err
164+
}
165+
166+
sourceAccountID, err = util.EncodeMuxedAccount(data.xdrV1.SourceAccount)
167+
maxFee = int(data.xdrV1.Fee)
168+
operationsCount = len(data.xdrV1.Operations)
169+
170+
if data.xdrV1.Memo.Type != xdr.MemoTypeMemoNone {
171+
value := stellar.MemoValue(data.xdrV1.Memo)
172+
173+
memo = Memo{
174+
Type: int(data.xdrV1.Memo.Type),
175+
Value: value.String,
176+
}
177+
}
178+
179+
if data.xdrV1.TimeBounds != nil {
180+
timeBounds = TimeBounds{
181+
MinTime: int64(data.xdrV1.TimeBounds.MinTime),
182+
MaxTime: int64(data.xdrV1.TimeBounds.MaxTime),
183+
}
184+
}
185+
}
186+
119187
if err != nil {
120188
return nil, err
121189
}
@@ -125,29 +193,15 @@ func NewTransactionFromXDR(data *transactionData) (*Transaction, error) {
125193
Index: data.index,
126194
Seq: data.ledgerSeq,
127195
PagingToken: PagingToken{LedgerSeq: data.ledgerSeq, TransactionOrder: data.index},
128-
Fee: int(data.xdr.Fee),
196+
MaxFee: maxFee,
129197
FeeCharged: int(data.result.Result.FeeCharged),
130-
OperationCount: len(data.xdr.Operations),
198+
OperationCount: operationsCount,
131199
CloseTime: data.closeTime,
132200
Successful: resultCode == xdr.TransactionResultCodeTxSuccess,
133201
ResultCode: int(resultCode),
134-
SourceAccountID: data.xdr.SourceAccount.Address(),
135-
}
136-
137-
if data.xdr.Memo.Type != xdr.MemoTypeMemoNone {
138-
value := stellar.MemoValue(data.xdr.Memo)
139-
140-
tx.Memo = &Memo{
141-
Type: int(data.xdr.Memo.Type),
142-
Value: value.String,
143-
}
144-
}
145-
146-
if data.xdr.TimeBounds != nil {
147-
tx.TimeBounds = &TimeBounds{
148-
MinTime: int64(data.xdr.TimeBounds.MinTime),
149-
MaxTime: int64(data.xdr.TimeBounds.MaxTime),
150-
}
202+
SourceAccountID: sourceAccountID,
203+
Memo: &memo,
204+
TimeBounds: &timeBounds,
151205
}
152206

153207
return tx, nil

0 commit comments

Comments
 (0)