Giter VIP home page Giter VIP logo

cita-sdk-java's Introduction

cita-sdk-java

Build Status License: Apache-2.0 GitHub tag (latest SemVer)

English
中文

Introduction

cita-sdk-java, originally adapted from Ethereum web3j, is a Java library for working with Smart Contract and integrating with clients on CITA.

For detailed documentation, see documentation.

Features

  • Complete implementation of CITA JSON-RPC API over HTTP.
  • Auto-generation of Java smart contract wrappers to create, deploy, transact with and call smart contracts from native Java code (Solidity and Truffle definition formats supported).
  • Android compatible.

Getting Started

Prerequisites

Java 8
Gradle 5.0

Install

Install from repositories:
maven

<dependency>
  <groupId>com.citahub.cita</groupId>
  <artifactId>core</artifactId>
  <version>20.2.0</version>
</dependency>

Gradle

compile 'com.citahub.cita:core:20.2.0'

Install manually If you want to generate the jar and import manually.

git clone https://github.com/citahub/cita-sdk-java.git
gradle shadowJar

CITA Test net

Use CITA test net (recommended): https://testnet.citahub.com is provided as a test net.

Or build your own CITA net: Please find more information in CITA.

Get started

Deploy smart contract

Similar as Ethereum, smart contracts are deployed in CITA network by sending transactions. CITA transaction is defined in Transaction.java.
In CITA transaction, there are 3 special parameters:

  • nonce: generated randomly or depend on specific logic to avoid replay attack.
  • quota: transaction execution fee for operation, like gasPrice * gasLimit in Ethereum.
  • valid_until_block: timeout mechanism which should be set in (currentHeight, currentHeight + 100]. Transaction will be discarded beyond valid_until_block.

Please see the example below for a smart contract deployment.

Generate binary file for the contract by below command:

$solc example.sol --bin

Construct a transaction with generated binary code and other 3 parameters.

String contractCode = "6080604052600160005534801561001557600080fd5b5060df806100246000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058202dd6056ea84968f05202910ca070fe13f6f46ff5507867f313d9c98bf2d2e55c0029";
CITAj service = CITAj.build(new HttpService("https://testnet.citahub.com"));
AppMetaData appMetaData;
appMetaData = service.appMetaData(DefaultBlockParameter.valueOf("latest")).send();
String chainIdHex = appMetaData.getAppMetaDataResult().getChainIdV1();
BigInteger chainId = new BigInteger(chainIdHex.substring(2), 16);
int version = appMetaData.getAppMetaDataResult().getVersion();
long currentHeight = service.appBlockNumber().send().getBlockNumber().longValue();
long validUntilBlock = currentHeight + 80;
Random random = new Random(System.currentTimeMillis());
String nonce = String.valueOf(Math.abs(random.nextLong()));
long quota = 1000000;
Transaction tx = Transaction.createContractTransaction(nonce, quota, validUntilBlock, version, chainId, "0", contractCode);

Sign the transaction with sender's private key and send it to CITA net.

String privateKey = "0x5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6"; // your private key
String rawTx = tx.sign(privateKey);
AppSendTransaction result = service.appSendRawTransaction(rawTx).send();

Please be attention that all transactions need to be signed since CITA only supports method sendRawTransaction rather than sendTransaction.

Call functions in smart contract

In CITA smart contract call, like contract deployment, a transaction needs to be created with 2 more parameters:

  • contract address: address of the deployed contract.
  • functionCallData: ABI of function and parameter.

After contract deployed, contract address can be fetched from TransactionReceipt. functionCallData is encoded from functionName and parameters by contract ABI. For example, functionCallData of function set() with parameter 1 is 60fe47b10000000000000000000000000000000000000000000000000000000000000001.

//get receipt and address from transaction
String txHash = result.getSendTransactionResult().getHash();
TransactionReceipt txReceipt = service.appGetTransactionReceipt(txHash).send().getTransactionReceipt();
String contractAddr = txReceipt.getContractAddress();

//sign and send the transaction
List<Type> inputParameters = Arrays.asList(new Uint(BigInteger.valueOf(4l)));
String funcData = CITASystemContract.encodeFunction("set", inputParameters);
Transaction tx = new Transaction(contractAddr, nonce, 10000000L, validUntilBlock, version, chainId, "0", funcData);
String rawTx = tx.sign(privateKey);
String txHash =  service.appSendRawTransaction(rawTx).send().getSendTransactionResult().getHash();

