BigchainDBのAPIを試してみる

BigchainDBでブロックチェインを体験する
https://qiita.com/miyamotok0105/items/d96c532c54fc01fc5ffd

の記事の続きです。
前回はmongodbの上でbigchaindbが動いて、python側からデータを操作できるところまで確認しました。

今回は登録されたDBにAPIでアクセスします。
bigchainではapiが用意されてるので、登録したらブラウザで叩けます。

ちなみにbigchaindbは投票型の合意方法をとっていて、各取引に対して投票者が投票することにより過半数を超えると取引が承認されます。ビットコインと違う点です。下記のように取引はブロック単位でまとまっており、バックログにある取引を承認してチェーンに入れて繋いでいく流れです。
<img width="771" alt="スクリーンショット 2017-09-29 15.24.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/63aef01b-cd62-e624-659c-7633cd9ad3a3.png">


#Transactions

取引を指定して取得してみます。

##GET /api/v1/transactions/{transaction_id}

http://locallhost:9984/api/v1/transactions/7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0


```json:
{
    "asset": {
        "data": {
            "bicycle": {
                "manufacturer": "bkfab", 
                "serial_number": "abcd1234"
            }
        }
    }, 
    "id": "7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0", 
    "inputs": [
        {
            "fulfillment": "pGSAIDqiDNlXn-pf5wj3WNacpNhWz8CCGzmfjQ7aDVpJJqtPgUA9Wpx_eetciuyi8JYZM6r9WJFvzaSkfWHMFXzEKeoo8d96Lai195a5avGt9KuB9TV0JJQwoNrhEN2HP9LOL8kE", 
            "fulfills": null, 
            "owners_before": [
                "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp"
            ]
        }
    ], 
    "metadata": {
        "planet": "earth"
    }, 
    "operation": "CREATE", 
    "outputs": [
        {
            "amount": "1", 
            "condition": {
                "details": {
                    "public_key": "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp", 
                    "type": "ed25519-sha-256"
                }, 
                "uri": "ni:///sha-256;B70os2UfmEy7sWaBrauiak4Z7CxjALVJ3LQo-2a3BmU?fpt=ed25519-sha-256&cost=131072"
            }, 
            "public_keys": [
                "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp"
            ]
        }
    ], 
    "version": "1.0"
}
```

bicycleの取引を確認しました。


##GET /api/v1/transactions
Parameters: asset_id, operation

アセットの指定でも取引情報を確認できます。


http://locallhost:9984/api/v1/transactions?asset_id=7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0


```json:
[
    {
        "asset": {
            "data": {
                "bicycle": {
                    "manufacturer": "bkfab", 
                    "serial_number": "abcd1234"
                }
            }
        }, 
        "id": "7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0", 
        "inputs": [
            {
                "fulfillment": "pGSAIDqiDNlXn-pf5wj3WNacpNhWz8CCGzmfjQ7aDVpJJqtPgUA9Wpx_eetciuyi8JYZM6r9WJFvzaSkfWHMFXzEKeoo8d96Lai195a5avGt9KuB9TV0JJQwoNrhEN2HP9LOL8kE", 
                "fulfills": null, 
                "owners_before": [
                    "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp"
                ]
            }
        ], 
        "metadata": {
            "planet": "earth"
        }, 
        "operation": "CREATE", 
        "outputs": [
            {
                "amount": "1", 
                "condition": {
                    "details": {
                        "public_key": "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp", 
                        "type": "ed25519-sha-256"
                    }, 
                    "uri": "ni:///sha-256;B70os2UfmEy7sWaBrauiak4Z7CxjALVJ3LQo-2a3BmU?fpt=ed25519-sha-256&cost=131072"
                }, 
                "public_keys": [
                    "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp"
                ]
            }
        ], 
        "version": "1.0"
    }, 
    {
        "asset": {
            "id": "7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0"
        }, 
        "id": "01af2455ee8830954199e0f8c9d1a8f81f6acd027333b8f0892a3949bcd246c4", 
        "inputs": [
            {
                "fulfillment": "pGSAIDqiDNlXn-pf5wj3WNacpNhWz8CCGzmfjQ7aDVpJJqtPgUBVI4uWt6NEn3L1JCvrJu9IlqxOkNNLzYXMcHNMDu9c7EOv6_CEvTgTNOsNamT4fsfFKdA-6vc35C3OKq5ppyEI", 
                "fulfills": {
                    "output_index": 0, 
                    "transaction_id": "7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0"
                }, 
                "owners_before": [
                    "4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp"
                ]
            }
        ], 
        "metadata": null, 
        "operation": "TRANSFER", 
        "outputs": [
            {
                "amount": "1", 
                "condition": {
                    "details": {
                        "public_key": "Db7y9FvCyVhxvZhomP4LhAR8iBR7zZK2hoT5jvub5NMq", 
                        "type": "ed25519-sha-256"
                    }, 
                    "uri": "ni:///sha-256;Ym7mwjpAjwbmeBuwI68JeYQ2hoiK4oD-oN2ocSeGEns?fpt=ed25519-sha-256&cost=131072"
                }, 
                "public_keys": [
                    "Db7y9FvCyVhxvZhomP4LhAR8iBR7zZK2hoT5jvub5NMq"
                ]
            }
        ], 
        "version": "1.0"
    }
]
```


