【问题标题】:querying data from particular node's database从特定节点的数据库中查询数据
【发布时间】:2018-05-08 16:32:02
【问题描述】:

我正在使用客户查询做一些报告类的事情。为此,我必须从各个节点的数据库中获取数据。但是,不知道该怎么做。它通常会获取所有数据,而与节点无关。

【问题讨论】:

    标签: corda


    【解决方案1】:

    我们来做一个基于 IOU CorDapp (https://github.com/corda/cordapp-example/) 的例子。有几种方法可以做到这一点:

    1.通过 API 端点

    此端点将返回节点上存储的任何 IOU,其值高于 minValue

    @GET
    @Path("ious-above-value")
    @Produces(MediaType.APPLICATION_JSON)
    fun getIOUsAboveValue(@QueryParam("minValue") minValue: Int): List<IOUState> {
        val results = builder {
            val currencyIndex = IOUSchemaV1.PersistentIOU::value.greaterThan(minValue)
            val customCriteria = QueryCriteria.VaultCustomQueryCriteria(currencyIndex)
            rpcOps.vaultQueryBy<IOUState>(customCriteria)
        }
    
        val stateAndRefs = results.states
        return stateAndRefs.map { stateAndRef -> stateAndRef.state.data }
    }
    

    2。通过客户

    此客户端将返回节点上存储的任何 IOU,其值高于 minValue

    fun main(args: Array<String>) {
        require(args.size == 1) { "Usage: ExampleClientRPC <node address>" }
        val nodeAddress = NetworkHostAndPort.parse(args[0])
        val client = CordaRPCClient(nodeAddress)
    
        // Can be amended in the com.example.MainKt file.
        val proxy = client.start("user1", "test").proxy
    
        val results = builder {
            val currencyIndex = IOUSchemaV1.PersistentIOU::value.greaterThan(3)
            val customCriteria = QueryCriteria.VaultCustomQueryCriteria(currencyIndex)
            proxy.vaultQueryBy<IOUState>(customCriteria)
        }
    
        val stateAndRefs = results.states
        val states = stateAndRefs.map { stateAndRef -> stateAndRef.state.data }
    }
    

    3.直接通过节点的数据库

    您可以按照此处的说明登录到节点的数据库:https://docs.corda.net/node-database.html。然后,您将能够直接对节点的数据库执行 SQL 查询。

    【讨论】: