Skip to content

Commit

Permalink
Handle Protocol 13
Browse files Browse the repository at this point in the history
  • Loading branch information
charlie-wasp committed Jul 15, 2020
1 parent 7d87841 commit 44695df
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 55 deletions.
87 changes: 56 additions & 31 deletions es/ledger_serializer_xdr.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,22 @@ import (
"github.com/stellar/go/xdr"
)

type txVersion int

const (
v0 = iota
v1 = iota
)

type txSetMember struct {
v txVersion
xdrV0 *xdr.TransactionV0
xdrV1 *xdr.Transaction
}

type ledgerSerializerXDR struct {
ledgerHeader *LedgerHeader
transactions []xdr.Transaction
txSet []txSetMember
transactionResults []xdr.TransactionResultPair
transactionMetas []xdr.TransactionMeta
changes []xdr.LedgerEntryChanges
Expand All @@ -20,33 +33,30 @@ type ledgerSerializerXDR struct {

// SerializeLedger serializes ledger data into ES bulk index data
func SerializeLedgerFromHistory(meta xdr.LedgerCloseMeta, buffer *bytes.Buffer) {
transactions := make([]xdr.Transaction, len(meta.V0.TxSet.Txs))
transactionResults := make([]xdr.TransactionResultPair, len(meta.V0.TxProcessing))
changes := make([]xdr.LedgerEntryChanges, len(meta.V0.TxProcessing))
transactionMetas := make([]xdr.TransactionMeta, len(meta.V0.TxProcessing))
serializer := &ledgerSerializerXDR{
txSet: make([]txSetMember, len(meta.V0.TxSet.Txs)),
ledgerHeader: NewLedgerHeaderFromHistory(meta.V0.LedgerHeader),
transactionResults: make([]xdr.TransactionResultPair, len(meta.V0.TxProcessing)),
changes: make([]xdr.LedgerEntryChanges, len(meta.V0.TxProcessing)),
transactionMetas: make([]xdr.TransactionMeta, len(meta.V0.TxProcessing)),
buffer: buffer,
}

for i, txe := range meta.V0.TxSet.Txs {
switch txe.Type {
case xdr.EnvelopeTypeEnvelopeTypeTxV0:
transactions[i] = txe.V0.Tx
serializer.txSet[i] = txSetMember{v: v0, xdrV0: &txe.V0.Tx}
case xdr.EnvelopeTypeEnvelopeTypeTx:
transactions[i] = txe.V1.Tx
serializer.txSet[i] = txSetMember{v: v1, xdrV1: &txe.V1.Tx}
default:
log.Fatal("Unknown type")
}
}

for i, txp := range meta.V0.TxProcessing {
transactionResults[i] = txp.Result
changes[i] = txp.FeeProcessing
transactionMetas[i] = txp.TxApplyProcessing
}

serializer := &ledgerSerializerXDR{
ledgerHeader: NewLedgerHeaderFromHistory(meta.V0.LedgerHeader),
transactions: transactions,
transactionResults: transactionResults,
transactionMetas: transactionMetas,
changes: changes,
buffer: buffer,
serializer.transactionResults[i] = txp.Result
serializer.changes[i] = txp.FeeProcessing
serializer.transactionMetas[i] = txp.TxApplyProcessing
}

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

for i, tx := range s.transactions {
transaction, err := NewTransactionFromXDR(
&transactionData{
xdr: tx,
result: s.transactionResults[i],
index: i + 1,
ledgerSeq: s.ledgerHeader.Seq,
closeTime: s.ledgerHeader.CloseTime,
},
)
for i, tx := range s.txSet {
txData := transactionData{
result: s.transactionResults[i],
index: i + 1,
ledgerSeq: s.ledgerHeader.Seq,
closeTime: s.ledgerHeader.CloseTime,
}

switch tx.v {
case v0:
txData.v = v0
txData.xdrV0 = tx.xdrV0
case v1:
txData.v = v1
txData.xdrV1 = tx.xdrV1
}

transaction, err := NewTransactionFromXDR(&txData)

if err != nil {
log.Fatal(err)
Expand All @@ -81,12 +99,17 @@ func (s *ledgerSerializerXDR) serialize() {
}
}

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

for index, operation := range operations {
result := (*operationResults)[index]
operation := ProduceOperation(transaction, &operation, &result, index+1)
operation, err := ProduceOperation(transaction, &operation, &result, index+1)

if err != nil {
return err
}

SerializeForBulk(operation, s.buffer)

if transaction.Successful {
Expand All @@ -104,6 +127,8 @@ func (s *ledgerSerializerXDR) serializeOperations(operations []xdr.Operation, op
}
}
}

return nil
}

func (s *ledgerSerializerXDR) serializeBalances(changes xdr.LedgerEntryChanges, transaction *Transaction, operation *Operation, source BalanceSource) int {
Expand Down
102 changes: 78 additions & 24 deletions es/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ type transactionData struct {
closeTime time.Time
// index of transaction in ledger
index int
xdr xdr.Transaction
v txVersion
xdrV0 *xdr.TransactionV0
xdrV1 *xdr.Transaction
result xdr.TransactionResultPair
}

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

//FIXME remove hardcoded network passphrase
txHash, err := network.HashTransaction(
data.xdr,
"Public Global Stellar Network ; September 2015",
var (
err error
txHash [32]byte
sourceAccountID string
maxFee int
operationsCount int
memo Memo
timeBounds TimeBounds
)

switch data.v {
case v0:
//FIXME remove hardcoded network passphrase
txHash, err = network.HashTransactionV0(
*data.xdrV0,
"Public Global Stellar Network ; September 2015",
)
if err != nil {
return nil, err
}

sourceAccountID, err = util.EncodeEd25519(data.xdrV0.SourceAccountEd25519)
maxFee = int(data.xdrV0.Fee)
operationsCount = len(data.xdrV0.Operations)

if data.xdrV0.Memo.Type != xdr.MemoTypeMemoNone {
value := stellar.MemoValue(data.xdrV0.Memo)

memo = Memo{
Type: int(data.xdrV0.Memo.Type),
Value: value.String,
}
}

if data.xdrV0.TimeBounds != nil {
timeBounds = TimeBounds{
MinTime: int64(data.xdrV0.TimeBounds.MinTime),
MaxTime: int64(data.xdrV0.TimeBounds.MaxTime),
}
}

case v1:
//FIXME remove hardcoded network passphrase
txHash, err = network.HashTransaction(
*data.xdrV1,
"Public Global Stellar Network ; September 2015",
)
if err != nil {
return nil, err
}

sourceAccountID, err = util.EncodeMuxedAccount(data.xdrV1.SourceAccount)
maxFee = int(data.xdrV1.Fee)
operationsCount = len(data.xdrV1.Operations)

if data.xdrV1.Memo.Type != xdr.MemoTypeMemoNone {
value := stellar.MemoValue(data.xdrV1.Memo)

memo = Memo{
Type: int(data.xdrV1.Memo.Type),
Value: value.String,
}
}

if data.xdrV1.TimeBounds != nil {
timeBounds = TimeBounds{
MinTime: int64(data.xdrV1.TimeBounds.MinTime),
MaxTime: int64(data.xdrV1.TimeBounds.MaxTime),
}
}
}

if err != nil {
return nil, err
}
Expand All @@ -125,29 +193,15 @@ func NewTransactionFromXDR(data *transactionData) (*Transaction, error) {
Index: data.index,
Seq: data.ledgerSeq,
PagingToken: PagingToken{LedgerSeq: data.ledgerSeq, TransactionOrder: data.index},
Fee: int(data.xdr.Fee),
MaxFee: maxFee,
FeeCharged: int(data.result.Result.FeeCharged),
OperationCount: len(data.xdr.Operations),
OperationCount: operationsCount,
CloseTime: data.closeTime,
Successful: resultCode == xdr.TransactionResultCodeTxSuccess,
ResultCode: int(resultCode),
SourceAccountID: data.xdr.SourceAccount.Address(),
}

if data.xdr.Memo.Type != xdr.MemoTypeMemoNone {
value := stellar.MemoValue(data.xdr.Memo)

tx.Memo = &Memo{
Type: int(data.xdr.Memo.Type),
Value: value.String,
}
}

if data.xdr.TimeBounds != nil {
tx.TimeBounds = &TimeBounds{
MinTime: int64(data.xdr.TimeBounds.MinTime),
MaxTime: int64(data.xdr.TimeBounds.MaxTime),
}
SourceAccountID: sourceAccountID,
Memo: &memo,
TimeBounds: &timeBounds,
}

return tx, nil
Expand Down

0 comments on commit 44695df

Please sign in to comment.