Please check TokenTransactionTest.java to see a complete example for smart contract deployment and function invocation.

Working with smart contract with cita-sdk-java wrapper

Besides interacting with smart contracts by sending transactions with binary code, cita-sdk-java provides a tool to help to convert solidity contract to a Java class from which smart contracts can be deployed and called.

Download cita jar file from release page or run gradle shadowJar to generate jars so that the tool can be found under build/libs. Name of the tool is cita-sdk-$version.jar.

Usage of cita-sdk-$version is shown below:

$ java -jar cita-sdk-20.2.0.jar solidity generate [--javaTypes|--solidityTypes] /path/to/{smart-contract}.bin /path/to/{smart-contract}.abi -o /path/to/src/main/java -p {package-path}

Example generate Java class from Token.sol, Token.bin and Token.abi under /tests/src/main/resources:

java -jar build/libs/cita-sdk-20.2.0.jar solidity generate tests/src/main/resources/Token.bin tests/src/main/resources/Token.abi -o tests/src/main/java/ -p com.citahub.cita.tests

Token.java will be created from commands above and class Token can be used with TransactionManager to deploy and call smart contract Token. Please be attention that TransactionManager is supposed to be used as TransactionManager for transaction creation in CITA network. Please check TokenCodegenTest.java for a complete example.

Working with smart contract with cita-sdk-java Account (Test)

cita-sdk-java provides interface Account for smart contract manipulations. With parameters of smart contract's name, address, method and method's arguments, smart contracts can be deployed and called through the interface without exposing extra java, bin or abi file to developers.

Method of smart contract deployment:

// Deploy contract in sync and async way.
public AppSendTransaction deploy(File contractFile, String nonce, BigInteger quota)

public Future<AppSendTransaction> deployAsync(File contractFile, String nonce, BigInteger quota)

Method of smart contract method call:

public Object callContract(String contractAddress, String funcName, String nonce, BigInteger quota, Object... args)

//function is a encapsulation of method including name, argument datatypes, return type and other info.
public Object callContract(String contractAddress, AbiDefinition functionAbi, String nonce, BigInteger quota, Object... args)

While contract file is required when first deploy the contract, cita-sdk-java can get the abi file according to address when call methods in deployed contract. Please find complete code in TokenAccountTest.

Contributing

Creating a Bug Report

open a new issue: https://github.com/citahub/cita-sdk-java/issues/new

with your version info

Tech Stack

Back end

Java

  • Version: 8
  • Building: gradle-v5.0

Coding style

coding style guide: Google Shell Style guide:

Installing the coding style settings in Intellij

  1. Download the intellij-java-google-style.xml file from the http://code.google.com/p/google-styleguide/ repo.
  2. go into Preferences -> Editor -> Code Style. Click on Manage and import the downloaded Style Setting file. Select GoogleStyle as new coding style.

Installing the coding style settings in Eclipse

  1. Download the eclipse-java-google-style.xml file from the http://code.google.com/p/google-styleguide/ repo.
  2. Under Window/Preferences select Java/Code Style/Formatter. Import the settings file by selecting Import.

Commit your changes

Workflow

GitHub Flow, Understanding the GitHub flow

git style guide

use git-style-guide for Branches, Commits,Messages, Merging

Versioning

vx.y.z

  • x.y Follow the version number of CITA
  • z Defined by SDK itself:changed by fixing or adding features

简介

cita-sdk-java 是对以太坊 Web3j 进行改写,适配 CITA 的一个 Java 开发包。cita-sdk-java 集成了与 CITA 客户端交互的功能,可以用来对 CITA 发送交易,系统配置,信息查询。

开发请参考详细文档

特性

  • 通过 HTTP 协议,实现了 CITA 所定义的所有 JSON-RPC 方法。
  • 可以通过 Solidity 智能合约生成该合约的 Java 类。这个智能合约的 Java 类作为 java 对智能合约的包裹层,可以使开发和通过 java 方便地对智能合约进行部署和合约方法的调用(支持Solidity 和 Truffle 的格式)。
  • 适配安卓

开始

预装组件

Java 8
Gradle 5.0

安装

通过远程仓库安装:

<dependency>
  <groupId>com.citahub.cita</groupId>
  <artifactId>core</artifactId>
  <version>20.2.0</version>
</dependency>

Gradle

compile 'com.citahub.cita:core:20.2.0'

手动安装
如果你想使用最新的 CITA,编译 CITA 生成 jar 包,并手动引入。

git clone https://github.com/citahub/cita-sdk-java.git
gradle shadowJar

CITA 测试网络

使用 CITA 测试网络(推荐):
https://testnet.citahub.com

或者可以部署你自己的 CITA:
如果需要了解怎么部署 CITA 网络,请查阅CITA

快速教程

部署智能合约

与以太坊类似,智能合约是通过发送交易来部署的。CITA 交易对象定义在 Transaction.java。 在 CITA 交易中,有三个特殊的参数:

  • nonce: 随机数或者通过特定的逻辑生成的随机信息,nonce是为了避免重放攻击。
  • quota: 交易执行费用,也就是矿工费,就像以太坊中的 gasPrice * gasLimit。
  • valid_until_block: 超时机制,valid_until_block 可以定义的范围是 (currentHeight, currentHeight + 100]。交易在valid_until_block之后会作废。

以下是一个智能合约部署的例子。

通过 solc 生成智能合约的二进制文件,命令如下:

$solc example.sol --bin

根据生成的二进制文件和其他3个参数构造一个交易,代码如下:

String contractCode = "6080604052600160005534801561001557600080fd5b5060df806100246000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b114604e5780636d4ce63c146078575b600080fd5b348015605957600080fd5b5060766004803603810190808035906020019092919050505060a0565b005b348015608357600080fd5b50608a60aa565b6040518082815260200191505060405180910390f35b8060008190555050565b600080549050905600a165627a7a723058202dd6056ea84968f05202910ca070fe13f6f46ff5507867f313d9c98bf2d2e55c0029";
CITAj service = CITAj.build(new HttpService("https://testnet.citahub.com"));
AppMetaData appMetaData;
appMetaData = service.appMetaData(DefaultBlockParameter.valueOf("latest")).send();
String chainIdHex = appMetaData.getAppMetaDataResult().getChainIdV1();
BigInteger chainId = new BigInteger(chainIdHex.substring(2), 16);
int version = appMetaData.getAppMetaDataResult().getVersion();
long currentHeight = service.appBlockNumber().send().getBlockNumber().longValue();
long validUntilBlock = currentHeight + 80;
Random random = new Random(System.currentTimeMillis());
String nonce = String.valueOf(Math.abs(random.nextLong()));
long quota = 1000000;
Transaction tx = Transaction.createContractTransaction(nonce, quota, validUntilBlock, version, chainId, "0", contractCode);

用发送者的私钥对交易进行签名然后发送到 CITA 网络,代码如下:

String privateKey = "0x5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6"; // your private key
String rawTx = tx.sign(privateKey);
AppSendTransaction result = service.appSendRawTransaction(rawTx).send();

请注意因为 CITA 只支持 sendRawTransaction 方法而不是 sendTransaction ,所以所有发送给 CITA 的交易都需要被签名。

调用智能合约的函数

在 CITA 中,正如智能合约的部署,智能合约中函数的调用也是通过发送交易来实现的,调用合约函数的交易是通过两个参数构造的:

  • 合约地址: 已部署合约的地址。
  • 函数编码数据: 函数以及入参的 ABI 的编码后数据。

智能合约成功部署以后,可以通过交易回执得到合约地址。以下是调用合约函数的例子,在例子中,functionCallData 通过对合约 ABI 中的函数名和入参编码得到。入参为 1 的set() 函数的编码数据 functionCallData60fe47b10000000000000000000000000000000000000000000000000000000000000001.

//get receipt and address from transaction
String txHash = result.getSendTransactionResult().getHash();
TransactionReceipt txReceipt = service.appGetTransactionReceipt(txHash).send().getTransactionReceipt();
String contractAddr = txReceipt.getContractAddress();

//sign and send the transaction
List<Type> inputParameters = Arrays.asList(new Uint(BigInteger.valueOf(4l)));
String funcData = CITASystemContract.encodeFunction("set", inputParameters);
Transaction tx = new Transaction(contractAddr, nonce, 10000000L, validUntilBlock, version, chainId, "0", funcData);
String rawTx = tx.sign(privateKey);
String txHash =  service.appSendRawTransaction(rawTx).send().getSendTransactionResult().getHash();

请在 TokenTransactionTest.java 中查看完整代码。

通过 cita-sdk-java 中的 wrapper 与智能合约交互

以上例子展示了直接通过合约二进制码和函数的编码构造交易,并且发送与链上合约进行交互。除此方法以外,cita-sdk-java 提供了 codeGen 工具可以通过 solidity 合约生成 java 类。通过 cita-sdk-java 生成的 java 类,可以方便对合约进行部署和函数调用。

