diff --git a/test.md b/test.md new file mode 100644 index 0000000..fda06bd --- /dev/null +++ b/test.md @@ -0,0 +1,678 @@ +## Basic types + +### Error + +```proto +message Error { + string code = 1; // One of a server-defined set of error codes. + string message = 2; // A human-readable representation of the error. + string target = 3; // The target of the error. + repeated Error details = 4; // An array of details about specific errors that led to this reported error. +} +``` + +### ClientVersionResponse + +```proto +message ClientVersionResponse { + Error error = 1; + string version = 2; // 节点客户端版本 +} +``` + +### TransactionType + +```proto +enum TransactionType { + RECORD = 0; // 通用数据记录 + MESSAGE = 1; // 消息 + CONTRACT_CREATION = 2; // 合约创建 + CONTRACT_INVOCATION = 3; // 合约调用 +} +``` + +### Transaction + +```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 + +```proto +message Block { + uint64 number = 1; // 区块号,当区块处于待确认状态时为`null` + bytes hash = 2; // 区块的哈希,当区块处于待确认状态时为`null` + bytes parent_hash = 3; // 父区块的哈希 + bytes witness = 4; // 见证者账户地址 + uint64 timestamp = 5; // 区块产生时的UNIX时间戳 + uint64 size = 6; // 区块大小的字节数 + bytes transactions_root = 7; // 区块的事务树根 + repeated Transaction transactions = 8; // 事务对象的数组,或为空 + repeated bytes transaction_hashes = 9; // 32字节的交易哈希的数组,或为空 +} +``` + +### BlockResponse + +```proto +message BlockResponse { + Error error = 1; + Block block = 2; +} +``` + +### TransactionResponse + +```proto +message TransactionResponse { + Error error = 1; + Transaction transaction = 2; +} +``` + +--- + +## Transaction ledger API + +### ClientVersion + +#### Request + +``` +google.protobuf.Empty +``` + +#### Response + +``` +bdchain.api.ClientVersionResponse +``` + +#### Test cases + +##### 1 + +**Request** +``` +(empty) +``` + +**Response** +```yaml +error: (empty Error object) +version: 'TxLedgerGo/v0.0.1alpha/darwin/go1.11' +``` + +--- + +### CreateLedger + +#### Request + +```proto +message CreateLedgerRequest { + string name = 1; +} +``` + +#### Response + +```proto +message CreateLedgerResponse { + Error error = 1; +} +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +name: 'test' +``` + +**Response** +```yaml +error: (empty Error object) +``` + +##### 2 + +**Request** + +Client: +```yaml +name: null +``` +On the wire: +```yaml +name: '' (defualt value) +``` + +**Response** +```yaml +error: + code: 'BadArgument' + message: 'name must not be empty' + target: 'name' + details: +``` + +--- + +### GetLedgers + +#### Request + +``` +google.protobuf.Empty +``` + +#### Response + +```proto +message GetLedgersResponse { + Error error = 1; + repeated string ledgers = 2; +} +``` + +#### Test cases + +##### 1 + +**Request** +``` +(empty) +``` + +**Response** +```yaml +error: (empty Error object) +ledgers: + - 'first' + - 'second' + - 'third' +``` + +--- + +### 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 { + Error error = 1; + bytes hash = 2; +} +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +transaction: + type: TransactionType.MESSAGE + from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + to: 0xfeedbabefeedbabefeedbabefeedbabefeedbabefeedbabefeedbabefeedbabe (in bytes) + data: 0xdeadbeef (in bytes) +``` + +**Response** +```yaml +error: (empty Error object) +hash: 0xd15ea5edd15ea5edd15ea5edd15ea5edd15ea5edd15ea5edd15ea5edd15ea5ed (in bytes) +``` + +##### 2 + +**Request** +```yaml +ledger: 'test' +transaction: + type: TransactionType.MESSAGE + from: null (in bytes) + to: 0x5obada55 (in bytes) + data: null (in bytes) +``` + +**Response** +```yaml +error: + code: 'BadArgument' + message: 'Multiple errors in transaction' + target: 'transaction' + details: + - code: 'EmptyValue' + message: 'from must not be empty' + target: 'from' + details: + - code: 'MalformedAddress' + message: 'to must be a valid 32-byte address' + target: 'to' + details: +hash: (empty bytes, default value) +``` + +--- + +## Accounting chain API + +### ClientVersion + +#### Request + +``` +google.protobuf.Empty +``` + +#### Response + +``` +bdchain.api.ClientVersionResponse +``` + +#### Test cases + +##### 1 + +**Request** +``` +(empty) +``` + +**Response** +```yaml +error: (empty Error object) +version: 'AcChainGo/v0.0.1alpha/darwin/go1.11' +``` + +--- + +### BlockNumber + +#### Request + +```proto +message BlockNumberRequest { + string ledger = 1; +} +``` + +#### Response + +```proto +message BlockNumberResponse { + Error error = 1; + uint64 block_number = 2; +} +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +``` + +**Response** +```yaml +error: (empty Error object) +block_number: 2018 +``` + +##### 2 + +**Request** + +Client: +```yaml +ledger: null +``` +On the wire: +```yaml +ledger: '' (defualt value) +``` + +**Response** +```yaml +error: + code: 'BadArgument' + message: 'name must not be empty' + target: 'name' + details: +block_number: 0 (default value) +``` + +--- + +### GetBlockByNumber + +#### Request + +```proto +message GetBlockByNumberRequest { + string ledger = 1; + uint64 number = 2; + bool full_transaction = 3; +} +``` + +#### Response + +``` +bdchain.api.BlockResponse +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +number: 2018 +full_transaction: true +``` + +**Response** +```yaml +error: (empty Error object) +block: + number: 2018 + hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + parent_hash: 0xbabefacebabefacebabefacebabefacebabefacebabefacebabefacebabeface (in bytes) + witness: 0x1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad (in bytes) + timestamp: 2018050400000 + size: 20180504 + transactions_root: 0x5obada555obada555obada555obada555obada555obada555obada555obada55 (in bytes) + transactions: + - block_number: 2018 + block_hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + index: 0 + hash: 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) + type: TransactionType.RECORD + from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + nonce: 2018 + to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + data: 0xdeadbeef (in bytes) + v: 0x25 (in bytes) + r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes) + s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes) + - block_number: 2018 + block_hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + index: 1 + hash: 0x1313131313131313131313131313131313131313131313131313131313131313 (in bytes) + type: TransactionType.MESSAGE + from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + nonce: 2019 + to: 0xfeedbabefeedbabefeedbabefeedbabefeedbabefeedbabefeedbabefeedbabe (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 +error: (empty Error object) +block: + number: 2018 + hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + parent_hash: 0xbabefacebabefacebabefacebabefacebabefacebabefacebabefacebabeface (in bytes) + witness: 0x1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad (in bytes) + timestamp: 2018050400000 + size: 20180504 + transactions_root: 0x5obada555obada555obada555obada555obada555obada555obada555obada55 (in bytes) + transactions: + transaction_hashes: + - 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) + - 0x1313131313131313131313131313131313131313131313131313131313131313 (in bytes) +``` + +--- + +### GetBlockByHash + +#### Request + +```proto +message GetBlockByHashRequest { + string ledger = 1; + bytes hash = 2; + bool full_transaction = 3; +} +``` + +#### Response + +``` +bdchain.api.BlockResponse +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) +full_transaction: false +``` + +**Response** +```yaml +error: (empty Error object) +block: + number: 2018 + hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + parent_hash: 0xbabefacebabefacebabefacebabefacebabefacebabefacebabefacebabeface (in bytes) + witness: 0x1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad1fee1bad (in bytes) + timestamp: 2018050400000 + size: 20180504 + transactions_root: 0x5obada555obada555obada555obada555obada555obada555obada555obada55 (in bytes) + transactions: + transaction_hashes: + - 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) + - 0x1313131313131313131313131313131313131313131313131313131313131313 (in bytes) +``` + +--- + +### GetTransactionByHash + +#### Request + +```proto +message GetTransactionByHashRequest { + string ledger = 1; + bytes hash = 2; +} +``` + +#### Response + +``` +bdchain.api.TransactionResponse +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +hash: 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) +``` + +**Response** +```yaml +error: (empty Error object) +transaction: + block_number: 2018 + block_hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + index: 0 + hash: 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) + type: TransactionType.RECORD + from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + nonce: 2018 + to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (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 + +``` +bdchain.api.TransactionResponse +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +block_number: 2018 +index: 0 +``` + +**Response** +```yaml +error: (empty Error object) +transaction: + block_number: 2018 + block_hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + index: 0 + hash: 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) + type: TransactionType.RECORD + from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + nonce: 2018 + to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (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 + +``` +bdchain.api.TransactionResponse +``` + +#### Test cases + +##### 1 + +**Request** +```yaml +ledger: 'test' +block_hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) +index: 0 +``` + +**Response** +```yaml +error: (empty Error object) +transaction: + block_number: 2018 + block_hash: 0xdeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcodedeadcode (in bytes) + index: 0 + hash: 0x0404040404040404040404040404040404040404040404040404040404040404 (in bytes) + type: TransactionType.RECORD + from: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + nonce: 2018 + to: 0xf00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafef00dcafe (in bytes) + data: 0xdeadbeef (in bytes) + v: 0x25 (in bytes) + r: 0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea (in bytes) + s: 0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c (in bytes) +```