使用SDK

Spring项目开发指引

调用SDK的API(参考Web3SDK API列表设置或查询相关的区块链数据。

调用SDK Web3j的API

加载配置文件,SDK与区块链节点建立连接,获取web3j对象,根据Web3j对象调用相关API。示例代码如下:

  1. //读取配置文件,SDK与区块链节点建立连接
  2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  3. Service service = context.getBean(Service.class);
  4. service.run();
  5. ChannelEthereumService channelEthereumService = new ChannelEthereumService();
  6. channelEthereumService.setChannelService(service);
  7. //获取Web3j对象
  8. Web3j web3j = Web3j.build(channelEthereumService, service.getGroupId());
  9. //通过Web3j对象调用API接口getBlockNumber
  10. BigInteger blockNumber = web3j.getBlockNumber().send().getBlockNumber();
  11. System.out.println(blockNumber);

注: SDK处理交易超时时间默认为60秒,即60秒内没有收到交易响应,判断为超时。该值可以通过ChannelEthereumService进行设置,示例如下:

  1. // 设置交易超时时间为100000毫秒,即100秒
  2. channelEthereumService.setTimeout(100000);
调用SDK Precompiled的API

加载配置文件,SDK与区块链节点建立连接。获取SDK Precompiled Service对象,调用相关的API。示例代码如下:

  1. //读取配置文件,SDK与区块链节点建立连接,获取Web3j对象
  2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  3. Service service = context.getBean(Service.class);
  4. service.run();
  5. ChannelEthereumService channelEthereumService = new ChannelEthereumService();
  6. channelEthereumService.setChannelService(service);
  7. Web3j web3j = Web3j.build(channelEthereumService, service.getGroupId());
  8. String privateKey = "b83261efa42895c38c6c2364ca878f43e77f3cddbc922bf57d0d48070f79feb6";
  9. //指定外部账户私钥,用于交易签名
  10. Credentials credentials = GenCredential.create(privateKey);
  11. //获取SystemConfigService对象
  12. SystemConfigService systemConfigService = new SystemConfigService(web3j, credentials);
  13. //通过SystemConfigService对象调用API接口setValueByKey
  14. String result = systemConfigService.setValueByKey("tx_count_limit", "2000");
  15. //通过Web3j对象调用API接口getSystemConfigByKey
  16. String value = web3j.getSystemConfigByKey("tx_count_limit").send().getSystemConfigByKey();
  17. System.out.println(value);
创建并使用指定外部账户

SDK发送交易需要一个外部账户,下面是随机创建一个外部账户的方法。

  1. //创建普通外部账户
  2. EncryptType.encryptType = 0;
  3. //创建国密外部账户,向国密区块链节点发送交易需要使用国密外部账户
  4. // EncryptType.encryptType = 1;
  5. Credentials credentials = GenCredential.create();
  6. //账户地址
  7. String address = credentials.getAddress();
  8. //账户私钥
  9. String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
  10. //账户公钥
  11. String publicKey = credentials.getEcKeyPair().getPublicKey().toString(16);

使用指定的外部账户

  1. //通过指定外部账户私钥使用指定的外部账户
  2. Credentials credentials = GenCredential.create(privateKey);
加载账户私钥文件

如果通过账户生成脚本get_accounts.sh生成了PEM或PKCS12格式的账户私钥文件(账户生成脚本的用法参考账户管理文档),则可以通过加载PEM或PKCS12账户私钥文件使用账户。加载私钥有两个类:P12Manager和PEMManager,其中,P12Manager用于加载PKCS12格式的私钥文件,PEMManager用于加载PEM格式的私钥文件。

  • P12Manager用法举例: 在applicationContext.xml中配置PKCS12账户的私钥文件路径和密码
  1. <bean id="p12" class="org.fisco.bcos.channel.client.P12Manager" init-method="load" >
  2. <property name="password" value="123456" />
  3. <property name="p12File" value="classpath:0x0fc3c4bb89bd90299db4c62be0174c4966286c00.p12" />
  4. </bean>

开发代码

  1. //加载Bean
  2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  3. P12Manager p12 = context.getBean(P12Manager.class);
  4. //提供密码获取ECKeyPair,密码在生产p12账户文件时指定
  5. ECKeyPair p12KeyPair = p12.getECKeyPair(p12.getPassword());
  6. //以十六进制串输出私钥和公钥
  7. System.out.println("p12 privateKey: " + p12KeyPair.getPrivateKey().toString(16));
  8. System.out.println("p12 publicKey: " + p12KeyPair.getPublicKey().toString(16));
  9. //生成Web3SDK使用的Credentials
  10. Credentials credentials = GenCredential.create(p12KeyPair.getPrivateKey().toString(16));
  11. System.out.println("p12 Address: " + credentials.getAddress());
  • PEMManager使用举例

在applicationContext.xml中配置PEM账户的私钥文件路径

  1. <bean id="pem" class="org.fisco.bcos.channel.client.PEMManager" init-method="load" >
  2. <property name="pemFile" value="classpath:0x0fc3c4bb89bd90299db4c62be0174c4966286c00.pem" />
  3. </bean>

使用代码加载

  1. //加载Bean
  2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-keystore-sample.xml");
  3. PEMManager pem = context.getBean(PEMManager.class);
  4. ECKeyPair pemKeyPair = pem.getECKeyPair();
  5. //以十六进制串输出私钥和公钥
  6. System.out.println("PEM privateKey: " + pemKeyPair.getPrivateKey().toString(16));
  7. System.out.println("PEM publicKey: " + pemKeyPair.getPublicKey().toString(16));
  8. //生成Web3SDK使用的Credentials
  9. Credentials credentialsPEM = GenCredential.create(pemKeyPair.getPrivateKey().toString(16));
  10. System.out.println("PEM Address: " + credentialsPEM.getAddress());

通过SDK部署并调用合约

准备Java合约文件

控制台提供一个专门的编译合约工具,方便开发者将Solidity合约文件编译为Java合约文件,具体使用方式参考这里

部署并调用合约

SDK的核心功能是部署/加载合约,然后调用合约相关接口,实现相关业务功能。部署合约调用Java合约类的deploy方法,获取合约对象。通过合约对象可以调用getContractAddress方法获取部署合约的地址以及调用该合约的其他方法实现业务功能。如果合约已部署,则通过部署的合约地址可以调用load方法加载合约对象,然后调用该合约的相关方法。

  1. //读取配置文件,SDK与区块链节点建立连接,获取web3j对象
  2. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  3. Service service = context.getBean(Service.class);
  4. service.run();
  5. ChannelEthereumService channelEthereumService = new ChannelEthereumService();
  6. channelEthereumService.setChannelService(service);
  7. channelEthereumService.setTimeout(10000);
  8. Web3j web3j = Web3j.build(channelEthereumService, service.getGroupId());
  9. //准备部署和调用合约的参数
  10. BigInteger gasPrice = new BigInteger("300000000");
  11. BigInteger gasLimit = new BigInteger("300000000");
  12. String privateKey = "b83261efa42895c38c6c2364ca878f43e77f3cddbc922bf57d0d48070f79feb6";
  13. //指定外部账户私钥,用于交易签名
  14. Credentials credentials = GenCredential.create(privateKey);
  15. //部署合约
  16. YourSmartContract contract = YourSmartContract.deploy(web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)).send();
  17. //根据合约地址加载合约
  18. //YourSmartContract contract = YourSmartContract.load(address, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
  19. //调用合约方法发送交易
  20. TransactionReceipt transactionReceipt = contract.someMethod(<param1>, ...).send();
  21. //查询合约方法查询该合约的数据状态
  22. Type result = contract.someMethod(<param1>, ...).send();

Spring Boot项目开发指引

提供spring-boot-starter示例项目供参考。Spring Boot项目开发与Spring项目开发类似,其主要区别在于配置文件方式的差异。该示例项目提供相关的测试案例,具体描述参考示例项目的README文档。

SDK国密功能使用

  • 前置条件:FISCO BCOS区块链采用国密算法,搭建国密版的FISCO BCOS区块链请参考国密使用手册
  • 启用国密功能:applicationContext.xml/application.yml配置文件中将encryptType属性设置为1。
  • 加载私钥使用GenCredential类(适用于国密和非国密),Credential类只适用于加载非国密私钥。

国密版SDK调用API的方式与普通版SDK调用API的方式相同,其差异在于国密版SDK需要生成国密版的Java合约文件。编译国密版的Java合约文件参考这里