bdledger-apis/test.md
huyingcong 08f427899c change go_package path
Summary: change go_package path

Test Plan: none

Reviewers: nex, wuyi

Reviewed By: nex

Differential Revision: https://phabricator.internetapi.cn/D29
2020-01-08 10:04:41 +08:00

1024 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Test
## Basic types
### common.ClientVersionResponse
```proto
message ClientVersionResponse {
string version = 1; // 节点客户端版本
}
```
### TransactionType
```proto
enum TransactionType {
RECORD = 0; // 通用数据记录
MESSAGE = 1; // 消息
CONTRACT_CREATION = 2; // 合约创建
CONTRACT_INVOCATION = 3; // 合约调用
CONTRACT_STATUS = 4; // 合约状态
}
```
### Transaction (in Transaction ledger)
```proto
message Transaction {
bytes block_hash = 1; // 事务所在的区块的哈希,当事务处于待确认状态时为`null`
uint32 index = 2; // 事务在区块中的位置 index当事务处于待确认状态时为`null`
bytes hash = 3; // 事务的哈希
TransactionType type = 4; // 事务类型
bytes from = 5; // 发送账户地址
uint64 nonce = 6; // 这条事务之前发送者所发送的事务数量
bytes to = 7; // 接收账户地址,或者调用的合约地址,或者`null`如为合约创建
bytes data = 8; // 数据或合约代码
bytes v = 9; // ECDSA recovery id
bytes r = 10; // ECDSA signature r
bytes s = 11; // ECDSA signature s
}
```
### Transaction (in Accounting chain)
```proto
message Transaction {
uint64 block_number = 1; // 事务所在的区块的区块号,当事务处于待确认状态时为`null`
bytes block_hash = 2; // 事务所在的区块的哈希,当事务处于待确认状态时为`null`
uint32 index = 3; // 事务在区块中的位置index当事务处于待确认状态时为`null`
bytes hash = 4; // 事务的哈希
TransactionType type = 5; // 事务类型
bytes from = 6; // 发送账户地址
uint64 nonce = 7; // 这条事务之前发送者所发送的事务数量
bytes to = 8; // 接收账户地址,或者调用的合约地址,或者`null`如为合约创建
bytes data = 9; // 数据或合约代码
bytes v = 10; // ECDSA recovery id
bytes r = 11; // ECDSA signature r
bytes s = 12; // ECDSA signature s
}
```
### Block (in Transaction ledger)
```proto
message Block {
uint64 index = 1; // 事务链本地区块索引,当区块处于待确认状态时为`null`
bytes hash = 2; // 区块的哈希,当区块处于待确认状态时为`null`
repeated bytes parent_hashes = 3; // 父区块的哈希
repeated bytes witnesses = 4; // 见证者账户地址
int64 timestamp = 5; // 区块产生时的 UNIX 时间戳,单位为秒
uint64 size = 6; // 区块大小的字节数
bytes transactions_root = 7; // 区块的事务树根
repeated Transaction transactions = 8; // 事务对象的数组,或为空
repeated bytes transaction_hashes = 9; // 20字节的交易哈希的数组或为空
}
```
### Block (in Accounting chain)
```proto
message Block {
uint64 number = 1; // 区块号,当区块处于待确认状态时为`null`
bytes hash = 2; // 区块的哈希,当区块处于待确认状态时为`null`
bytes parent_hash = 3; // 父区块的哈希
repeated bytes witnesses = 4; // 见证者账户地址的数组
int64 timestamp = 5; // 区块产生时的UNIX时间戳
uint64 size = 6; // 区块大小的字节数
bytes transactions_root = 7; // 区块的事务树根
repeated Transaction transactions = 8; // 事务对象的数组,或为空
repeated bytes transaction_hashes = 9; // 20字节的交易哈希的数组或为空
}
```
---
## Transaction ledger API
### ClientVersion
#### Request
```
google.protobuf.Empty
```
#### Response
```
bdledger.api.common.ClientVersionResponse
```
#### Test cases
##### 1
**Request**
```
(empty)
```
**Response**
```yaml
version: 'TxLedgerGo/v0.0.1alpha/darwin/go1.11'
```
---
### CreateLedger
#### Request
```proto
message CreateLedgerRequest {
string name = 1;
}
```
#### Response
```proto
message CreateLedgerResponse {
bool ok = 1;
}
```
#### Test cases
##### 1
**Request**
```yaml
name: 'test'
```
**Response**
```yaml
ok: true
```
##### 2
**Request**
Client:
```yaml
name: null
```
On the wire:
```yaml
name: '' (defualt value)
```
**Error**
```yaml
code: Code.InvalidArgument
message: 'name must not be empty'
details:
```
---
### GetLedgers
#### Request
```
google.protobuf.Empty
```
#### Response
```proto
message GetLedgersResponse {
repeated string ledgers = 1;
}
```
#### Test cases
##### 1
**Request**
```
(empty)
```
**Response**
```yaml
ledgers:
- 'first'
- 'second'
- 'third'
```
---
### BlockCount
#### Request
```proto
message BlockCountRequest {
string ledger = 1;
}
```
#### Response
```proto
message BlockCountResponse {
uint64 block_count = 1;
}
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
```
**Response**
```yaml
block_count: 2018
```
##### 2
**Request**
Client:
```yaml
ledger: null
```
On the wire:
```yaml
ledger: '' (defualt value)
```
**Error**
```yaml
code: Code.InvalidArgument
message: 'ledger must not be empty'
details:
```
---
### GetBlocks
#### Request
```proto
message GetBlocksRequest {
string ledger = 1;
uint64 from_index = 2;
uint32 count = 3; // Optional, default to 10, max value is 10
bool full_transaction = 4;
}
```
#### Response
```proto
message GetBlocksResponse {
repeated Block blocks = 1;
}
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
from_index: 2018
count: 1
full_transactions: true
```
**Response**
```yaml
blocks:
- index: 2018
hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
- block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 0
hash: 0x0404040404040404040404040404040404040404 (in bytes)
type: TransactionType.RECORD
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2018
to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
data: 0xdeadbeef (in bytes)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
- block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 1
hash: 0x1313131313131313131313131313131313131313 (in bytes)
type: TransactionType.MESSAGE
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2019
to: 0xfeedbabefeedbabefeedbabefeedbabefeedbabe (in bytes)
data: (empty bytes, default value)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
transaction_hashes:
```
##### 2
**Request**
```yaml
ledger: 'test'
from_index: 2018
```
**Response**
```yaml
blocks:
- index: 2018
hash: 0x0101010101010101010101010101010101010101 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2019
hash: 0x0202020202020202020202020202020202020202 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2020
hash: 0x0303030303030303030303030303030303030303 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2021
hash: 0x0404040404040404040404040404040404040404 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2022
hash: 0x0505050505050505050505050505050505050505 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2023
hash: 0x0606060606060606060606060606060606060606 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2024
hash: 0x0707070707070707070707070707070707070707 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2025
hash: 0x0808080808080808080808080808080808080808 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2026
hash: 0x0909090909090909090909090909090909090909 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- index: 2027
hash: 0x1010101010101010101010101010101010101010 (in bytes)
parent_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
```
---
### SendTransaction
#### Request
```proto
message SendTransactionRequest {
string ledger = 1;
message Transaction {
TransactionType type = 1;
bytes from = 2;
bytes to = 3;
bytes data = 4;
}
Transaction transaction = 2;
}
```
#### Response
```proto
message SendTransactionResponse {
bytes hash = 1;
}
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
transaction:
type: TransactionType.MESSAGE
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
to: 0xfeedbabefeedbabefeedbabefeedbabefeedbabe (in bytes)
data: 0xdeadbeef (in bytes)
```
**Response**
```yaml
hash: 0xd15ea5edd15ea5edd15ea5edd15ea5edd15ea5edd15ea5edd15ea5edd15ea5ed (in bytes)
```
##### 2
**Request**
```yaml
ledger: 'test'
transaction:
type: TransactionType.MESSAGE
from: null (in bytes)
to: 0x50bada55 (in bytes)
data: null (in bytes)
```
**Error**
```yaml
code: Code.InvalidArgument
message: 'Multiple invalid arguments'
details:
- field_violations: (of type InvalidArgument)
- field: 'transaction.from'
description: 'from must not be empty'
- field: 'transaction.to'
description: 'to must be a valid 20-byte address'
```
---
## Accounting chain API
### ClientVersion
#### Request
```
google.protobuf.Empty
```
#### Response
```
bdledger.api.common.ClientVersionResponse
```
#### Test cases
##### 1
**Request**
```
(empty)
```
**Response**
```yaml
version: 'AcChainGo/v0.0.1alpha/darwin/go1.11'
```
---
### BlockNumber
#### Request
```proto
message BlockNumberRequest {
string ledger = 1;
}
```
#### Response
```proto
message BlockNumberResponse {
uint64 block_number = 1;
}
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
```
**Response**
```yaml
block_number: 2018
```
##### 2
**Request**
Client:
```yaml
ledger: null
```
On the wire:
```yaml
ledger: '' (defualt value)
```
**Error**
```yaml
code: Code.InvalidArgument
message: 'ledger must not be empty'
details:
```
---
### GetBlockByNumber
#### Request
```proto
message GetBlockByNumberRequest {
string ledger = 1;
uint64 number = 2;
bool full_transaction = 3;
}
```
#### Response
```
Block
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
number: 2018
full_transaction: true
```
**Response**
```yaml
number: 2018
hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
parent_hash: 0xbabefacebabefacebabefacebabefacebabeface (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
- block_number: 2018
block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 0
hash: 0x0404040404040404040404040404040404040404 (in bytes)
type: TransactionType.RECORD
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2018
to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
data: 0xdeadbeef (in bytes)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
- block_number: 2018
block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 1
hash: 0x1313131313131313131313131313131313131313 (in bytes)
type: TransactionType.MESSAGE
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2019
to: 0xfeedbabefeedbabefeedbabefeedbabefeedbabe (in bytes)
data: (empty bytes, default value)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
transaction_hashes:
```
##### 2
**Request**
Client:
```yaml
ledger: 'test'
number: 2018
full_transaction: null
```
On the wire:
```yaml
ledger: 'test'
number: 2018
full_transaction: false (defualt value)
```
**Response**
```yaml
number: 2018
hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
parent_hash: 0xbabefacebabefacebabefacebabefacebabeface (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
```
---
### GetBlockByHash
#### Request
```proto
message GetBlockByHashRequest {
string ledger = 1;
bytes hash = 2;
bool full_transaction = 3;
}
```
#### Response
```
Block
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
full_transaction: false
```
**Response**
```yaml
number: 2018
hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
parent_hash: 0xbabefacebabefacebabefacebabefacebabeface (in bytes)
witnesses:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
- 0x5252525252525252525252525252525252525252 (in bytes)
timestamp: 2018050400000
size: 20180504
transactions_root: 0x50bada5550bada5550bada5550bada5550bada55 (in bytes)
transactions:
transaction_hashes:
- 0x0404040404040404040404040404040404040404 (in bytes)
- 0x1313131313131313131313131313131313131313 (in bytes)
```
---
### GetTransactionByHash
#### Request
```proto
message GetTransactionByHashRequest {
string ledger = 1;
bytes hash = 2;
}
```
#### Response
```
Transaction
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
hash: 0x0404040404040404040404040404040404040404 (in bytes)
```
**Response**
```yaml
block_number: 2018
block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 0
hash: 0x0404040404040404040404040404040404040404 (in bytes)
type: TransactionType.RECORD
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2018
to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
data: 0xdeadbeef (in bytes)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
```
---
### GetTransactionByBlockNumberAndIndex
#### Request
```proto
message GetTransactionByBlockNumberAndIndexRequest {
string ledger = 1;
uint64 block_number = 2;
uint32 index = 3;
}
```
#### Response
```
Transaction
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
block_number: 2018
index: 0
```
**Response**
```yaml
block_number: 2018
block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 0
hash: 0x0404040404040404040404040404040404040404 (in bytes)
type: TransactionType.RECORD
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2018
to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
data: 0xdeadbeef (in bytes)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
```
---
### GetTransactionByBlockHashAndIndex
#### Request
```proto
message GetTransactionByBlockHashAndIndexRequest {
string ledger = 1;
bytes block_hash = 2;
uint32 index = 3;
}
```
#### Response
```
Transaction
```
#### Test cases
##### 1
**Request**
```yaml
ledger: 'test'
block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 0
```
**Response**
```yaml
block_number: 2018
block_hash: 0xdeadc0dedeadc0dedeadc0dedeadc0dedeadc0de (in bytes)
index: 0
hash: 0x0404040404040404040404040404040404040404 (in bytes)
type: TransactionType.RECORD
from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
nonce: 2018
to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes)
data: 0xdeadbeef (in bytes)
v: 0x25 (in bytes)
r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes)
s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes)
```