#Transaction Outputs

##GET /api/v1/outputs
Parameters: public_key, spent


http://locallhost:9984/api/v1/outputs?public_key=4wsxwWoHEFmnv9kky6T5RN7JDcuzmWoDbeo3szEnYVdp


```json:
[
    {
        "output_index": 0, 
        "transaction_id": "7857c9b1806786b27c9a019024918ab077387ccb877fe104531a3ac937d4eea0"
    }
]
```

#Statuses
非同期的に書かれたトランザクションまたはブロックのステータスをIDで取得します。

##GET /api/v1/statuses?transaction_id={transaction_id}
http://locallhost:9984/api/v1/statuses?transaction_id=ed38f320cd03b10450cd78ee9ffd805e7f10f1bdc68f6016422358db493617c4

```json:
{"status": "valid"}
```

##GET /api/v1/statuses?block_id={block_id}

TODO


#Assets
特定のテキスト検索に一致するすべてのアセットを返します

##GET /api/v1/assets?search={text_search}&limit={n_documents}
http://locallhost:9984/api/v1/assets?search=abcd1234&limit=2

```json:
[
    {
        "data": {
            "bicycle": {
                "manufacturer": "bkfab", 
                "serial_number": "abcd1234"
            }
        }, 
        "id": "f9fdcb2978d50eade0e53630a1df25e0f88fdebe2a1c7fde5bed3a0afd32beba"
    }, 
    {
        "data": {
            "bicycle": {
                "manufacturer": "bkfab", 
                "serial_number": "abcd1234"
            }
        }, 
        "id": "14556220319a95a6279975a7ee965e629ea8ecf63a749e00cb0fbae5065de505"
    }
]
```

#Blocks
ブロックエンドポイントは、block_idと、transaction_idを持つ特定のトランザクションが発生したブロックのリストを取得することができます（トランザクションは、システムによって拒否または検証されるまで、複数の無効なブロックで発生する可能性があります）。このエンドポイントは、トランザクションのライフサイクルをドリルダウンする機能を提供します。
投票エンドポイントには、特定のブロックのすべての投票情報が含まれます。したがって、特定のtransaction_idのblock_idを取得した後、そのブロックの特定の時刻に発生した投票を簡単に検査できるようになりました。

ID block_idでブロックを取得します。 VALID、UNDECIDED、INVALIDのいずれかのブロックが返されます。ブロックのステータスを個別にチェックするには、Statusesエンドポイントを使用します。ブロックの投票を確認するには、投票のエンドポイントを見てください。


##GET /api/v1/blocks?transaction_id={transaction_id}&status={UNDECIDED|VALID|INVALID}

http://locallhost:9984/api/v1/blocks?transaction_id=f9fdcb2978d50eade0e53630a1df25e0f88fdebe2a1c7fde5bed3a0afd32beba

```json:
[
    "37a06d40749e4cedba623543492803cd2e678b8da245b26fb430fdc8d8ac6b98"
]
```

##GET /api/v1/blocks/{block_id}


