Skip to content

Commit

Permalink
Merge branch 'main' into captive-core-use-db
Browse files Browse the repository at this point in the history
  • Loading branch information
stellarsaur authored Nov 21, 2023
2 parents b4d0524 + 937f492 commit 1ad263c
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 66 deletions.
6 changes: 3 additions & 3 deletions cmd/crates/soroban-spec-typescript/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,12 @@ pub fn entry_to_ts(entry: &Entry) -> String {
output = format!(r#"return {output};"#);
};
let parse_result_xdr = if return_type == "void" {
r#"parseResultXdr: () => {}"#.to_owned()
r"parseResultXdr: () => {}".to_owned()
} else {
format!(
r#"parseResultXdr: (xdr): {return_type} => {{
r"parseResultXdr: (xdr): {return_type} => {{
{output}
}}"#
}}"
)
};
let js_name = jsify_name(name);
Expand Down
10 changes: 5 additions & 5 deletions cmd/crates/soroban-test/tests/it/arg_parsing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ fn parse_i256() {

#[test]
fn parse_bytes() {
let b = from_string_primitive(r#"beefface"#, &ScSpecTypeDef::Bytes).unwrap();
let b = from_string_primitive(r"beefface", &ScSpecTypeDef::Bytes).unwrap();
assert_eq!(
b,
ScVal::Bytes(ScBytes(vec![0xbe, 0xef, 0xfa, 0xce].try_into().unwrap()))
Expand All @@ -100,7 +100,7 @@ fn parse_bytes() {

#[test]
fn parse_bytes_when_hex_is_all_numbers() {
let b = from_string_primitive(r#"4554"#, &ScSpecTypeDef::Bytes).unwrap();
let b = from_string_primitive(r"4554", &ScSpecTypeDef::Bytes).unwrap();
assert_eq!(
b,
ScVal::Bytes(ScBytes(vec![0x45, 0x54].try_into().unwrap()))
Expand All @@ -111,7 +111,7 @@ fn parse_bytes_when_hex_is_all_numbers() {
#[test]
fn parse_bytesn() {
let b = from_string_primitive(
r#"beefface"#,
r"beefface",
&ScSpecTypeDef::BytesN(ScSpecTypeBytesN { n: 4 }),
)
.unwrap();
Expand All @@ -124,8 +124,8 @@ fn parse_bytesn() {

#[test]
fn parse_bytesn_when_hex_is_all_numbers() {
let b = from_string_primitive(r#"4554"#, &ScSpecTypeDef::BytesN(ScSpecTypeBytesN { n: 2 }))
.unwrap();
let b =
from_string_primitive(r"4554", &ScSpecTypeDef::BytesN(ScSpecTypeBytesN { n: 2 })).unwrap();
assert_eq!(
b,
ScVal::Bytes(ScBytes(vec![0x45, 0x54].try_into().unwrap()))
Expand Down
39 changes: 22 additions & 17 deletions cmd/soroban-rpc/internal/db/ledgerentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -260,16 +260,22 @@ func entryKeyToTTLEntryKey(key xdr.LedgerKey) (xdr.LedgerKey, error) {
}

func (l *ledgerEntryReadTx) GetLedgerEntries(keys ...xdr.LedgerKey) ([]LedgerKeyAndEntry, error) {
encodedKeys := make([]string, len(keys), 2*len(keys))
encodedKeyToKey := make(map[string]xdr.LedgerKey, len(keys))
encodedKeyToEncodedTTLLedgerKey := make(map[string]string, len(keys))
for _, k := range keys {
encodedKeys := make([]string, 0, 2*len(keys))
type keyToEncoded struct {
key xdr.LedgerKey
encodedKey string
encodedTTLKey *string
}
keysToEncoded := make([]keyToEncoded, len(keys))
for i, k := range keys {
k2 := k
keysToEncoded[i].key = k2
encodedKey, err := encodeLedgerKey(l.buffer, k)
if err != nil {
return nil, err
}
keysToEncoded[i].encodedKey = encodedKey
encodedKeys = append(encodedKeys, encodedKey)
encodedKeyToKey[encodedKey] = k
if !hasTTLKey(k) {
continue
}
Expand All @@ -281,7 +287,7 @@ func (l *ledgerEntryReadTx) GetLedgerEntries(keys ...xdr.LedgerKey) ([]LedgerKey
if err != nil {
return nil, err
}
encodedKeyToEncodedTTLLedgerKey[encodedKey] = encodedTTLKey
keysToEncoded[i].encodedTTLKey = &encodedTTLKey
encodedKeys = append(encodedKeys, encodedTTLKey)
}

Expand All @@ -290,32 +296,31 @@ func (l *ledgerEntryReadTx) GetLedgerEntries(keys ...xdr.LedgerKey) ([]LedgerKey
return nil, err
}

result := make([]LedgerKeyAndEntry, 0, len(rawResult))
for encodedKey, key := range encodedKeyToKey {
encodedEntry, ok := rawResult[encodedKey]
result := make([]LedgerKeyAndEntry, 0, len(keys))
for _, k2e := range keysToEncoded {
encodedEntry, ok := rawResult[k2e.encodedKey]
if !ok {
continue
}
var entry xdr.LedgerEntry
if err := xdr.SafeUnmarshal([]byte(encodedEntry), &entry); err != nil {
return nil, errors.Wrap(err, "cannot decode ledger entry from DB")
}
encodedExpKey, has := encodedKeyToEncodedTTLLedgerKey[encodedKey]
if !has {
result = append(result, LedgerKeyAndEntry{key, entry, nil})
if k2e.encodedTTLKey == nil {
result = append(result, LedgerKeyAndEntry{k2e.key, entry, nil})
continue
}
encodedExpEntry, ok := rawResult[encodedExpKey]
encodedTTLEntry, ok := rawResult[*k2e.encodedTTLKey]
if !ok {
// missing ttl key. This should not happen.
return nil, errors.New("missing ttl key entry")
}
var expEntry xdr.LedgerEntry
if err := xdr.SafeUnmarshal([]byte(encodedExpEntry), &expEntry); err != nil {
var ttlEntry xdr.LedgerEntry
if err := xdr.SafeUnmarshal([]byte(encodedTTLEntry), &ttlEntry); err != nil {
return nil, errors.Wrap(err, "cannot decode TTL ledger entry from DB")
}
liveUntilSeq := uint32(expEntry.Data.Ttl.LiveUntilLedgerSeq)
result = append(result, LedgerKeyAndEntry{key, entry, &liveUntilSeq})
liveUntilSeq := uint32(ttlEntry.Data.Ttl.LiveUntilLedgerSeq)
result = append(result, LedgerKeyAndEntry{k2e.key, entry, &liveUntilSeq})
}

return result, nil
Expand Down
18 changes: 14 additions & 4 deletions cmd/soroban-rpc/internal/methods/get_ledger_entries.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,18 @@ func NewGetLedgerEntriesHandler(logger *log.Entry, ledgerEntryReader db.LedgerEn
}
}

for i, ledgerKeyAndEntry := range ledgerKeysAndEntries {
ledgerXDR, err := xdr.MarshalBase64(ledgerKeyAndEntry.Entry.Data)
for _, ledgerKeyAndEntry := range ledgerKeysAndEntries {
keyXDR, err := xdr.MarshalBase64(ledgerKeyAndEntry.Key)
if err != nil {
logger.WithError(err).WithField("request", request).
Infof("could not serialize ledger key %v", ledgerKeyAndEntry.Key)
return GetLedgerEntriesResponse{}, &jrpc2.Error{
Code: jrpc2.InternalError,
Message: fmt.Sprintf("could not serialize ledger key %v", ledgerKeyAndEntry.Key),
}
}

entryXDR, err := xdr.MarshalBase64(ledgerKeyAndEntry.Entry.Data)
if err != nil {
logger.WithError(err).WithField("request", request).
Infof("could not serialize ledger entry data for ledger entry %v", ledgerKeyAndEntry.Entry)
Expand All @@ -120,8 +130,8 @@ func NewGetLedgerEntriesHandler(logger *log.Entry, ledgerEntryReader db.LedgerEn
}

ledgerEntryResults = append(ledgerEntryResults, LedgerEntryResult{
Key: request.Keys[i],
XDR: ledgerXDR,
Key: keyXDR,
XDR: entryXDR,
LastModifiedLedger: int64(ledgerKeyAndEntry.Entry.LastModifiedLedgerSeq),
LiveUntilLedgerSeq: ledgerKeyAndEntry.LiveUntilLedgerSeq,
})
Expand Down
70 changes: 45 additions & 25 deletions cmd/soroban-rpc/internal/test/get_ledger_entries_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/require"

"github.com/stellar/go/keypair"
proto "github.com/stellar/go/protocols/stellarcore"
"github.com/stellar/go/txnbuild"
"github.com/stellar/go/xdr"

Expand Down Expand Up @@ -80,8 +79,9 @@ func TestGetLedgerEntriesSucceeds(t *testing.T) {
ch := jhttp.NewChannel(test.sorobanRPCURL(), nil)
client := jrpc2.NewClient(ch, nil)

kp := keypair.Root(StandaloneNetworkPassphrase)
account := txnbuild.NewSimpleAccount(kp.Address(), 0)
sourceAccount := keypair.Root(StandaloneNetworkPassphrase)
address := sourceAccount.Address()
account := txnbuild.NewSimpleAccount(address, 0)

contractBinary := getHelloWorldContract(t)
params := preflightTransactionParams(t, client, txnbuild.TransactionParams{
Expand All @@ -96,35 +96,40 @@ func TestGetLedgerEntriesSucceeds(t *testing.T) {
},
})
tx, err := txnbuild.NewTransaction(params)
require.NoError(t, err)
tx, err = tx.Sign(StandaloneNetworkPassphrase, kp)
require.NoError(t, err)
b64, err := tx.Base64()
require.NoError(t, err)
assert.NoError(t, err)
sendSuccessfulTransaction(t, client, sourceAccount, tx)

sendTxRequest := methods.SendTransactionRequest{Transaction: b64}
var sendTxResponse methods.SendTransactionResponse
err = client.CallResult(context.Background(), "sendTransaction", sendTxRequest, &sendTxResponse)
require.NoError(t, err)
require.Equal(t, proto.TXStatusPending, sendTxResponse.Status)
params = preflightTransactionParams(t, client, txnbuild.TransactionParams{
SourceAccount: &account,
IncrementSequenceNum: true,
Operations: []txnbuild.Operation{
createCreateContractOperation(address, contractBinary),
},
BaseFee: txnbuild.MinBaseFee,
Preconditions: txnbuild.Preconditions{
TimeBounds: txnbuild.NewInfiniteTimeout(),
},
})
tx, err = txnbuild.NewTransaction(params)
assert.NoError(t, err)
sendSuccessfulTransaction(t, client, sourceAccount, tx)

txStatusResponse := getTransaction(t, client, sendTxResponse.Hash)
require.Equal(t, methods.TransactionStatusSuccess, txStatusResponse.Status)
contractID := getContractID(t, address, testSalt, StandaloneNetworkPassphrase)

contractHash := sha256.Sum256(contractBinary)
contractKeyB64, err := xdr.MarshalBase64(xdr.LedgerKey{
contractCodeKeyB64, err := xdr.MarshalBase64(xdr.LedgerKey{
Type: xdr.LedgerEntryTypeContractCode,
ContractCode: &xdr.LedgerKeyContractCode{
Hash: contractHash,
},
})
require.NoError(t, err)

// Doesn't exist.
sourceAccount := keypair.Root(StandaloneNetworkPassphrase).Address()
contractID := getContractID(t, sourceAccount, testSalt, StandaloneNetworkPassphrase)
notFoundKeyB64, err := xdr.MarshalBase64(getCounterLedgerKey(contractID))
require.NoError(t, err)

contractIDHash := xdr.Hash(contractID)
notFoundKeyB64, err := xdr.MarshalBase64(xdr.LedgerKey{
contractInstanceKeyB64, err := xdr.MarshalBase64(xdr.LedgerKey{
Type: xdr.LedgerEntryTypeContractData,
ContractData: &xdr.LedgerKeyContractData{
Contract: xdr.ScAddress{
Expand All @@ -139,21 +144,36 @@ func TestGetLedgerEntriesSucceeds(t *testing.T) {
})
require.NoError(t, err)

var keys []string
keys = append(keys, contractKeyB64)
keys = append(keys, notFoundKeyB64)
keys := []string{contractCodeKeyB64, notFoundKeyB64, contractInstanceKeyB64}
request := methods.GetLedgerEntriesRequest{
Keys: keys,
}

var result methods.GetLedgerEntriesResponse
err = client.CallResult(context.Background(), "getLedgerEntries", request, &result)
require.NoError(t, err)
require.Equal(t, 1, len(result.Entries))
require.Equal(t, 2, len(result.Entries))
require.Greater(t, result.LatestLedger, int64(0))

require.Greater(t, result.Entries[0].LastModifiedLedger, int64(0))
require.LessOrEqual(t, result.Entries[0].LastModifiedLedger, result.LatestLedger)
require.NotNil(t, result.Entries[0].LiveUntilLedgerSeq)
require.Greater(t, *result.Entries[0].LiveUntilLedgerSeq, uint32(result.LatestLedger))
require.Equal(t, contractCodeKeyB64, result.Entries[0].Key)
var firstEntry xdr.LedgerEntryData
require.NoError(t, xdr.SafeUnmarshalBase64(result.Entries[0].XDR, &firstEntry))
require.Equal(t, xdr.LedgerEntryTypeContractCode, firstEntry.Type)
require.Equal(t, contractBinary, firstEntry.MustContractCode().Code)
require.Equal(t, contractKeyB64, result.Entries[0].Key)

require.Greater(t, result.Entries[1].LastModifiedLedger, int64(0))
require.LessOrEqual(t, result.Entries[1].LastModifiedLedger, result.LatestLedger)
require.NotNil(t, result.Entries[1].LiveUntilLedgerSeq)
require.Greater(t, *result.Entries[1].LiveUntilLedgerSeq, uint32(result.LatestLedger))
require.Equal(t, contractInstanceKeyB64, result.Entries[1].Key)
var secondEntry xdr.LedgerEntryData
require.NoError(t, xdr.SafeUnmarshalBase64(result.Entries[1].XDR, &secondEntry))
require.Equal(t, xdr.LedgerEntryTypeContractData, secondEntry.Type)
require.True(t, secondEntry.MustContractData().Key.Equals(xdr.ScVal{
Type: xdr.ScValTypeScvLedgerKeyContractInstance,
}))
}
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ toolchain go1.21.1
require (
github.com/Masterminds/squirrel v1.5.4
github.com/cenkalti/backoff/v4 v4.2.1
github.com/creachadair/jrpc2 v1.1.1
github.com/creachadair/jrpc2 v1.1.2
github.com/go-chi/chi v4.1.2+incompatible
github.com/go-git/go-git/v5 v5.9.0
github.com/mattn/go-sqlite3 v1.14.17
Expand Down Expand Up @@ -52,15 +52,15 @@ require (
github.com/aws/aws-sdk-go v1.45.27 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/creachadair/mds v0.2.3 // indirect
github.com/creachadair/mds v0.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-errors/errors v1.5.1 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
Expand Down Expand Up @@ -89,7 +89,7 @@ require (
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sync v0.4.0 // indirect
golang.org/x/sync v0.5.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
Expand Down
16 changes: 8 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creachadair/jrpc2 v1.1.1 h1:xa7p3C5eSvwn/dFwCCmksp+RyQ/ytFY0NYzY7npsoI0=
github.com/creachadair/jrpc2 v1.1.1/go.mod h1:KajsO5dx7yfcwmuRJb5SHXsCVTzBoq7EsPzu5wxnsc0=
github.com/creachadair/mds v0.2.3 h1:Svuw/AXrUUMxGHdRyuDsWJ36oFJRprqP8+iI86XzZjM=
github.com/creachadair/mds v0.2.3/go.mod h1:PmXHgspUECelJVsAgDxWvjblna5BGjPxdEpr7SIEvNs=
github.com/creachadair/jrpc2 v1.1.2 h1:UOYMipEFYlwd5qmcvs9GZBurn3oXt1UDIX5JLjWWFzo=
github.com/creachadair/jrpc2 v1.1.2/go.mod h1:JcCe2Eny3lIvVwZLm92WXyU+tNUgTBWFCLMsfNkjEGk=
github.com/creachadair/mds v0.3.0 h1:uKbCKVtd3iOKVv3uviOm13fFNfe9qoCXJh1Vo7y3Kr0=
github.com/creachadair/mds v0.3.0/go.mod h1:4vrFYUzTXMJpMBU+OA292I6IUxKWCCfZkgXg+/kBZMo=
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand Down Expand Up @@ -180,8 +180,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5 h1:oERTZ1buOUYlpmKaqlO5fYmz8cZ1rYu5DieJzF4ZVmU=
github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
Expand Down Expand Up @@ -498,8 +498,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down

0 comments on commit 1ad263c

Please sign in to comment.