全部产品

环境搭建 MAC OS

更新时间:2019-08-22 15:45:46

存证链将于2019年10月17日下线,为了得到更好的体验,请使用“合约链”。合约链具备存证链的所有功能,同时性能更佳。

安装配置 Java

  1. 下载 Mac 对应的 img 安装包,进行安装。您可以参考 Oracle 官方文档了解如何 安装 JDK(英文)

    说明:默认情况下,建议使用 Java 8(英文) 环境。您也可以在 Java 7 或更高版本中使用 ,配置与 Java 8 相同。

  2. 安装Apache Maven,您需要先下载 Apache Maven 3.2.5更高版本(英文),然后在本地进行安装。可参考 Apache Maven 官方文档了解如何 安装 Maven(英文)

  3. 在完成 Maven 安装后,配置以下环境变量:

  1. M2_HOME:配置为 Maven 的安装路径。
  2. PATH:增加 %M2_HOME%/bin 路径。
  3. export M2_HOME=$(/usr/local/Cellar/maven/3.2.2/libexec)
  4. export M2=$M2_HOME/bin
  5. export PATH=$M2:$PATH

安装IDEA

  1. 在 IDEA 官网 下载 IDEA。
  2. 下载完毕后,安装 IDEA。

创建Demo

  1. 准备工作:登陆BaaS平台,在左侧导航栏选择 区块链列表,在列表中找到您希望访问的区块链,鼠标选中右侧 更多,并点击 下载签名证书下载SDK,将开发 SDK 压缩包和签名用户证书下载至本地。notary_chain_download

  2. 在 IDEA 中创建一个新的 Maven 项目。maven

  3. 根据下载的 SDK zip 包中的 Readme 说明,对项目进行配置:

    • pom.xml 文件中添加对应的依赖包。

      1. <dependencies>
      2. <dependency>
      3. <groupId>com.alipay.antblockchain</groupId>
      4. <artifactId>antblockchain-gl-biz-sdk</artifactId>
      5. <version>0.6.0.3</version>
      6. <scope>system</scope>
      7. <systemPath>{libdir}/client-sdk.jar</systemPath>
      8. </dependency>
      9. <dependency>
      10. <groupId>com.alipay.antblockchain.sdk.plus</groupId>
      11. <artifactId>antblockchain-sdk-plus</artifactId>
      12. <classifier>jar-with-dependencies</classifier>
      13. <version>0.6.0.3</version>
      14. <scope>system</scope>
      15. <systemPath>{libdir}/sdk-plus.jar</systemPath>
      16. </dependency>
      17. <dependency>
      18. <groupId>javax.validation</groupId>
      19. <artifactId>validation-api</artifactId>
      20. <version>1.1.0.Final</version>
      21. </dependency>
      22. <dependency>
      23. <groupId>org.hibernate</groupId>
      24. <artifactId>hibernate-validator</artifactId>
      25. <version>5.3.5.Final</version>
      26. </dependency>
      27. <dependency>
      28. <groupId>javax.el</groupId>
      29. <artifactId>javax.el-api</artifactId>
      30. <version>2.2.4</version>
      31. </dependency>
      32. <dependency>
      33. <groupId>org.glassfish.web</groupId>
      34. <artifactId>javax.el</artifactId>
      35. <version>2.2.4</version>
      36. </dependency>
      37. </dependencies>

      注意:解压从 BaaS 平台下载的 client-sdk.zip 文件,将内含的client-sdk.jarsdk-plus.jar 加入到依赖目录中,务必修改您的 libdir 为真实的路径。

    • sdk.properties 文件进行配置。
      1. # 客户端连接的主节点地址,主节点必须且只能配置 1 个
      2. biz.sdk.primary=116.62.111.181:8080
      3. # 备份节点 API 地址,备份节点可以配置 n 个,n=3f:f=1,2,...
      4. # 主节点无法连接时,会切换连接备份节点,当主节点恢复时,⾃动切回主节点
      5. biz.sdk.backups=116.62.111.182:8080;116.62.111.183:8080;116.62.111.184:8080
      6. # 客户端与节点连接使⽤ TLS 双向认证,需要配置 x509 证书
      7. # pkcs8 格式的 SSL 私钥文件绝对路径
      8. biz.sdk.ssl_key=/path/test_key_pkcs8.pem
      9. # x509 格式的 SSL 证书文件绝对路径
      10. biz.sdk.ssl_cert=/path/test_cert.pem
      11. # 创建私钥时设置的 SSL 私钥密码
      12. biz.sdk.ssl_key_password=******
      13. # trust store 文件绝对路径
      14. biz.sdk.trust_store=/path/test_client_trust.keystore
      15. # trust store 密码,请咨询 BaaS 技术支持人员
      16. biz.sdk.trust_store_password=******
  4. 完成上述配置之后,在项目的 Main 函数中创建一个 SDK 客户端实例,并且通过区块高度参数获取这个区块的内容。

    1. import com.alipay.mychain.gl.biz.common.Response;
    2. import com.alipay.mychain.gl.biz.sdk.Client;
    3. import com.alipay.mychain.gl.biz.sdk.ClientConfig;
    4. import com.alipay.mychain.gl.biz.sdk.ClientPropertyConfig;
    5. import com.alipay.mychain.gl.common.enums.PayloadType;
    6. import com.alipay.mychain.gl.common.model.builder.TransactionBuilder;
    7. import com.alipay.mychain.gl.common.model.entity.ContentOnlyNotaryPayloadDO;
    8. import com.alipay.mychain.gl.common.model.entity.TransactionDO;
    9. import com.alipay.mychain.gl.common.model.pojo.Block;
    10. import com.alipay.mychain.sdk.plus.builder.GuestInfoBuilder;
    11. import com.alipay.mychain.sdk.plus.constants.BizCategory;
    12. import com.alipay.mychain.sdk.plus.entity.GuestInfo;
    13. import java.io.ByteArrayInputStream;
    14. import java.io.IOException;
    15. import java.io.ObjectInputStream;
    16. import java.util.Properties;
    17. import java.util.concurrent.TimeoutException;
    18. public class App {
    19. public static void main(String[] args ){
    20. Properties p = new Properties();
    21. try {
    22. p.load(App.class.getClassLoader().getResourceAsStream("sdk.properties"));
    23. }catch (IOException e){
    24. e.printStackTrace();
    25. }
    26. ClientConfig config = new ClientPropertyConfig(p);
    27. Client client = new Client(config);
    28. // 1. 获取一个 Block Info
    29. getBlock(client);
    30. // 2. 上传存证数据
    31. String txHash = sendData(client);
    32. // 3. 获取存证数据
    33. getData(client, txHash);
    34. client.shutdown();
    35. }
    36. static String sendData(Client client){
    37. // 构造存证数据
    38. GuestInfoBuilder builder = new GuestInfoBuilder(); byte[] bizData = builder.setUserName("Bob")
    39. .setBirthday("2000-01-01")
    40. .setEmail("bob@inc.com")
    41. .build();
    42. System.out.println("--> 构造 GuestInfo: UserName: Bob, Birthday: 2000-01-01, Email:bob@inc.com");
    43. // 创建 ContentOnlyNotary Transaction
    44. TransactionDO tx = TransactionBuilder.getContentOnlyNotaryPayloadBuilder()
    45. .setContent(bizData)
    46. .setTimestamp(System.currentTimeMillis())//设置业务时间
    47. .setCategory(BizCategory.GuestInfo) //设置业务分类
    48. .build();
    49. Response<TransactionDO> response = null;
    50. try{
    51. response = client.sendTransaction(tx);
    52. }catch (TimeoutException e){
    53. e.printStackTrace();
    54. }
    55. if(response.isSuccess()){
    56. // 发送成功,业务系统保留 Transaction Hash 与业务数据关联
    57. System.out.println("--> 上传至区块链返回 txHash: "+ tx.getTxHashValue());
    58. return tx.getTxHashValue();
    59. }else{
    60. // 发送失败,抛异常。业务系统应该重试,RPC 调用失败时区块链的状态是未知的。
    61. throw new RuntimeException("写⼊区块链失败");
    62. }
    63. }
    64. static void getBlock(Client client){
    65. try {
    66. Response<Block> res = client.getBlock(8);
    67. System.out.println(res.getData());
    68. }catch (TimeoutException e){
    69. e.printStackTrace();
    70. }
    71. }
    72. static void getData(Client client, String txHash){
    73. System.out.println("链上获取 txHash: "+txHash+" 的存证数据");
    74. while(true) {
    75. Response<TransactionDO> response = null;
    76. try {
    77. response = client.getTransaction(txHash);
    78. } catch (TimeoutException e) {
    79. e.printStackTrace();
    80. }
    81. if (response.isSuccess()) {
    82. if (null != response.getData()) { // 链上未存在该 Tx
    83. TransactionDO tx = response.getData();
    84. // 根据交易类型读取具体交易内容
    85. if (tx.getType() == PayloadType.TX_TYPE_NOTARY_CONTENT_ONLY.code) {
    86. // 读取内容存证交易
    87. ContentOnlyNotaryPayloadDO payloadDO =
    88. (ContentOnlyNotaryPayloadDO) tx.getPayload();
    89. ByteArrayInputStream bis = new ByteArrayInputStream(payloadDO.getContent());
    90. try{
    91. ObjectInputStream ois = new ObjectInputStream(bis);
    92. if (payloadDO.getCategory() == BizCategory.GuestInfo) {
    93. GuestInfo renter = GuestInfo.class.cast(ois.readObject());
    94. System.out.println("--> Username: " + renter.getUserName());
    95. System.out.println("--> Birthday: " + renter.getBirthday());
    96. System.out.println("--> Email: " + renter.getEmail());
    97. }
    98. }catch (IOException e){
    99. e.printStackTrace();
    100. return;
    101. }catch (ClassNotFoundException e){
    102. e.printStackTrace();
    103. return;
    104. }
    105. // read biz time
    106. System.out.println("--> Timestamp: " + payloadDO.getTimestamp());
    107. return;
    108. } else {
    109. System.out.println("tx 类型错误");
    110. return;
    111. }
    112. }
    113. } else {
    114. // 查询异常,
    115. System.out.println("返回异常");
    116. return;
    117. }
    118. try {
    119. Thread.sleep(1000);
    120. } catch (InterruptedException e) {
    121. e.printStackTrace();
    122. }
    123. }
    124. }
    125. }

关于更多SDK的使用方法,请参考 SDK开发指南