在 release 页面下载 cita-sdk-java 的 jar 包,或者在源项目中运行 gradle shadowJar 生成 jar 包,jar包会在 build/libs 中生成,名字是 cita-sdk-$version.jar

solidity 合约转化为 java 类操作如下:

$ java -jar cita-sdk-20.2.0.jar solidity generate [--javaTypes|--solidityTypes] /path/to/{smart-contract}.bin /path/to/{smart-contract}.abi -o /path/to/src/main/java -p {package-path}

这个例子通过 Token.sol, Token.bin and Token.abi 这三个文件在 tests/src/main/resources 生成对应的 java 类,命令如下:

java -jar build/libs/cita-sdk-20.2.0.jar solidity generate tests/src/main/resources/Token.bin tests/src/main/resources/Token.abi -o tests/src/main/java/ -p com.citahub.cita.tests

Token.java 会通过以上命令生成, Token 可以与 TransactionManager 一起使用来和 Token 合约交互。请注意在 CITA 中应该使用 TransactionManager 而不是 TransactionManager。 请在 TokenCodegenTest.java 查看完整代码.

通过 CITAj 中的 Account 与智能合约交互(测试阶段)

cita-sdk-java 还提供了接口 Account 与智能合约交互。 通过智能合约的名字,地址,函数名和函数入参,Account 可以进行合约的部署和合约函数的调用。通过 Account 这个方式,开发者无需进行合约二进制文件和 abi 细节处理。

合约部署示例代码:

// Deploy contract in sync and async way.
public AppSendTransaction deploy(File contractFile, String nonce, BigInteger quota)

public Future<AppSendTransaction> deployAsync(File contractFile, String nonce, BigInteger quota)

合约函数调用示例代码:

public Object callContract(String contractAddress, String funcName, String nonce, BigInteger quota, Object... args)

//function is a encapsulation of method including name, argument datatypes, return type and other info.
public Object callContract(String contractAddress, AbiDefinition functionAbi, String nonce, BigInteger quota, Object... args)

虽然在第一次部署合约的时候需要提供合约文件,但是在以后调用合约函数的时候 cita-sdk-java 通过 CITA 提供的 getAbi 接口根据合约地址得到对应的 abi。
请在 TokenAccountTest 中查看完整代码。

参与贡献

报告Bug

提交 issue: https://github.com/citahub/cita-sdk-java/issues/new 记得声明所使用软件的版本信息

技术栈

Back end

Java

  • Version: 8
  • Building: gradle-v5.0

编码规范

使用《Google java编程规范》作为我们的编码规范:

Installing the coding style settings in Intellij

  1. Download the intellij-java-google-style.xml file from the http://code.google.com/p/google-styleguide/ repo.
  2. go into Preferences -> Editor -> Code Style. Click on Manage and import the downloaded Style Setting file. Select GoogleStyle as new coding style.

Installing the coding style settings in Eclipse

  1. Download the eclipse-java-google-style.xml file from the http://code.google.com/p/google-styleguide/ repo.
  2. Under Window/Preferences select Java/Code Style/Formatter. Import the settings file by selecting Import.

代码提交规范

代码提交流程

GitHub Flow, Understanding the GitHub flow

git style guide

我们要求遵守 git-style-guide 中的规则来进行分支创建、提交以及合并操作。

版本规则

vx.y.z

  • x.y 跟随 CITA 的版本号;
  • z 由 SDK 自己定义:修复或增加feature 则变化

cita-sdk-java's People

Contributors

ashchan avatar baojuncz avatar boundless-forest avatar clowdrgn avatar conor10 avatar craigwilliams84 avatar dmi3coder avatar duanyytop avatar eepstein avatar ermyas avatar eztierney avatar fooock avatar iikirilov avatar jaycarey avatar joanesespanol avatar keith-cy avatar ligi avatar mine77 avatar nicksavers avatar qingyangkong avatar qingyanl avatar rainchen avatar the-wastl avatar thedoctor avatar timmyz avatar tramonex-nate avatar udld avatar vgorin avatar yangzhenlong avatar zengbing15 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cita-sdk-java's Issues

调用合约查询函数返回的数据中包括非法数据

使用citaj 调用合约查询接口,
接口返回hex数据
通过java解析把数据解析成UTF-8普通字符串时,出现乱码