http://locallhost:9984/api/v1/blocks/37a06d40749e4cedba623543492803cd2e678b8da245b26fb430fdc8d8ac6b98


```json:
{
    "block": {
        "node_pubkey": "HPxXw3Kbkj8BVvgR49xa7jaUkHpmmqwL39pmk5qpbdjQ", 
        "timestamp": "1503328807", 
        "transactions": [
            {
                "asset": {
                    "data": {
                        "bicycle": {
                            "manufacturer": "bkfab", 
                            "serial_number": "abcd1234"
                        }
                    }
                }, 
                "id": "f9fdcb2978d50eade0e53630a1df25e0f88fdebe2a1c7fde5bed3a0afd32beba", 
                "inputs": [
                    {
                        "fulfillment": "pGSAIJoXwsTW0bF01VxCdszRV2_qIttHI8bNDnz7xqoryla4gUD04JYVBClnYfZb8SZyYUugocMTm111qez3JrGykAdfRgC4EuKYhmJ8MtCg2fR3vT3UizmmQZR3zUYaTw2ph0AO", 
                        "fulfills": null, 
                        "owners_before": [
                            "BNWoNzdU5WQ6CvJ6Gp9YDw3Aik89QZwB8H8qJSfXCrfZ"
                        ]
                    }
                ], 
                "metadata": {
                    "planet": "earth"
                }, 
                "operation": "CREATE", 
                "outputs": [
                    {
                        "amount": "1", 
                        "condition": {
                            "details": {
                                "public_key": "BNWoNzdU5WQ6CvJ6Gp9YDw3Aik89QZwB8H8qJSfXCrfZ", 
                                "type": "ed25519-sha-256"
                            }, 
                            "uri": "ni:///sha-256;E5gduhl8qT2g8VSVJZBS_AEWBKGUmVlrE4ZArHuhskk?fpt=ed25519-sha-256&cost=131072"
                        }, 
                        "public_keys": [
                            "BNWoNzdU5WQ6CvJ6Gp9YDw3Aik89QZwB8H8qJSfXCrfZ"
                        ]
                    }
                ], 
                "version": "1.0"
            }
        ], 
        "voters": [
            "HPxXw3Kbkj8BVvgR49xa7jaUkHpmmqwL39pmk5qpbdjQ"
        ]
    }, 
    "id": "37a06d40749e4cedba623543492803cd2e678b8da245b26fb430fdc8d8ac6b98", 
    "signature": "2d6zUZHoahK8UYPqLLANEgFarbdTdgXc3HDZ1oQNfBM4hvBBjCJhBZ9iAZkRX8JtPWyZL5Z6VKhaPyMrjmLod5zv"
}
```

##GET /api/v1/blocks?transaction_id={transaction_id}&status={UNDECIDED|VALID|INVALID}

ID transaction_idを持つトランザクションを含む対応するステータスを持つblock_idのリストを取得します。

http://locallhost:9984/api/v1/blocks?transaction_id=ed38f320cd03b10450cd78ee9ffd805e7f10f1bdc68f6016422358db493617c4

```json:
["680550082d87f135825bd3902799973072223884043c414cd63db8e22280fd58"]
```

#Votes
##GET /api/v1/votes?block_id={block_id}

IDがblock_idの特定のブロックの投票リストを取得します。投票の有効性をチェックするには、このエンドポイントのユーザーは次の手順を実行する必要があります。

http://locallhost:9984/api/v1/votes?block_id=680550082d87f135825bd3902799973072223884043c414cd63db8e22280fd58

```json:
[{"signature": "3syHg3BVoiMgEEq6k1hytkwwXabHgCkDiMePAMK5z4e2hwatWdMLpJmmkfWm5aGJ3K6RXnuMxnC47V29aKqUEe5m"
, "vote": {"invalid_reason": null, "is_block_valid": true, "timestamp": "1504192225"
, "previous_block": "9c3b0d0241801a9071463b17889992d2292fba1daf7bc75df648f88e7bcb8762"
, "voting_for_block": "680550082d87f135825bd3902799973072223884043c414cd63db8e22280fd58"}
, "node_pubkey": "HPxXw3Kbkj8BVvgR49xa7jaUkHpmmqwL39pmk5qpbdjQ"}]
```