运行Corda的示例

下载源码(java版)

cd [your workspace]
git clone https://github.com/corda/samples-java.git

在IDE中打开samples-java/Basic/cordapp-examples

目录结构如下:

├── LICENCE
├── README.md
├── TRADEMARK
├── build.gradle
├── clients
│   ├── build.gradle
│   └── src
│       └── main
│           ├── java
│           │   └── net
│           │       └── corda
│           │           └── samples
│           │               └── example
│           │                   ├── Client.java
│           │                   └── webserver
│           │                       ├── Controller.java
│           │                       ├── NodeRPCConnection.java
│           │                       └── Starter.java
│           └── resources
│               └── static
│                   ├── app.js
│                   └── index.html
├── config
│   ├── dev
│   │   └── log4j2.xml
│   └── test
│       └── log4j2.xml
├── contracts
│   ├── build.gradle
│   └── src
│       ├── main
│       │   └── java
│       │       └── net
│       │           └── corda
│       │               └── samples
│       │                   └── example
│       │                       ├── contracts
│       │                       │   └── IOUContract.java
│       │                       ├── schema
│       │                       │   ├── IOUSchema.java
│       │                       │   └── IOUSchemaV1.java
│       │                       └── states
│       │                           └── IOUState.java
│       └── test
│           └── java
│               └── net
│                   └── corda
│                       └── samples
│                           └── example
│                               └── contracts
│                                   ├── ContractTests.java
│                                   └── StateTests.java
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── repositories.gradle
├── settings.gradle
└── workflows
    ├── build.gradle
    └── src
        ├── integrationTest
        │   └── java
        │       └── net
        │           └── corda
        │               └── samples
        │                   └── example
        │                       └── DriverBasedTest.java
        ├── main
        │   ├── java
        │   │   └── net
        │   │       └── corda
        │   │           └── samples
        │   │               └── example
        │   │                   └── flows
        │   │                       └── ExampleFlow.java
        │   └── resources
        │       └── migration
        │           ├── iou.changelog-master.xml
        │           └── iou.changelog-v1.xml
        └── test
            └── java
                └── net
                    └── corda
                        └── samples
                            └── example
                                └── FlowTests.java
  • clients文件夹包含的是用于Spring Boot集成的源码
  • config是配置文件,包含log4j2
  • contracts和workflows是CorDapp的源码
  • gradle是包含Gradle Wrapper

部署节点并运行示例CorDapp

打开终端输入一下命令:

gradlew.bat deployNodes

// tips可以只部署java(或者kotlin)
// -b表示 --build-file
gradlew.bat -b workflows-java/build.gradle deploynodes

会在根目录下创建文件夹build/nodes,里面会有三个Node文件夹(PartyA,PartyB,Notary),节点信息在根目录下的build.gradle中定义。

输入如下命令运行示例CorDapp

call build\nodes\runnodes.bat

会打开三个如下的界面,当出现如下图红色方框所示的”welocme”语句时表示成功运行
Notary

三种交互方式

通过http

这一部分的内容还要进一步研究

通过交互式shell

可以直接在每个节点的shell与节点进行交互,比如在节点A和B之间创建一个IOU(i owe you)账单,在PartyA中输入如下命令:

>>>flow start Initiator iouValue: 50, otherParty: "O=PartyB,L=New York,C=US"

上面命令中Initiator是一个流(extends FlowLogic),iouValueotherParty是Initiator中的两个参数。

生产环境中使用Network Map Service来定义节点名字和查找节点,并使用Doorman Service管理准入

得到类似如下结果:

命令行交互创建IOU

上图中出现如下信息,表示交易完成

Flow completed with result: SignedTransaction(id=AEE179389C8F701C940489BF208D13C09B6E8D48F6AC32979C7F0C2B0BD1B526)

然后可以使用如下命令进行查看:

run vaultQuery contractStateType: com.example.state.IOUState

PartyAPartyB可以查看类似如下信息,但是Notary是没有的,如果有其他节点也是看不到的,这正是Corda的Need-to-know特性。

查看

contractStateClassName: "com.example.state.IOUState"
recordedTime: "2021-04-05T00:05:24.579Z"
consumedTime: null
status: "UNCONSUMED"
notary: "O=Notary, L=London, C=GB"

可以看到是UNCONSUMED,com.example.state.IOUState是IOUState的package名。

可以输入以下命令实时查看

在PartyB中输入以下命令:

run vaultTrack contractStateType com.example.state.IOUState

当其他节点与B进行交易时,交易信息会在PartyB实时显示。

...# 省略
totalStatesAvailable: -1
stateTypes: "UNCONSUMED"
otherResults: []

Updates:
Waiting for completion or Ctrl-C ...

通过h2的web控制台