查询方法1结果:
0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008f62616e6b5472616e736665725061797c2b7c307c2b7c307c2b7c3130303030307c2b7c3130303030307c2b7c307c2b7c3130303030307c2b7c50592d32643062663662662d313937302d343330362d383161382d3361343334663463356534377c2b7c7c2b7c323031392d30382d32382031353a32313a30377c2b7c317c2b7ce8aea2e58d95e5b7b2e7a1aee8aea40000000000000000000000000000000000

字符串结果1:
�bankTransferPay|+|0|+|0|+|100000|+|100000|+|0|+|100000|+|PY-2d0bf6bf-1970-4306-81a8-3a434f4c5e47|+||+|2019-08-28 15:21:07|+|1|+|订单已确认

查询方法2结果:
0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000457c2b7c7c2b7c7c2b7c7c2b7c323031392d30382d32382031353a32353a35327c2b7c7c2b7c7c2b7c7c2b7c323031392d30382d32382031353a32353a30387c2b7c357c2b7c000000000000000000000000000000000000000000000000000000

字符串结果2:
E|+||+||+||+|2019-08-28 15:25:52|+||+||+||+|2019-08-28 15:25:08|+|5|+|

JAVA 代码:

//hex转字符串

//16进制转换成为string类型字符串
private static String hexStringToString(String s) {
    if (s == null || s.equals("")) {
        return null;
    }
    s = s.replace(" ", "");
    byte[] baKeyword = new byte[s.length() / 2];
    for (int i = 0; i < baKeyword.length; i++) {
        try {
            if (s.substring(i * 2, i * 2 + 2).equals("00")) {
                continue;
            }
            baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    try {
        s = new String(baKeyword, "UTF-8");
        new String();
    } catch (Exception e1) {
        e1.printStackTrace();
    }

    return s;
}

//把前导0的字符串转为正常字符串
private static String hexStringToStringOne(String hexStr) {
    String bigInt = new BigInteger(hexStr, 16).toString(16);
    return bigInt;
}


//链上取出的十六进制字符串转为普通字符串
private String hexToString(String hexStr) {
    String BigIntToString = hexStringToStringOne(hexStr.substring(2));
    String orderInfo = hexStringToString(BigIntToString).replace("\u0000", "").replace("\u0001", "").replace("\t", "");
    return orderInfo;
}


//调用合约查询方法获取结果
public String callContractFunc() {
    Call call = new Call('from', contractAddress, callData);
    //该结果有乱码(多余字符)
    String hexStr = citaJService.appCall(call, DefaultBlockParameterName.LATEST).send().getValue();
    return hexToString(hexStr);
}

另外,采用Cita JS sdk 调用合约查询接口,会直接返回正确的字符串数据

代码如下:

(async () => {
    var contractInstance = new citaSDK.base.Contract(abi, contractAddress);
    var queryRes = await contractInstance.methods['myQueryFunc'](params).call();

    //打印查询结果,该结果正确,不包含乱码(多余字符)
    console.log('query res', queryRes);
})();

contractAddress mustn't has 0x prefix?

Transaction tx = Transaction.createFunctionCallTransaction(
                contractAddress,
                nonce,
                this.quota,
                this.validUntilBlock,
                VERSION,
                CHAINID,
                value,
                functionCallData);
        String rawTx = tx.sign(privateKey, isEd25519AndBlake2b,false);

When the contractAddress has 0x prefix, something wrong, the tx can't send to the contractAddress.
After remove 0x in contractAddress, it's ok.

Transaction 中 value 非零时 decodeContent() 失败

  • 在获取发送信息的时候 decodeContent 抛异常
sdk.appGetTransactionByHash("0xabc...").send().getTransaction().decodeContent();
  • 看了下代码, 在 com.cryptape.cita.utils.TransactionUtil#decodeContent
    public static Transaction
            decodeContent(String content) throws InvalidProtocolBufferException {

        Blockchain.UnverifiedTransaction unverifiedTx
                = Blockchain.UnverifiedTransaction.parseFrom(
                ConvertStrByte.hexStringToBytes(Numeric.cleanHexPrefix(content)));

        Blockchain.Transaction blockChainTx = unverifiedTx.getTransaction();

        int version = blockChainTx.getVersion();
        String nonce = blockChainTx.getNonce();
        long quota = blockChainTx.getQuota();
        long validUntilBlock = blockChainTx.getValidUntilBlock();
        String data = bytesToHexString(blockChainTx.getData());
        String value = bytesToHexString(blockChainTx.getValue());

        ......

由于 value 不为零, String value = bytesToHexString(blockChainTx.getValue()); 返回的 value 不是 0x 开头的, 后面转换的时候当 10 进制转换报错了

getNonce can't work

In org/web3j/tx/CitaTransactionManager.java
getNonce should use LATEST rather than DefaultBlockParameterName.PENDING.
Because there are no PENDING in CITA.

[doc mistake] nervosj/docs/zh-CN/Latest/Transaction.md

The statement txToCallContract in Line 2 does not match the references txToDeployContract.sign Line 3 :

1. //construct transaction
2. Transaction txToCallContract = Transction.createFunctionCallTransaction(to, nonce, quota, valid_until_block, version, chainId, value, init);
3. String signedTx = txToDeployContract.sign(this.config.getPrivateKey(), false, false);
4. AppSendTransaction appSendTx = service.sendRawTransaction(signedTx);

getChainId should return BigInteger

org/nervos/appchain/protocol/core/methods/response/AppMetaData.java

    public void setChainId(int chainId) {
        this.chainId = chainId;
    }

    public int getChainId() {
        if (this.version == 0) {
            return this.chainId;
        } else if (this.version == 1) {
            return Integer.parseInt(this.chainIdV1);
        } else {
            throw new IllegalArgumentException("version number can only be 1 or 2");
        }
    }

old chainId is u32
new chainIdV1 is u256
So I think getChainId should return BigInteger
or String?
Same to argument of setChainId

Bytes类使用不了DynamicBytes使用也有问题

Bytes类的构造函数是protected,引入后不能new,且bytes长度需要在0到32,请问下这里是为什么?
DynamicBytes的使用也有问题,在TypedAbi.java中的ctor.newInstance(value);会失败,请问该怎么解决?
屏幕截图 2022-11-20 223449

gradle shadowJar got exception

Welcome to Gradle 5.4.1!

Here are the highlights of this release:

  • Run builds with JDK12
  • New API for Incremental Tasks
  • Updates to native projects, including Swift 5 support

For more details see https://docs.gradle.org/5.4.1/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

  • Where:
    Build file '/cita-sdk-java/console/build.gradle' line: 12

  • What went wrong:
    A problem occurred evaluating project ':console'.

Could not get unknown property 'classesDir' for test classes of type org.gradle.api.internal.tasks.DefaultSourceSetOutput.

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.4.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 27s

优化合约生成

  1. 生成合约时,nonce, validUntilBlock, version, chainId这几个参数都是重复要输入的,自动获取或者通过构造函数传入
  2. 非payable的函数生成方法应该不用传value
  3. 生成合约类时候对于 payable 函数多一个 weivalue,大家不理解,最好能在文档或社区中增加一篇详细说明
    来源用户反馈:https://talk.citahub.com/t/topic/777

为什么交易直接就能出块成功?

合约地址:6060604052341561000f57600080fd5b60408051908101604052600b81527f68656c6c6f20776f726c640000000000000000000000000000000000000000006020820152600090805161005692916020019061005c565b506100f7565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009d57805160ff19168380011785556100ca565b828001600101855582156100ca579182015b828111156100ca5782518255916020019190600101906100af565b506100d69291506100da565b5090565b6100f491905b808211156100d657600081556001016100e0565b90565b6102c3806101066000396000f30060606040526004361061004b5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166320965255811461005057806393a09352146100da575b600080fd5b341561005b57600080fd5b61006361012d565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561009f578082015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156100e557600080fd5b61012b60046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506101d695505050505050565b005b6101356101ed565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101cb5780601f106101a0576101008083540402835291602001916101cb565b820191906000526020600020905b8154815290600101906020018083116101ae57829003601f168201915b505050505090505b90565b60008180516101e99291602001906101ff565b5050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024057805160ff191683800117855561026d565b8280016001018555821561026d579182015b8281111561026d578251825591602001919060010190610252565b5061027992915061027d565b5090565b6101d391905b8082111561027957600081556001016102835600a165627a7a72305820086c5bf2a74080392d819fbd84ddb063f16da81bfcfa3e0d9d095fc2b99588220029

网络地址:http://121.196.200.225:1337

from:0x9866174664d0eec7988fcc223ee14f6398cd9448
to:0x5f78ee58f5900045d9149c051e12c3b401e8c4df
amount:1
txHash:0xda58810ab925c40d1eea2d60813e66fc5fccab0acda59973dc8e2b3e117fc75d

from地址是我随意生成的地址,肯定没有余额的,为什么这笔交易能直接成功?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.