diff --git a/.classpath b/.classpath
deleted file mode 100644
index 7cfb3a1..0000000
--- a/.classpath
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.project b/.project
deleted file mode 100644
index c6bfe49..0000000
--- a/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- DNA-SDK
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index e9441bb..0000000
--- a/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding/=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 13b3428..0000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,13 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/DNA-java-sdk.iml b/DNA-java-sdk.iml
new file mode 100644
index 0000000..da3733c
--- /dev/null
+++ b/DNA-java-sdk.iml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5fe81ac
--- /dev/null
+++ b/README.md
@@ -0,0 +1,88 @@
+
+JAVA SDK For DNA
+Version 2.1.0
+
+## Overview
+
+This is a comprehensive Java library for the DNA blockchain. Currently, it supports local wallet management, digital identity management, digital asset management, deployment and invoke for Smart Contract , and communication with DNA Blockchain. The future will also support more rich functions and applications .
+
+## Getting started
+
+* 进入 [中文版](docs/README.md) .
+
+
+## Installation Environment
+
+Please configure JDK 8 and above.
+
+> **Note:** As the length of key used in SDK is greater than 128, due to the restriction of JAVA security policy files, it is necessary to download local_policy.jar and US_export_policy.jar from the official website , to replace the two jar of ${java_home}/jre/lib/security in JRE directory.
+
+Download URL:
+
+>http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
+
+
+## Build
+
+```
+mvn clean install
+```
+
+### How to Use
+
+Add maven dependency:
+
+```
+
+
+ com.github.DNAProject
+ DNA-java-sdk/artifactId>
+ 2.1.0
+
+```
+
+## Preparations
+
+* Make sure DNA Blockchain has deployed well, RPC port has been opened, and SDK will connect the RPC server to initialize.
+
+
+# Contributing
+
+Can I contribute patches to DNA project?
+
+Yes! Please open a pull request with signed-off commits. We appreciate your help!
+
+You can also send your patches as emails to the developer mailing list.
+Please join the DNA mailing list or forum and talk to us about it.
+
+Either way, if you don't sign off your patches, we will not accept them.
+This means adding a line that says "Signed-off-by: Name " at the
+end of each commit, indicating that you wrote the code and have the right
+to pass it on as an open source patch.
+
+Also, please write good git commit messages. A good commit message
+looks like this:
+
+ Header line: explain the commit in one line (use the imperative)
+
+ Body of commit message is a few lines of text, explaining things
+ in more detail, possibly giving some background about the issue
+ being fixed, etc etc.
+
+ The body of the commit message can be several paragraphs, and
+ please do proper word-wrap and keep columns shorter than about
+ 74 characters or so. That way "git log" will show things
+ nicely even when it's indented.
+
+ Make sure you explain your solution and why you're doing what you're
+ doing, as opposed to describing what you're doing. Reviewers and your
+ future self can read the patch, but might not understand why a
+ particular solution was implemented.
+
+ Reported-by: whoever-reported-it
+ Signed-off-by: Your Name
+
+
+## License
+
+The DNA library (i.e. all code outside of the cmd directory) is licensed under the GNU Lesser General Public License v3.0, also included in our repository in the License file.
diff --git a/README_CN.md b/README_CN.md
deleted file mode 100644
index fb9292c..0000000
--- a/README_CN.md
+++ /dev/null
@@ -1,498 +0,0 @@
-# DNA SDK 手册
-
-
-
-## 1 准备工作
-
-*** 下载DNA SKD(java版本), 配置JAVA8运行环境
-
-> > 注意: 配置java运行环境后运行程序时如出现如下错误:
-> >
-> > java.security.InvalidKeyException: Illegal key size
-> >
-> > 则这是秘钥长度大于128,安全策略文件受限的原因。可以去官网下载local_policy.jar和US_export_policy.jar,替换jre目录中${java_home}/jre/lib/security原有的与安全策略这两个jar即可。下载地址:
-> >
-> > [http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html](http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html)
-
-
-
-
-
-## 2 接入步骤
-
-### 2.1 OAuth认证
-
-DNA默认关闭认证选项,使用SDK可以直接访问DNA。在联盟链或私有链有认证要求的场景下,您需要首先完成用户注册,并获取授权accessToken才能访问应用。用户注册和获取Token请参考: [https://forum.dnaproject.org/t/dna/112](https://forum.dnaproject.org/t/dna/112)。
-
-
-
-### 2.2 SDK调用
-
-调用sdk时,将该访问令牌(非联盟链可任意)作为其中一个初始化参数传递进来,实现数字资产的注册、分发、转移、存证、取证等操作。
-
-
-
-
-
-## 3 接口说明##
-
-调用每一个接口方法之前必须实例化账户管理器,后续的接口都是基于账户管理来调用的。实例化账户管理器所需参数包括:连接地址url,账户存储位置路径path,访问令牌accessToken。
-
-```
-String dnaUrl = "http://127.0.0.1:20334";
-String dnaToken = "";
-String path = "./dat/3.db3";
-AccountManager wm = AccountManager.getWallet(path, dnaUrl, dnaToken);
-```
-
-
-
-
-
-### 3.1 创建账户
-
-通过传递一个int类型的数值,可以创建多个账户合约,以合约地址列表形式返回。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | -------- | ------------ | -------- | ---------------- |
-| 输入参数 | numCount | int | 单次创建账户个数 | int类型占4字节 |
-| 输出参数 | list | List | 账户合约地址列表 | 合约地址是以A开头的34位字符串 |
-
-eg:
-
-List list = wm.createAccount(numCount);
-
-
-
-### 3.2 导入私钥
-
-根据导入可视化私钥(字节数组转换成十六进制的字符串)方式来创建账户
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ---------- | ------ | ---- | ------------------------ |
-| 输入参数 | privateKey | String | 私钥信息 | 32位字节数组转成十六进制的64位字符串类型数据 |
-| 输出参数 | address | String | 账户地址 | 合约地址是以A开头的34位字符串 |
-
-eg:
-
-String address = wm.createAccountsFromPrivateKey(String privateKey);
-
-
-
-### 3.3 注册资产
-
-通过传递资产的基本信息来产生一笔区块链上合法的资产,返回资产编号。后续的资产类操作就可以使用该资产编号。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ---------- | ------ | ------------- | -------------- |
-| 输入参数 | issuer | String | 发行者地址 | 地址是以A开头的34位字符串 |
-| | name | String | 资产名称 | 长度可任意 |
-| | amount | long | 资产数量 | long类型占8字节 |
-| | desc | String | 描述 | 长度可任意 |
-| | controller | String | 控制者地址 | 地址是以A开头的34位字符串 |
-| 输出参数 | txid | String | 交易编号,这里代表资产编号 | 交易编号是64位字符串 |
-
-eg:
-
-String assetid = wm.reg(issuer, name, amount , desc, controller);
-
-
-
-### 3.4 分发资产
-
-通过传递分发资产的基本信息来完成一笔资产的分发操作,返回交易编号。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ---------- | ------ | ------- | ------------------------- |
-| 输入参数 | controller | String | 资产控制者地址 | 地址是以A开头的34位字符串 |
-| | assetid | String | 资产编号 | 资产编号对应注册资产的交易编号,长度为64位字符串 |
-| | amount | long | 分发数量 | long类型占8字节 |
-| | recver | String | 接收者地址 | 地址是以A开头的34位字符串 |
-| | desc | String | 描述 | 长度可任意 |
-| 输出参数 | txid | String | 交易编号 | 交易编号是64位字符串 |
-
-eg:
-
-String txid = wm.iss(controller, assetid, amount , recver , desc );
-
-
-
-### 3.5 转移资产
-
-通过传递分发资产的基本信息来完成一笔资产的分发操作,返回交易编号。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ---------- | ------ | ------- | ------------------------- |
-| 输入参数 | controller | String | 资产控制者地址 | 地址是以A开头的34位字符串 |
-| | assetid | String | 资产编号 | 资产编号对应注册资产的交易编号,长度为64位字符串 |
-| | amount | long | 转移数量 | long类型占8字节 |
-| | recver | String | 接收者地址 | 地址是以A开头的34位字符串 |
-| | desc | String | 描述 | 长度可任意 |
-| 输出参数 | txid | String | 交易编号 | 交易编号是64位字符串 |
-
-eg:
-
-String txid = wm.trf(controller, assetid, amount , recver , desc );
-
-
-
-### 3.6 存证
-
-通过传递存证交易的基本信息来完成一笔资产的分发操作,返回交易编号。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ------- | ------ | ---- | ----------- |
-| 输入参数 | content | String | 存证信息 | 长度任意的字符串 |
-| | desc | String | 描述 | 长度任意的字符串 |
-| 输出参数 | txid | String | 交易编号 | 交易编号是64位字符串 |
-
-eg:
-
-String txid = wm.storeCert(content, desc);
-
-
-
-### 3.7 取证
-
-查询类操作,传递存证时的交易编号,输出具体存证内容
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ------ | ------ | ---- | ----------- |
-| 输入参数 | txid | String | 交易编号 | 交易编号是64位字符串 |
-| 输出参数 | cotent | String | 存证内容 | 长度任意的字符串 |
-
-eg:
-
-String content= wm.queryCert(txid);
-
-
-
-### 3.8 账户信息
-
-查询类操作,传递账户地址,输出账户具体信息
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ------- | ----------- | ---- | ------------------------------- |
-| 输入参数 | address | String | 合约地址 | 地址是以A开头的34位字符串 |
-| 输出参数 | info | AccountInfo | 账户信息 | 自定义类型,包括合约地址/公钥/私钥/公钥hash/私钥wif |
-
-| 自定义类型 | 子字段 | 子类型 | 描述 | 说明 |
-| ----------- | ------- | ------ | ----- | --------------------- |
-| AccountInfo | address | String | 合约地址 | 地址是以A开头的34位字符串 |
-| | pubkey | String | 公钥 | 压缩模式下公钥的十六进制字符串表示 |
-| | prikey | String | 私钥 | 私钥的十六进制字符串表示 |
-| | priwif | String | 私钥WIF | 私钥Base58算法之后的字符串表示 |
-| | pkhash | String | 公钥哈希 | 压缩模式下公钥哈希之后的十六进制字符串表示 |
-
-eg:
-
-AccountInfo info = wm.getAccountInfo(address);
-
-
-
-### 3.9 账户资产
-
-查询类操作。传递账户地址,输出账户资产详情
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ------- | ------------ | ------ | ---------------------- |
-| 输入参数 | address | String | 合约地址 | 合约地址是以A开头的34位字符串 |
-| 输出参数 | info | AccountAsset | 账户资产信息 | 账户资产信息包括合约地址、可用资产/冻结资产 |
-
-| 自定义类型 | 子字段 | 子类型 | 描述 | 说明 |
-| ------------ | ------------ | ----------- | ------ | ---------------------- |
-| AccountAsset | address | String | 合约地址 | 合约地址是以A开头的34位字符串 |
-| | canUseAssets | List | 可用资产列表 | 可用资产列表,资产类型包括资产编号和资产数量 |
-| | freezeAssets | List | 冻结资产列表 | 不可用资产列表,资产包括资产编号和资产数量 |
-| Asset | assetid | String | 资产编号 | 64位字符串 |
-| | amount | long | 资产数量 | 8字节的long类型 |
-
-eg:
-
-AccountAsset info = wm.getAccountAsset(userAddr);
-
-
-
-### 3.10 资产信息
-
-查询类操作。传递资产编号,输出资产详情。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ------- | --------- | ---- | -------------------------- |
-| 输入参数 | assetid | String | 资产编号 | 64位字符串 |
-| 输出参数 | info | AssetInfo | 资产信息 | 资产信息包括资产编号、名称、注册数量、注册者、控制者 |
-
-| 自定义类型 | 子字段 | 子类型 | 描述 | 说明 |
-| --------- | ---------- | ------ | ---- | ------------------------------- |
-| AssetInfo | name | String | 资产名称 | 长度任意的字符串 |
-| | precision | int | 精度 | 4字节的int类型 |
-| | assetType | int | 资产类型 | 4字节的int类型,取值:17代表代币,1代表股权,0代表法币 |
-| | recordType | int | 记账模式 | 4字节的int类型,取值:0代表utxo模式,1代表余额模式 |
-
-eg:
-
-AssetInfo info = wm.getAssetInfo(assetid);
-
-
-
-### 3.11 交易信息
-
-查询类操作。传递交易编号,返回交易具体信息。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ---- | --------------- | ---- | -------------------- |
-| 输入参数 | txid | String | 交易编号 | 64位字符串 |
-| 输出参数 | info | TransactionInfo | 交易信息 | 交易信息包括交易编号、交易输入、交易输出 |
-
-| 自定义类型 | 子字段 | 子类型 | 描述 | 说明 |
-| --------------- | ------- | ------------------ | ---- | ---------------------- |
-| TransactionInfo | txid | String | 交易编号 | 64位字符串 |
-| | type | String | 交易类型 | 取值:注册交易/分发交易/转账交易/存证交易 |
-| | inputs | List | 交易输入 | 交易资产的来源 |
-| | outputs | List | 交易输出 | 交易资产的去向 |
-| | attrs | String | 描述 | 任意长度的字符串 |
-| TxInputInfo | address | String | 合约地址 | 合约地址是以A开头的34位字符串 |
-| | assetid | String | 资产编号 | 64位字符串 |
-| | amount | long | 资产数量 | 8字节的long类型 |
-| TxOutputInfo | address | String | 合约地址 | 合约地址是以A开头的34位字符串 |
-| | assetid | String | 资产编号 | 64位字符串 |
-| | amount | long | 资产数量 | 8字节的long类型 |
-
-eg:
-
-TransactionInfo info = wm.getTransactionInfo(txid);
-
-
-
-### 3.12 所有账户
-
-通过账户管理器实例可以查询当前管理器中所有账户地址。
-
-| 参数 | 字段 | 类型 | 描述 | 说明 |
-| ---- | ---- | ------------ | ------ | ------ |
-| 输入参数 | 空 | 空 | 参数为空 | 参数为空 |
-| 输出参数 | list | List | 账户地址列表 | 账户地址列表 |
-
-eg:
-
-List list = wm.listAccount();
-
-
-
-## 4 调用示例
-
-```
-//实例化账户管理器
-String dnaUrl = "http://127.0.0.1:20334"; // DNA节点地址
-String dnaToken = ""; // 访问令牌,非必需项,如开启OAuth认证,则需要填写
-String path = "./dat/3.db3"; // 钱包路径
-AccountManager wm = AccountManager.getWallet(path, dnaUrl, dnaToken);
-```
-
-
-
-
-
-### 4.1 创建账户
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 创建账户
-String user01 = wm.createAccount(); // 创建单个账户
-List list = wm.createAccount(10); // 批量创建10个账户
-```
-
-
-
-### 4.2 导入私钥
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 创建账户
-String privatekey = "";
-String address = wm.loadPrivateKey(privatekey);
-```
-
-
-
-### 4.3 注册资产
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 注册资产
-String issuer= ""; // 资产发行者地址
-String name = ""; // 资产名称
-long amount = 10000; // 资产数量
-String desc = ""; // 描述
-String controller = ""; // 资产控制者地址
-String assetid = wm.reg(issuer, name, amount , desc, controller);
-System.out.println("rs:"+assetid);
-```
-
-
-
-### 4.4 发行资产
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 分发资产
-String controller= ""; // 资产控制者地址
-String assetid = ""; // 资产编号(由注册资产产生)
-long amount = 100; // 分发数量
-String recver = ""; // 分发资产接收者地址
-String desc = ""; // 描述
-String txid = wm.iss(controller, assetid, amount , recver , desc );
-System.out.println("rs:"+txid);
-```
-
-
-
-### 4.5 转移资产
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 转移资产
-String controller= ""; // 资产控制者地址
-String assetid = ""; // 资产编号(由注册资产产生)
-long amount = 100; // 转移数量
-String recver = ""; // 转移资产接收者地址
-String desc = ""; // 描述
-String txid = wm.trf(controller, assetid, amount , recver , desc );
-System.out.println("rs:"+txid);
-```
-
-
-
-### 4.6 存证
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 方式1:存证
-String content = ""; // 待存储的信息
-String desc = ""; // 描述
-String txid = wm.storeCert(content, desc);
-System.out.println("rs:"+txid);
-```
-
-
-
-### 4.7 取证
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 取证
-String txid = ""; // 存证编号
-String content= wm.queryCert(txid);
-System.out.println("rs:"+content);
-```
-
-
-
-### 4.8 账户信息
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 查询账户信息
-String userAddr = ""; // 账户地址
-AccountInfo info = wm.getAccountInfo(userAddr);
-```
-
-
-
-### 4.9 账户资产
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 查询账户资产
-String userAddr = ""; // 账户地址
-AccountAsset info = wm.getAccountAsset(userAddr);
-```
-
-
-
-### 4.10 资产信息
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 查询账户资产
-String assetid = "";
-AssetInfo info = wm.getAssetInfo(assetid);
-```
-
-
-
-### 4.11 交易信息
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 查询账户资产
-String txid = "";
-TransactionInfo info = wm.getTransactionInfo(txid);
-```
-
-
-
-### 4.12 所有账户
-
-```
-// 打开账户管理器(参考实例化账户管理器)
-AccountManager wm = getAccountManager();
-
-// 查询管理器中所有账户
-List list = wm.listAccount();
-```
-
-
-
-
-
-## 5 开发说明
-
- 该SDK供客户端使用,其中含有账户信息的管理,比如合约地址、公钥、私钥,这些信息保存至客户端数据库中。具体的数据库可根据需求自由选择,目前实现的数据库有sqlite、mysql,sqlite是一个文件数据库,初始化时需要传递路径,上面的示例是根据该sqlite保存账户信息的数据库实现给出的,mysql使用时还需要创建对应的表,以及实现具体的数据库连接。通过SDK接入DNA区块链时,可以直接使用当前Sqlite数据库保存账户的公私钥信息的UserWalletManager,也可自定义一个账户管理器来管理账户私密信息。自己实现账户管理器可参考DNA.Implementations.Wallets.SQLite.UserWallet 类。
-
-
-
-
-
-## 6 错误代码
-
-| 返回代码 | 描述信息 | 说明 |
-| :---- | ------------------- | ----------------- |
-| 0 | SUCCESS | 成功 |
-| 41001 | SESSION_EXPIRED | 会话无效或已过期( 需要重新登录) |
-| 41002 | SERVICE_CEILING | 达到服务上限 |
-| 41003 | ILLEGAL_DATAFORMAT | 不合法数据格式 |
-| 42001 | INVALID_METHOD | 无效的方法 |
-| 42002 | INVALID_PARAMS | 无效的参数 |
-| 42003 | INVALID_TOKEN | 无效的令牌 |
-| 43001 | INVALID_TRANSACTION | 无效的交易 |
-| 43002 | INVALID_ASSET | 无效的资产 |
-| 43003 | INVALID_BLOCK | 无效的块 |
-| 44001 | UNKNOWN_TRANSACTION | 找不到交易 |
-| 44002 | UNKNOWN_ASSET | 找不到资产 |
-| 44003 | UNKNOWN_BLOCK | 找不到块 |
-| 45001 | INVALID_VERSION | 协议版本错误 |
-| 45002 | INTERNAL_ERROR | 内部错误 |
-
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..d97a957
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,69 @@
+ DNA Java SDK 介绍
+
+Version 2.1.0
+
+
+# 总体介绍
+
+该项目是DNA官方Java SDK,它是一个综合性SDK,目前支持:本地钱包管理、数字身份管理、数字资产管理、智能合约部署和调用、与节点通信等。未来还将支持更丰富的功能和应用。
+
+## 主要内容
+
+- [快速开始](sdk_get_start.md)
+- [区块链节点接口](basic.md)
+- [数字资产](asset.md)
+- [数字身份](dnaid.md)
+- [可信声明](dnaid_claim.md)
+- [智能合约部署和调用](smartcontract.md)
+- [SDK接口描述](interface.md)
+- [钱包文件及规范](Wallet_File_Specification_cn.md)
+- [权限管理](auth.md)
+- [治理合约](governance.md)
+- [节点API文档](https://github.com/DNAProject/DNA/tree/master/docs/specifications)
+- [错误码](errorcode.md)
+
+## 代码结构说明:
+
+* acount:账号相关操作,如生成公私钥
+* common:通用基础接口
+* core:核心层,包括合约、交易、签名等
+* crypto:加密相关,如ECC/SM
+* io:io操作
+* network:restful\rpc\websocket与链通信接口
+* sdk:对SDK底层做封装、Info信息、通信管理、Claim管理、钱包管理、异常类。
+* dnaSdk类:提供管理器和交易实例,管理器包括:walletMgr、connManager。
+ * walletMgr钱包管理器主要管理数字身份及数字资产账户,用户向链上发送交易需要私钥做签名。
+ * connManager与链上通信管理。任何发送交易和查询都需要通过连接管理器。
+
+## 安装说明
+
+### 请配置JDK 8的开发环境
+
+> **注意:** SDK用的key的长度超过128位,由于java的安全策略文件对key的长度的限制,需要下载local_policy.jar和US_export_policy.jar这两个jar包,替换JRE库${java_home}/jre/lib/security目录下对应的jar包。
+
+jar包下载地址:
+
+>http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
+
+
+### Build
+
+```
+$ mvn clean install
+```
+
+### 引入依赖
+
+
+```
+
+
+ com.github.DNAProject
+ DNA-java-sdk/artifactId>
+ 2.1.0
+
+```
+
+### 预准备
+
+* 启动[DNA节点](https://github.com/DNAProject/DNA),无论是主网、测试网、私网都可以。确保rpc端口可以访问,并且确保SDK可以连接RPC服务器。
diff --git a/docs/Wallet_File_Specification_cn.md b/docs/Wallet_File_Specification_cn.md
new file mode 100644
index 0000000..bcd1df4
--- /dev/null
+++ b/docs/Wallet_File_Specification_cn.md
@@ -0,0 +1,272 @@
+
+ 钱包规范
+
+
+
+钱包规范描述了钱包数据结构及导出数字身份或资产账号二维码的数据结构。
+
+## 1. 钱包文件结构
+
+钱包文件数据以json格式存储,文件名后缀并无要求,钱包文件数据结构如下:
+
+```
+{
+ "name": "MyWallet",
+ "version": "1.0",
+ "scrypt": {},
+ "defaultDnaid": "did:dna:TJNxJe2Ty8eSCjCDxDPwiS78NRAn8XPTFL",
+ "defaultAccountAddress": "TJNxJe2Ty8eSCjCDxDPwiS78NRAn8XPTFL",
+ "createTime": "2018-03-14T03:12:30.862Z",
+ "identities": [],
+ "accounts": [],
+ "extra": null
+}
+```
+参数描述:
+
+```name``` 钱包名.
+
+```version``` 钱包版本号.
+
+```scrypt``` SCrypt算法参数.
+
+```defaultDnaid``` 钱包中的默认Dnaid.
+
+```defaultAccountAddress``` 钱包中默认账户地址.
+
+```createTime``` 钱包创建时间.
+
+```identities``` 身份列表.
+
+```accounts``` 账户列表.
+
+```extra``` 备用参数.
+
+一个真实的钱包数据如下:
+
+```json
+{
+ "name": "mickey",
+ "defaultDnaid": "",
+ "defaultAccountAddress": "",
+ "createTime": "2018-06-30T08:52:01.519Z",
+ "version": "1.0",
+ "scrypt": {
+ "n": 4096,
+ "r": 8,
+ "p": 8,
+ "dkLen": 64
+ },
+ "identities": [{
+ "dnaid": "did:dna:ATcHA9eYKyve8M74CB4p6Ssx7kwXjmREUa",
+ "label": "mickey",
+ "lock": false,
+ "controls": [{
+ "id": "1",
+ "algorithm": "ECDSA",
+ "parameters": {
+ "curve": "P-256"
+ },
+ "key": "M+PnrYLVDrU0gkSzj0FAsvqCYv+HWEEUMDSyKSJACzJhZVglFU9tkfQKlLby5UCY",
+ "address": "ATcHA9eYKyve8M74CB4p6Ssx7kwXjmREUa",
+ "salt": "wwa12j4K0SyDP23+UDJNtA==",
+ "enc-alg": "aes-256-gcm"
+ }]
+ }],
+ "accounts": [{
+ "address": "AJQLNWy9X6qdeEFrSH6UzgEjadSsRiYDCS",
+ "label": "mickey",
+ "lock": false,
+ "algorithm": "ECDSA",
+ "parameters": {
+ "curve": "P-256"
+ },
+ "key": "qFbemAbu7fEjOJzAZZhGkmzp2YNxdSCuK7xyvhBAnUBX/FmAj2Ns84Y7frh6hfQv",
+ "enc-alg": "aes-256-gcm",
+ "salt": "u+SiqpRk17b0vIPesh4xXA==",
+ "isDefault": false,
+ "publicKey": "037fb6dfc9420e1d8275d9133d6d69fe64e8e3567241e7583234b9efa8b2ce7ae1",
+ "signatureScheme": "SHA256withECDSA"
+ }],
+ "extra": null
+}
+```
+
+### 1.1 Scrypt参数
+
+SCrypt算法参数,Scrypt数据结构:
+
+```json
+{
+ "n": 16384,
+ "r": 8,
+ "p": 8,
+ "dkLen" : 64
+}
+```
+
+参数描述:
+
+```n``` 内存消耗,必须是 2^N.
+
+```r``` 参数.
+
+```p``` SCrypt算法的并行参数.
+
+```dkLen``` 派生key的长度.
+
+### 1.2 数字身份
+
+数字身份数据结构:
+```json
+{
+ "dnaid": "did:dna:TQLASLtT6pWbThcSCYU1biVqhMnzhTgLFq",
+ "label": "MyIdentity",
+ "lock": false,
+ "isDefault" : false,
+ "controls": []
+}
+```
+参数描述:
+
+```dnaid``` 身份id.
+
+```label``` 昵称.
+
+```lock``` 是否锁住该身份.
+
+```isDefault``` 是否是默认使用的身份.
+
+```controls``` 控制人.
+
+#### Control数据结构
+
+Control是数字身份的控制人,里面包含控制人的加密后算法名,私钥,公钥,地址,salt等。
+
+```json
+{
+ "algorithm": "ECDSA",
+ "parameters": {},
+ "id": "1",
+ "key": "6PYWB8m1bCnu5bQkRUKAwbZp2BHNvQ3BQRLbpLdTuizpyLkQPSZbtZfoxx",
+ "address": "AQkGLumU1tnyJBGV1ZUmD229iQf9KRTTDL",
+ "salt": "Rv4v3a4U1zFEq28/"
+}
+```
+参数描述:
+
+```algorithm``` 签名算法名称.
+
+```parameters``` 曲线参数.
+
+```id``` 控制人id.
+
+```key``` 加密后私钥.
+
+```address``` base58地址.
+
+```salt``` 16字节的盐,以base64格式存储.
+
+
+#### Parameter数据结构
+
+签名算法参数数据结构
+```json
+{
+ "curve":"P-256"
+}
+```
+参数描述:
+
+```curve``` is the name of the elliptic curve.
+
+### 1.3 Account
+
+
+资产账户信息```Account``` 数据结构:
+
+
+```json
+{
+ "address": "AadQ5xRwrSsFTGzKfLHc1brzykdnf7phhD",
+ "label": "a6575fd9",
+ "lock": false,
+ "algorithm": "ECDSA",
+ "parameters": {
+ "curve": "P-256"
+ },
+ "key": "NyfxXX+xKDG2agrDy3espqX7N0k3MysTgqx5FxJGI8bkklZQO6+6BSluyBRvEsOx",
+ "enc-alg": "aes-256-gcm",
+ "salt": "MHct5XIedi86rQILJFi9lA==",
+ "isDefault": false,
+ "publicKey": "03e897f5a1ea306270e3e1e539c9065b6905e2430aae7f4802e1114f01634d7235",
+ "signatureScheme": "SHA256withECDSA"
+}
+```
+参数描述:
+
+```address``` base58 地址.
+
+```enc-alg``` 私钥加密算法名称.
+
+```salt``` 16字节的盐,以base64格式存储.
+
+```publicKey``` 公钥
+
+```signatureScheme``` 签名算法体系.
+
+```isDefault``` 是否是默认账户.
+
+```label``` 昵称.
+
+```lock``` 是否加锁.
+
+```algorithm``` 签名算法名称.
+
+```parameters``` 签名算法参数.
+
+```key``` 加密后私钥.
+
+
+
+## 2. 二维码规范
+
+身份和账号二维码的作用是方便通过扫描导入身份或账号,二维码同时支持数字身份和资产账号规范.
+
+```json
+{
+ "type":"I",
+ "label": "MyIdentity",
+ "algorithm": "ECDSA",
+ "scrypt": {
+ "n": 4096,
+ "p": 8,
+ "r": 8,
+ "dkLen": 64
+ },
+ "key":"x0U3gy7mQMpzCYXwlt/oWZerSGaCUimSMN2UiSd2aKs=",
+ "address" : "AQkGLumU1tnyJBGV1ZUmD229iQf9KRTTDL",
+ "salt" : "Rv4v3a4U1zFEq28/",
+ "parameters": {
+ "curve": "P-256"
+ }
+}
+```
+参数描述:
+
+```type``` 类型, **I** 代表身份 , **A** 代表账号.
+
+```label``` 昵称.
+
+```algorithm``` 签名算法名.
+
+```parameters``` 签名算法参数.
+
+```scrypt``` scrypt参数.
+
+```key``` 加密后私钥.
+
+```address``` 地址.
+
+```salt``` 16字节的盐,以base64格式存储.
+
diff --git a/docs/asset.md b/docs/asset.md
new file mode 100644
index 0000000..d61a8fd
--- /dev/null
+++ b/docs/asset.md
@@ -0,0 +1,230 @@
+ 数字资产
+
+
+## 钱包文件及规范
+
+钱包文件是一个Json格式的数据存储文件,可同时存储多个数字身份和多个数字资产账户。具体参考[钱包文件规范](Wallet_File_Specification.md)。
+
+为了管理数字资产,您首先需要创建/打开一个钱包文件。
+
+```java
+//如果不存在钱包文件,会自动创建钱包文件。
+DnaSdk dnaSdk = DnaSdk.getInstance();
+dnaSdk.openWalletFile("Demo.json");
+```
+> 注:目前仅支持文件形式钱包文件,也可以扩展支持数据库或其他存储方式。
+
+## 资产账户数据结构说明
+`address` 是base58编码的账户地址。
+`label` 是账户的名称。
+`isDefault`表明账户是否是默认的账户。默认值为false。
+`lock` 表明账户是否是被用户锁住的。客户端不能消费掉被锁的账户中的资金。
+`algorithm` 是秘钥算法名称。
+`parameters` 是加密算法所需参数。
+`curve` 是椭圆曲线的名称。
+`key` 是NEP-2格式的私钥。该字段可以为null(对于只读地址或非标准地址)。
+`encAlg` 私钥加密的算法名称,固定为aes-256-ctr。
+`salt` 私钥解密参数。
+`extra` 是客户端存储额外信息的字段。该字段可以为null。
+`signatureScheme` 是签名方案,用于交易签名。
+`hash` hash算法,用于派生秘钥。
+
+
+```java
+public class Account {
+ public String label = "";
+ public String address = "";
+ public boolean isDefault = false;
+ public boolean lock = false;
+ public String algorithm = "";
+ public Map parameters = new HashMap() ;
+ public String key = "";
+ @JSONField(name = "enc-alg")
+ public String encAlg = "aes-256-gcm";
+ public String salt = "";
+ public String hash = "sha256";
+ public String signatureScheme = "SHA256withECDSA";
+ public Object extra = null;
+}
+```
+
+## 数字资产账户管理
+
+以下举例说明如何管理钱包中的资产账户。
+
+* 创建数字资产账号
+
+```java
+DnaSdk dnaSdk = DnaSdk.getInstance();
+Account acct = dnaSdk.getWalletMgr().createAccount("password");
+//创建的账号或身份只在内存中,如果要写入钱包文件,需调用写入接口
+dnaSdk.getWalletMgr().writeWallet();
+```
+
+
+* 移除数字资产账号
+
+```java
+dnaSdk.getWalletMgr().getWallet().removeAccount(address);
+//写入钱包
+dnaSdk.getWalletMgr().writeWallet();
+```
+
+* 设置默认数字资产账号
+
+```java
+dnaSdk.getWalletMgr().getWallet().setDefaultAccount(index);
+dnaSdk.getWalletMgr().getWallet().setDefaultAccount("address");
+```
+> Note: index表示设置第index个account为默认账户,address表示设置该address对应的account为默认账户
+
+## 原生数字资产接口
+
+
+原生数字资产是Gas。封装了构造交易、交易签名、发送交易。
+
+#### 1. 转账
+```java
+String sendTransfer(Account sendAcct, String recvAddr, long amount, Account payerAcct, long gaslimit, long gasprice)
+```
+功能说明: 从发送方转移一定数量的资产到接收方账户
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | sendAcct| Account | 发送方账户 | 必选 |
+| | recvAddr | Account | 接收方地址 | 必选 |
+| | amount | long | 转移的资产数量|必选|
+| | payerAcct| Account |支付交易费用的账户 | 必选|
+| | gaslimit | long | 声明发行者和申请者dnaid | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | 交易hash | String | 交易hash | |
+
+#### 2. 授权转移资产
+```java
+String sendApprove(Account sendAcct, String recvAddr, long amount, Account payerAcct, long gaslimit, long gasprice)
+```
+功能说明: sendAddr账户允许recvAddr转移amount数量的资产
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | sendAcct| Account | 发送方账户 | 必选 |
+| | recvAddr | Account | 接收方地址 | 必选 |
+| | amount | long | 授权的资产数量|必选|
+| | payerAcct| Account |支付交易费用的账户 | 必选|
+| | gaslimit | long | 声明发行者和申请者dnaid | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | 交易hash | String | 交易hash | |
+
+#### 3. TransferFrom
+
+```java
+String sendTransferFrom(Account sendAcct, String fromAddr, String toAddr, long amount, Account payerAcct, long gaslimit, long gasprice)
+```
+功能说明: sendAcct账户从fromAddr账户转移amount数量的资产到toAddr账户
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | sendAcct| Account | 发送方账户 | 必选 |
+| | fromAddr | Account | 资产转出方地址 | 必选 |
+| | toAddr | Account | 资产转入方地址 | 必选 |
+| | amount | long | 转移的资产数量|必选|
+| | payerAcct| Account |支付交易费用的账户 | 必选|
+| | gaslimit | long | 声明发行者和申请者dnaid | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | 交易hash | String | 交易hash | |
+
+#### 4. 查询余额
+
+```java
+long queryBalanceOf(String address)
+```
+功能说明: 查询账户address资产余额
+
+参数说明:
+
+```address```: 账户地址
+
+返回值:账户余额
+
+5. 查询Allowance
+```java
+long queryAllowance(String fromAddr,String toAddr)
+```
+功能说明: 查询fromAddr授权toAddr转移的数量
+
+参数说明:
+
+```fromAddr```: 授权转出方的账户地址
+
+```toAddr```: 允许转入方的账户地址
+
+返回值:授权转移的数量
+
+#### 6. 查询资产名
+
+```java
+String queryName()
+```
+功能说明: 查询资产名信息
+
+参数说明:
+
+返回值:资产名称
+
+#### 7. 查询资产Symbol
+
+```java
+String querySymbol()
+```
+功能说明: 查询资产Symbol信息
+
+参数说明:
+
+返回值:Symbol信息
+
+#### 8. 查询资产的精确度
+
+```java
+long queryDecimals()
+```
+功能说明: 查询资产的精确度
+
+参数说明:
+
+返回值:精确度
+
+#### 9. 查询资产的总供应量
+```java
+long queryTotalSupply()
+```
+功能说明: 查询资产的总供应量
+
+参数说明:
+
+返回值:总供应量
+
+
+资产转移示例代码:
+
+```java
+//step1:获得dnaSdk实例
+DnaSdk sdk = DnaSdk.getInstance();
+sdk.setRpc(url);
+sdk.openWalletFile("OntAssetDemo.json");
+//step2:获得gas实例
+gas = sdk.nativevm().gas()
+//step3:调用转账方法
+com.github.DNAProject.account.Account account1 = new com.github.DNAProject.account.Account(privateKey,SignatureScheme.SHA256WITHECDSA);
+dnaSdk.nativevm().gas().sendTransfer(account1,"TA4pCAb4zUifHyxSx32dZRjTrnXtxEWKZr",10000,account1,dnaSdk.DEFAULT_GAS_LIMIT,0);
+```
+
+
+
+
+查看如何部署和调用智能合约,详见[smartcontract](smartcontract.md)。
diff --git a/docs/auth.md b/docs/auth.md
new file mode 100644
index 0000000..1918001
--- /dev/null
+++ b/docs/auth.md
@@ -0,0 +1,335 @@
+ 权限管理
+
+
+当前,智能合约的函数可以被任何人调用,这显然不符合现实要求。基于角色的权限管理的基本思想是,每个角色可以调用部分函数,每个实体可以被赋予多种角色(实体是由其DNA ID来标识)。
+
+如果智能合约需要增加权限管理功能,那就必须记录合约中分配的角色,以及角色可调用的函数,哪些实体具有该角色等等信息。这个工作比较繁琐,可交由一个系统合约来管理。
+
+具体请参考[权限合约](https://github.com/ontio/ontology-smartcontract/blob/master/smartcontract/native/auth/auth.md)
+
+
+* 权限合约管理
+
+* 用法示例
+
+* 接口列表
+
+
+### 权限合约管理
+
+Auth合约负责管理应用合约的函数调用权限,功能有合约管理员可以转让合约管理权限,合约管理员为角色分配函数,合约管理员绑定角色到实体身份,有合约函数调用权的实体将合约调用权代理给其他人,合约管理员收回合约调用权,实体验证合约调用token的有效性。
+
+Auth合约实现了一套基于角色的权限管理方案,每个角色对应一些可调用的函数,管理员通过将角色分配给DNA ID,使之可以调用该角色下的函数。与此同时,角色是可以传递的,即A可以将某个角色代理给B,并指定代理时间,这样的话B就可以一段时间内也可以调用对应的函数。
+
+### 用法示例
+
+DNA智能合约不支持在部署的时候执行初始化,所以合约管理员需要硬编码在合约代码中,即将合约管理员DNA ID在合约中定义成一个常量,具体请看下面的合约样例。DNA智能合约可以调用verifyToken函数进行权限验证,同时为了方便开发者验证某个DnaID是否有某个角色,Java-SDK也提供了verifyToken接口,可以实时查询角色的分配情况。
+
+使用流程:
+
+```
+1. 将智能合约部署到链上。
+2. 调用智能合约中的init方法,在合约代码中通过调用initContractAdmin方法,将合约中预先定义的管理员DNA ID,设置为该合约的管理员(注意:需先将管理员DNA ID注册到链上)。
+3. 合约管理员设计需要用到的角色,并将角色和智能合约中的函数进行绑定,该步骤可以调用Java-SDK中的assignFuncsToRole接口进行设置。
+4. 合约管理员将角色分配给DNA ID,拥有该角色的DNA ID将有权限调用该角色对应的函数,该步骤可以调用Java-SDK中的assignDnaIDsToRole接口进行设置。
+5. 拥有某个角色的DNA ID在调用该角色对应的函数之前,可以通过Java-SDK中的verifyToken接口验证该dnaid是否有调用相应函数的权利。
+```
+
+结合下面的示例讲解使用流程:
+
+A. 将智能合约部署到链上。
+B. 调用该合约中init方法。
+
+```java
+AbiInfo abiInfo = JSON.parseObject(abi,AbiInfo.class);
+String name = "init";
+AbiFunction function = abiInfo.getFunction(name);
+function.setParamsValue();
+String txhash = (String) sdk.neovm().sendTransaction(Helper.reverse(codeAddress),account,account,sdk.DEFAULT_GAS_LIMIT,0,function,false);
+```
+
+C. 合约管理员设计角色role1和role2,并将角色role1和函数foo1绑定,将角色role2和函数foo2、foo3绑定。
+
+```java
+String txhash = sdk.nativevm().auth().assignFuncsToRole(adminIdentity.dnaid, password, adminIdentity.controls.get(0).getSalt(),
+1, Helper.reverse(codeAddress), "role1", new String[]{"foo1"}, account, sdk.DEFAULT_GAS_LIMIT, 0);
+
+String txhash = sdk.nativevm().auth().assignFuncsToRole(adminIdentity.dnaid, password, adminIdentity.controls.get(0).getSalt(), 1,
+Helper.reverse(codeAddress), "role2", new String[]{"foo2","foo3"}, account, sdk.DEFAULT_GAS_LIMIT, 0);
+
+```
+
+D. 合约管理员将角色"role1"分配给dnaId1,将角色"role2"分配给dnaId2,则dnaId1拥有调用函数foo1的权限,dnaId2拥有调用函数foo2和函数foo3的权限。
+
+```java
+String txhash = sdk.nativevm().auth().assignDnaIdsToRole(adminIdentity.dnaid, password, adminIdentity.controls.get(0).getSalt(), 1,
+Helper.reverse(codeAddress), "role1", new String[]{identity1.dnaid}, account, sdk.DEFAULT_GAS_LIMIT, 0);
+
+String txhash = sdk.nativevm().auth().assignDnaIdsToRole(adminIdentity.dnaid, password, adminIdentity.controls.get(0).getSalt(), 1,
+Helper.reverse(codeAddress), "role2", new String[]{identity2.dnaid}, account, sdk.DEFAULT_GAS_LIMIT, 0);
+
+
+```
+
+E. 由于dnaId1的角色是合约管理员分配的,其权限level默认是2,即dnaId1可以将权限代理给其他dnaidX,代理的Java-SDK接口是delegate,具体接口信息请参考下面的接口信息。
+在代理权限的时候需要指定被代理人权限的级别以及代理时间,如果代理人的level是2,则被代理人的level只能是1。
+
+```java
+sdk.nativevm().auth().delegate(identity1.dnaid,password,identity1.controls.get(0).getSalt(),1,Helper.reverse(codeAddress),
+identityX.dnaid,"role1",60*5,1,account,sdk.DEFAULT_GAS_LIMIT,0);
+```
+
+F. 验证某个dnaId是否有调用某个函数的权限,可以通过verifyToken接口查询。
+
+```java
+String result = sdk.nativevm().auth().verifyToken(identityX.dnaid, password, identityX.controls.get(0).getSalt(), 1, Helper.reverse(codeAddress), "foo1");
+
+返回值: "01"表示有权限,"00"表示没有权限。
+```
+
+G. 如果被代理人的权限时间没有结束,代理人可以提前收回代理给别人的权限。
+
+```java
+sdk.nativevm().auth().withdraw(identity1.dnaid,password,identity1.controls.get(0).getSalt(),1,Helper.reverse(codeAddress),identityX.dnaid,"role1",account,sdk.DEFAULT_GAS_LIMIT,500);
+```
+
+H. 合约管理员可以将自己的管理权限转移给其他的dnaid
+
+```java
+String txhash = sdk.nativevm().auth().sendTransfer(adminIdentity.dnaid,password,adminIdentity.controls.get(0).getSalt(),1,Helper.reverse(codeAddress),adminIdentity.dnaid,
+account,sdk.DEFAULT_GAS_LIMIT,0);
+```
+
+
+
+DNA合约示例:
+```c#
+using Neo.SmartContract.Framework;
+using Neo.SmartContract.Framework.Services.Neo;
+using Neo.SmartContract.Framework.Services.System;
+using System;
+using System.ComponentModel;
+using System.Numerics;
+
+namespace Example
+{
+ public class AppContract : SmartContract
+ {
+ public struct initContractAdminParam
+ {
+ public byte[] adminDnaID;
+ }
+
+ public struct verifyTokenParam
+ {
+ public byte[] contractAddr; //合约地址
+ public byte[] calllerDnaID; //调用者dnaid
+ public string funcName; //调用的函数名
+ public int keyNo; //使用调用者dnaid的第几把公钥
+ }
+
+ //the admin DNA ID of this contract must be hardcoded.
+ public static readonly byte[] adminDnaID = "did:ont:AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve".AsByteArray();
+
+ public static Object Main(string operation,object[] args)
+ {
+ if (operation == "init") return init();
+
+ if (operation == "foo")
+ {
+ //we need to check if the caller is authorized to invoke foo
+ if (!verifyToken(operation, args)) return "no auth";
+
+ return foo();
+ }
+ if (operation == "foo2")
+ {
+ //we need to check if the caller is authorized to invoke foo
+ if (!verifyToken(operation, args)) return "no auth";
+
+ return foo2();
+ }
+ if (operation == "foo3")
+ {
+ //we need to check if the caller is authorized to invoke foo
+ if (!verifyToken(operation, args)) return "no auth";
+
+ return foo3();
+ }
+
+ return "over";
+ }
+
+ public static string foo()
+ {
+ return "A";
+ }
+ public static string foo2()
+ {
+ return "B";
+ }
+ public static string foo3()
+ {
+ return "C";
+ }
+
+ //this method is a must-defined method if you want to use native auth contract.
+ public static bool init()
+ {
+ byte[] authContractAddr = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06 };
+ byte[] ret = Native.Invoke(0, authContractAddr, "initContractAdmin", adminDnaID);
+ return ret[0] == 1;
+ }
+
+ internal static bool verifyToken(string operation, object[] args)
+ {
+ verifyTokenParam param = new verifyTokenParam{};
+ param.contractAddr = ExecutionEngine.ExecutingScriptHash;
+ param.funcName = operation;
+ param.calllerDnaID = (byte[])args[0];
+ param.keyNo = (int)args[1];
+
+ byte[] authContractAddr = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06 };
+ byte[] ret = Native.Invoke(0, authContractAddr, "verifyToken", param);
+ return ret[0] == 1;
+ }
+ }
+}
+```
+
+
+### 权限合约接口
+
+Java-SDK已经封装好权限合约的调用接口,可以通过Java-SDK进行权限管理。
+
+#### 1. 合约管理员转让合约管理权限
+
+```java
+String sendTransfer(String adminDnaId, String password, byte[] salt, String contractAddr, String newAdminDnaID, long keyNo, Account payerAcct, long gaslimit, long gasprice)
+```
+|说明||描述|
+|:--|:--|:--|
+|功能说明|合约管理员转让合约管理权限|此函数必须由合约管理员调用,即将会以adminDnaID名下编号为keyNo的公钥来验证交易签名是否合法。|
+|参数说明|字段|描述|
+||adminDnaId|合约管理员dnaid|
+||password|合约管理员密码|
+||salt |私钥解密参数|
+||contractAddr|合约地址|
+||newAdminDnaID|新的管理员|
+||keyNo|合约管理员的公钥编号|
+||payerAcct|付费账户|
+||gaslimit|gas价格|
+||gasprice|gas价格|
+|返回值说明|交易hash||
+
+#### 2. 为角色分配函数
+```java
+String assignFuncsToRole(String adminDnaID,String password,byte[] salt,String contractAddr,String role,String[] funcName,long keyNo,Account payerAcct,long gaslimit,long gasprice)
+```
+|说明||描述|
+|:--|:--|:--|
+|功能说明|为角色分配函数|必须由合约管理者调用,将所有函数自动绑定到role,若已经绑定,自动跳过,最后返回true。|
+|参数说明|字段|描述|
+||adminDnaId|合约管理员dnaid|
+||password|合约管理员密码|
+||salt|私钥解密参数|
+||contractAddr|合约地址|
+||role|角色|
+||funcName|函数名数组|
+||keyNo|合约管理员的公钥编号|
+||payerAcct|付费账户|
+||gaslimit|gas价格|
+||gasprice|gas价格|
+|返回值说明|交易hash||
+
+#### 3. 绑定角色到实体身份
+```java
+String assignDnaIDsToRole(String adminDnaId,String password,byte[] salt, String contractAddr,String role,String[] dnaIDs,long keyNo,Account payerAcct,long gaslimit,long gasprice)
+```
+ |说明||描述|
+ |:--|:--|:--|
+ |功能说明|绑定角色到实体身份|必须由合约管理者调用,dnaIDs数组中的DNA ID被分配role角色,最后返回true。 在当前实现中,权限token的级别level默认等于2。|
+ |参数说明|字段|描述|
+ ||adminDnaId|合约管理员dnaid|
+ ||password|合约管理员密码|
+ ||salt|私钥解密参数|
+ ||contractAddr|合约地址|
+ ||role|角色|
+ ||dnaIDs|dnaid数组|
+ ||keyNo|合约管理员的公钥编号|
+ ||payerAcct|付费账户|
+ ||gaslimit|gas价格|
+ ||gasprice|gas价格|
+ |返回值说明|交易hash||
+
+#### 4. 将合约调用权代理给其他人
+```java
+String delegate(String dnaid,String password,byte[] salt,String contractAddr,String toDnaId,String role,long period,long level,long keyNo,Account payerAcct,long gaslimit,long gasprice)
+```
+ 角色拥有者可以将角色代理给其他人,from是转让者的DNA ID,to是代理人的DNA ID,role表示要代理的角色,period参数指定委托任期时间(以second为单位)。
+
+ 代理人可以再次将其角色代理给更多的人,level参数指定委托层次深度。例如,
+
+ level = 1: 此时代理人就无法将其角色再次代理出去;当前实现只支持此情况。
+
+ |说明||描述|
+ |:--|:--|:--|
+ |功能说明|将合约调用权代理给其他人||
+ |参数说明|字段|描述|
+ ||dnaid|拥有合约中某个函数调用权的dnaid|
+ ||password|dnaid密码|
+ ||salt|私钥解密参数|
+ ||contractAddr|合约地址|
+ ||toDnaId|接收合约调用权的dnaid|
+ ||role|角色|
+ ||period|以秒为单位的时间|
+ ||keyNo|dnaid的公钥编号|
+ ||payerAcct|付费账户|
+ ||gaslimit|gas价格|
+ ||gasprice|gas价格|
+ |返回值说明|交易hash||
+
+#### 5. 收回合约调用权
+```java
+String withdraw(String initiatorDnaid,String password,byte[] salt,String contractAddr,String delegate, String role,long keyNo,Account payerAcct,long gaslimit,long gasprice)
+```
+ 角色拥有者可以提前将角色代理提前撤回,initiatorDnaid是发起者,delegate是角色代理人,initiator将代理给delegate的角色提前撤回。
+
+ |说明||描述|
+ |:--|:--|:--|
+ |功能说明|收回合约调用权(配合delegate使用)||
+ |参数说明|字段|描述|
+ ||initiatorDnaid|将合约调用权转让给其他人的dnaid|
+ ||password|dnaid密码|
+ ||salt|私钥解密参数|
+ ||contractAddr|合约地址|
+ ||delegate|代理人dnaid|
+ ||role|角色|
+ ||keyNo|dnaid的公钥编号|
+ ||payerAcct|付费账户|
+ ||gaslimit|gas价格|
+ ||gasprice|gas价格|
+ |返回值说明|交易hash||
+
+#### 6. 验证合约调用token的有效性
+```java
+String verifyToken(String dnaid,String password,byte[] salt,String contractAddr,String funcName,long keyNo)
+```
+|说明||描述|
+|:--|:--|:--|
+|功能说明|验证合约调用token的有效性||
+|参数说明|字段|描述|
+||dnaid|验证的dnaid|
+||password|dnaid密码|
+||salt|私钥解密参数|
+||contractAddr|合约地址|
+||funcName|函数名|
+||keyNo|dnaid的公钥编号|
+|返回值说明|交易hash||
+
diff --git a/docs/basic.md b/docs/basic.md
new file mode 100644
index 0000000..b93fa2b
--- /dev/null
+++ b/docs/basic.md
@@ -0,0 +1,210 @@
+ 区块链节点接口
+
+
+
+以下针对使用SDK和区块交互的基本操作,以及相关数据结构定义。
+
+用Java SDK之前,请使用以下方式初始化DnaSDK实例。
+
+```java
+DnaSdk dnaSdk = DnaSdk.getInstance();
+dnaSdk.setRpc(rpcUrl);
+dnaSdk.setRestful(restUrl);
+dnaSdk.setDefaultConnect(wm.getRestful());
+dnaSdk.openWalletFile("assetDemo.json");
+```
+> Note: setRestful表示采用restful接口建立连接,setRpc表示采用rpc接口建立连接,setDefaultConnect表示设置默认的链接方式。
+
+
+## 与链交互接口
+
+
+* 获取当前区块高度
+```java
+int height = dnaSdk.getConnect().getBlockHeight();
+```
+
+* 获取区块
+
+根据高度获取区块
+```java
+Block block = dnaSdk.getConnect().getBlock(9757);
+```
+
+根据区块hash获得区块
+
+```java
+Block block = dnaSdk.getConnect().getBlock(blockhash);
+```
+
+* 获得block json数据
+
+根据高度获取区块json
+```java
+Object block = dnaSdk.getConnect().getBlockJson(9757);
+```
+
+根据区块hash获得区块json
+
+```java
+Object block = dnaSdk.getConnect().getBlockJson(blockhash);
+```
+* 获得合约代码
+
+根据合约hash获得合约代码
+
+```java
+Object contract = dnaSdk.getConnect().getContract(contractHash)
+```
+
+根据合约hash获得合约代码json数据
+
+```java
+Object contractJson = dnaSdk.getConnect().getContractJson(hash)
+```
+
+* 查询余额
+
+根据账户地址查询余额
+
+```java
+Object balance = dnaSdk.getConnect().getBalance(address)
+```
+
+* 获取区块链节点数
+
+```java
+int count = dnaSdk.getConnect().getNodeCount();
+```
+
+* 获得区块高度
+
+```java
+int blockheight = dnaSdk.getConnect().getBlockHeight()
+```
+
+* 获得智能合约事件
+
+根据高度获得智能合约事件
+
+```java
+Object event = dnaSdk.getConnect().getSmartCodeEvent(height)
+```
+
+根据交易hash获得智能合约事件
+
+```java
+Object event = dnaSdk.getConnect().getSmartCodeEvent(hash)
+```
+
+* 根据交易hash获得区块高度
+
+```java
+int blockheight = dnaSdk.getConnect().getBlockHeightByTxHash(txhash)
+```
+
+* 获得智能合约存储的数据
+
+```java
+String value = dnaSdk.getConnect().getStorage(codehash,key)
+```
+
+* 获得merkle证明
+
+根据交易hash获得merkle证明
+
+```java
+Object proof = dnaSdk.getConnect().getMerkleProof(String hash)
+```
+
+* 从区块链中获取交易
+
+根据交易hash获得交易对象
+```java
+Transaction info = dnaSdk.getConnect().getTransaction(txhash);
+```
+
+根据交易hash获得交易json数据
+
+```java
+Object info = dnaSdk.getConnect().getTransactionJson(txhash);
+```
+
+* 从区块链中获取InvokeCodeTransaction
+
+```java
+InvokeCodeTransaction t = (InvokeCodeTransaction) dnaSdk.getConnect().getTransaction(txhash);
+```
+## 数据结构说明
+
+* Block区块
+
+| Field | Type | Description |
+| :--------------: | :--------:| :------: |
+| version| int| 版本号 |
+| prevBlockHash| UInt256| 前一个区块的散列值|
+| transactionsRoot| UInt256| 该区块中所有交易的Merkle树的根|
+| blockRoot| UInt256| 区块根|
+| timestamp| int| 区块时间戳,unix时间戳 |
+| height| int| 区块高度 |
+| consensusData| long | 共识数据 |
+| consensusPayload| byte[] | 共识payload |
+| nextBookKeeper| UInt160 | 下一个区块的记账合约的散列值 |
+| sigData| array| 签名 |
+| bookKeepers| array| 验签者 |
+| hash| UInt256 | 该区块的hash值 |
+| transactions| Transaction[] | 该区块的交易列表 |
+
+
+* Transaction交易
+
+| Field | Type | Description |
+| :--------------: | :--------:| :------: |
+| version| int| 版本号 |
+| txType| TransactionType| 交易类型|
+| nonce| int | 随机数|
+| gasPrice| long | gas价格|
+| gasLimit| long | gas上限|
+| payer| Address | 支付交易费用账户|
+| attributes| Attribute[]| 交易属性列表 |
+| sigs| Sign[]| 签名数组 |
+| payload| Payload | payload |
+
+
+* TransactionType交易类型
+
+| Value | Type | Description |
+| :--------------: | :--------:| :------: |
+| 208| int | 部署智能合约交易|
+| 209| int | 调用智能合约交易 |
+| 0| int | Bookkeeping |
+| 4| int | 注册 |
+| 5| int | 投票 |
+
+
+* 签名字段
+
+| Field | Type | Description |
+| :--------------: | :--------:| :------: |
+| pubKeys| array | 公钥数组|
+| M| int | M |
+| sigData| array | 签名值数组 |
+
+
+
+* Attribute交易属性
+
+| Field | Type | Description |
+| :--------------: | :--------:| :------: |
+| usage | AttributeUsage | 用途|
+| data| byte[] | 属性值 |
+
+
+* TransactionAttributeUsage属性用途
+
+| Value | Type | Description |
+| :--------------: | :--------:| :------: |
+| 0| int| Nonce|
+| 32| int | Script |
+| 129| int | DescriptionUrl |
+| 144| int | Description |
diff --git a/docs/dnaid.md b/docs/dnaid.md
new file mode 100644
index 0000000..041ad00
--- /dev/null
+++ b/docs/dnaid.md
@@ -0,0 +1,463 @@
+ 数字身份
+
+
+
+## 介绍
+
+数字身份相关介绍可参考[DNA ID 身份标识协议及信任框架](https://github.com/ontio/ontology-DID)。
+
+## 钱包文件及规范
+
+钱包文件是一个Json格式的数据存储文件,可同时存储多个数字身份和多个数字资产账户。具体参考[钱包文件规范](../en/Wallet_File_Specification.md)。
+
+为了创建数字身份,您首先需要创建/打开一个钱包文件。
+
+
+```java
+//如果不存在钱包文件,会自动创建钱包文件。
+DnaSdk dnaSdk = DnaSdk.getInstance();
+dnaSdk.openWalletFile("Demo3.json");
+```
+> 注:目前仅支持文件形式钱包文件,也可以扩展支持数据库或其他存储方式。
+
+
+
+## 数字身份数据结构
+
+**Identity数据结构说明**
+
+`dnaid` 是代表身份的唯一的id
+`label` 是用户给身份所取的名称。
+`lock` 表明身份是否被用户锁定了。客户端不能更新被锁定的身份信息。默认值为false。
+`controls` 是身份的所有控制对象ControlData的数组。
+`extra` 是客户端开发者存储额外信息的字段。可以为null。
+
+```
+//Identity数据结构
+public class Identity {
+ public String label = "";
+ public String dnaid = "";
+ public boolean isDefault = false;
+ public boolean lock = false;
+ public List controls = new ArrayList();
+ public Object extra = null;
+}
+```
+
+`algorithm`是用来加密的算法名称。
+`parameters` 是加密算法所需参数。
+`curve` 是椭圆曲线的名称。
+`id` 是control的唯一标识。
+`key` 是NEP-2格式的私钥。
+
+```
+public class Control {
+ public String algorithm = "ECDSA";
+ public Map parameters = new HashMap() ;
+ public String id = "";
+ public String key = "";
+ public String salt = "";
+ public String hash = "sha256";
+ @JSONField(name = "enc-alg")
+ public String encAlg = "aes-256-gcm";
+ public String address = "";
+}
+```
+
+## 数字身份接口
+
+
+### 1. 注册身份
+
+创建数字身份指的是产生一个Identity数据结构的身份信息,并写入到到钱包文件中。
+
+```
+Identity identity = dnaSdk.getConnect().createIdentity("passwordtest");
+//创建的账号或身份只在内存中,如果要写入钱包文件,需调用写入接口
+dnaSdk.getWalletMgr().writeWallet();
+```
+
+**向链上注册身份**
+
+只有向区块链链成功注册身份之后,该身份才可以真正使用。
+
+有两种方法实现向链上注册身份
+
+方法一,注册者指定支付交易费用的账户地址
+
+```
+Identity identity = dnaSdk.getWalletMgr().createIdentity(password);
+dnaSdk.nativevm().dnaId().sendRegister(identity2,password,payerAcct,gaslimit,gasprice);
+```
+
+
+方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。
+
+
+```
+Identity identity = dnaSdk.getWalletMgr().createIdentity(password);
+Transaction tx = dnaSdk.nativevm().dnaId().makeRegister(identity.dnaid,password,payerAcc.address,dnaSdk.DEFAULT_GAS_LIMIT,0);
+dnaSdk.signTx(tx,identity.dnaid,password);
+dnaSdk.getConnect().sendRawTransaction(tx);
+```
+
+链上注册成功后,对应此DNA ID的身份描述对象DDO将被存储在区块链上。
+
+关于DDO的信息可以从[DNA ID 身份标识协议](https://github.com/ontio/ontology-DID/blob/master/README_cn.md)
+
+DDO 的数据格式。
+```
+{
+ "DnaId": "did:dna:AQmUnTXbAjvMKfcRJappBp1mhFn2oRV2Rd",
+ "Attributes": [{
+ "Type": "String",
+ "Value": "value1",
+ "Key": "key1"
+ }],
+ "Recovery": "AQmTJnojgMJXTWDE8rL5R5SRKLHr9TZmPR",
+ "Owners": [{
+ "Type": "ECDSA",
+ "Curve": "P256",
+ "Value": "022af1c75dc0719e13f59cefcdebcb01c46e33c59ebfe3f63c81938df85f067903",
+ "PubKeyId": "did:dna:AQmUnTXbAjvMKfcRJappBp1mhFn2oRV2Rd#keys-1"
+ }, {
+ "Type": "ECDSA",
+ "Curve": "P256",
+ "Value": "03a47fff0443645d41140976cd4ce060a29ea084332174b2b2572a1589709e52f2",
+ "PubKeyId": "did:dna:AQmUnTXbAjvMKfcRJappBp1mhFn2oRV2Rd#keys-2"
+ }]
+}
+```
+
+### 2. 身份管理
+
+**导入身份**
+
+当用户已经拥有了一个数字身份或者数字账户,SDK支持将其导入到钱包文件中。
+
+> Note: 建议导入一个数字身份之前,建议查询链上身份,如果链上身份DDO不存在,表示此数字身份未在链上注册,请使用上面注册数字身份的方法把身份注册到链上。
+
+
+```java
+Identity identity = dnaSdk.getWalletMgr().importIdentity(encriptPrivateKey,password,salt,address);
+//写入钱包
+dnaSdk.getWalletMgr().writeWallet();
+```
+
+
+参数说明:
+encriptPrivateKey: 加密后的私钥
+password: 加密私钥使用的密码
+salt: 解密私钥用的参数
+address: 账户地址base58编码
+
+**移除身份**
+
+```java
+dnaSdk.getWalletMgr().getWallet().removeIdentity(dnaid);
+//写入钱包
+dnaSdk.getWalletMgr().writeWallet();
+```
+
+**设置默认账号或身份**
+
+```java
+//根据账户地址设置默认账户
+dnaSdk.getWalletMgr().getWallet().setDefaultAccount(address);
+//根据identity索引设置默认identity
+dnaSdk.getWalletMgr().getWallet().setDefaultIdentity(index);
+dnaSdk.getWalletMgr().getWallet().setDefaultIdentity(dnaid);
+```
+
+### 3. 查询链上身份信息
+
+链上身份DDO信息,可以通过DNA ID进行查询。
+
+```json
+//通过DNA ID获取DDO
+String ddo = dnaSdk.nativevm().dnaId().sendGetDDO(dnaid);
+
+//返回DDO格式
+{
+ "Attributes": [{
+ "Type": "String",
+ "Value": "value1",
+ "Key": "key1"
+ }],
+ "DnaId": "did:ont:TA5UqF8iPqecMdBzTdzzANVeY8HW1krrgy",
+ "Recovery": "TA6AhqudP1dcLknEXmFinHPugDdudDnMJZ",
+ "Owners": [{
+ "Type": "ECDSA",
+ "Curve": "P256",
+ "Value": "12020346f8c238c9e4deaf6110e8f5967cf973f53b778ed183f4a6e7571acd51ddf80e",
+ "PubKeyId": "did:ont:TA5UqF8iPqecMdBzTdzzANVeY8HW1krrgy#keys-1"
+ }, {
+ "Type": "ECDSA",
+ "Curve": "P256",
+ "Value": "1202022fabd733d7d7d7009125bfde3cb0afe274769c78fd653079ecd5954ae9f52644",
+ "PubKeyId": "did:ont:TA5UqF8iPqecMdBzTdzzANVeY8HW1krrgy#keys-2"
+ }]
+}
+
+```
+
+
+
+### 4. 身份属性
+
+#### 4.1 更新链上DDO属性
+方法一,指定支付交易费用的账户
+
+```java
+//添加或者更新属性
+String sendAddAttributes(String dnaid, String password,byte[] salt, Attribute[] attributes,Account payerAcct,long gaslimit,long gasprice)
+```
+
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | password| String | 数字身份密码 | 必选,私钥解密的密码 |
+| |salt | byte[] | | 必选 |
+| | dnaid | String | 数字身份id | 必选,身份Id |
+| | attributes | Attribute[]| 属性数组 | 必选 |
+| | payerAcct | Account | 交易费用支付者账户 | 必选, |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+
+方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。
+```java
+Transaction makeAddAttributes(String dnaid, String password, byte[] salt,Attribute[] attributes,String payer,
+ long gaslimit,long gasprice)
+```
+
+示例代码
+```java
+Transaction tx = dnaSdk.nativevm().dnaId().makeAddAttributes(dnaid,password,salt,attributes,payer,gaslimit,0);
+dnaSdk.signTx(tx,identity.dnaid,password);
+dnaSdk.getConnect().sendRawTransaction(tx);
+```
+
+#### 4.2 移除链上DDO属性
+
+方法一
+
+```
+String sendRemoveAttribute(String dnaid,String password,byte[] salt,String path,Account payerAcct,long gaslimit,long gasprice)
+```
+
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | password| String | 数字身份密码 | 必选 |
+| | salt| byte[] | | required |
+| | dnaid | String | 数字身份ID | 必选,身份Id |
+| | path | byte[] | path | 必选,path |
+| | payer | String | payer | 必选,payer |
+| | payerpassword | String | 支付交易费用的账户地址 | 必选 |
+| | gas | long | 支付的交易费用 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。
+```
+Transaction makeRemoveAttribute(String dnaid,String password,salt,String path,String payer,long gaslimit,long gasprice)
+```
+
+示例代码:
+```
+Transaction tx = dnaSdk.nativevm().dnaId().makeRemoveAttribute(dnaid,password,salt,path,payer,gaslimit,0);
+dnaSdk.signTx(tx,identity.dnaid,password);
+dnaSdk.getConnect().sendRawTransaction(tx);
+```
+
+### 5. 身份公钥
+
+一个身份可以有多个控制人,身份中的公钥是控制人的公钥列表。
+#### 5.1 添加公钥
+
+方法一
+
+```java
+String sendAddPubKey(String dnaid, String password,byte[] salt, String newpubkey,Account payerAcct,long gaslimit,long gasprice)
+```
+
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | password| String | 数字身份密码 | 必选 |
+| | salt| byte[] | | required |
+| | dnaid | String | 数字身份ID | 必选,身份Id |
+| | newpubkey| String |公钥 | 必选, newpubkey|
+| | payerAcct | Account | Payment transaction account | 必选,payer |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。
+
+```java
+Transaction makeAddPubKey(String dnaid,String password,byte[] salt,String newpubkey,String payer,long gaslimit,long gasprice)
+```
+参数说明请参考方法一sendAddPubKey
+
+示例代码
+```java
+Transaction tx = dnaSdk.nativevm().dnaId().makeAddPubKey(dnaid,password,byte[] salt,newpubkey,payer,gaslimit,gasprice);
+dnaSdk.signTx(tx,identity.dnaid,password);
+dnaSdk.getConnect().sendRawTransaction(tx);
+```
+
+方法三,recovery机制
+recovery可以为dnaid添加公钥
+```java
+String sendAddPubKey(String dnaid,String recoveryAddr, String password, byte[] salt,String newpubkey,Account payerAcct,long gaslimit,long gasprice)
+```
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | dnaid | String | 数字身份ID | 必选,身份Id |
+| | recoveryAddr| String | recovery地址 | 必选 |
+| | password| String | recovery密码 | 必选 |
+| | salt| byte[] | | required |
+| | newpubkey| String |公钥 | 必选, newpubkey|
+| | payer | String | payer | 必选,payer |
+| | payerpwd | String | 支付交易费用的账户地址 | 必选 |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法四(recovery机制)
+
+```java
+Transaction makeAddPubKey(String dnaid,String recoveryAddr,String password,byte[] salt,String newpubkey,
+ String payer,long gaslimit,long gasprice)
+```
+
+参数说明请参考方法三
+
+
+#### 5.2 删除公钥
+
+方法一,删除公钥
+
+```java
+String sendRemovePubKey(String dnaid, String password,byte[] salt, String removePubkey,Account payerAcct,long gaslimit,long gasprice)
+```
+
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | password| String | 数字身份密码 | 必选 |
+| | salt| byte[] | | required |
+| | dnaid | String | 数字身份ID | 必选,身份Id |
+| | removePubkey| String |公钥 | 必选, removePubkey|
+| | payer | String | payer | 必选,payer |
+| | payerpassword | String | 支付交易费用的账户地址 | 必选 |
+| | gas | long | 支付的交易费用 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。
+
+```java
+Transaction tx = dnaSdk.nativevm().dnaId().makeRemovePubKey(dnaid,password,salt,removePubkey,payer,gas);
+dnaSdk.signTx(tx,identity.dnaid.replace(Common.diddna,""),password,salt);
+dnaSdk.getConnect().sendRawTransaction(tx);
+```
+
+方法三,恢复人机制
+```java
+String sendRemovePubKey(String dnaid, String recoveryAddr,String password, byte[] salt,String removePubkey,Account payerAcct,long gaslimit,long gasprice)
+```
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | dnaid | String | 数字身份ID | 必选,身份Id |
+| | recoveryAddr| String | recovery地址 | 必选 |
+| | password| String | recovery密码 | 必选 |
+| | salt| byte[] | | required |
+| | newpubkey| String |公钥 | 必选, newpubkey|
+| | payerAcct | Account | Payment transaction account | 必选,payer |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法四(recovery机制)
+```java
+Transaction makeRemovePubKey(String dnaid,String recoveryAddr, String password,byte[] salt, String removePubkey,String payer,
+ long gaslimit,long gasprice)
+```
+
+参数说明请参考方法三
+
+### 6. 身份恢复人
+
+当dnaid中控制人私钥丢失时,身份恢复人可以设置新的控制人。
+#### 6.1 添加恢复人
+
+方法一
+
+```java
+String sendAddRecovery(String dnaid, String password,byte[] salt, String recoveryAddr,Account payerAcct,long gaslimit,long gasprice)
+```
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | password| String | 数字身份密码 | 必选 |
+| | salt| byte[] | | required |
+| | dnaid | String | 数字身份ID | 必选,身份Id |
+| | recoveryAddr| String |recovery账户地址 | 必选,recovery|
+| | payerAcct | Account | payerAcct | 必选,payer |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。
+```
+Transaction makeAddRecovery(String dnaid, String password,byte[] salt, String recoveryAddr,String payer,long gaslimit,long gasprice)
+```
+
+示例
+```
+Transaction tx = dnaSdk.nativevm().dnaId().makeAddRecovery(dnaid,password,salt,recovery,payer,gas);
+dnaSdk.signTx(tx,identity.dnaid.replace(Common.diddna,""),password,salt);
+dnaSdk.getConnect().sendRawTransaction(tx);
+```
+
+#### 6.2 修改recovery
+
+方法一
+```
+String sendChangeRecovery(String dnaid, String newRecovery, String oldRecovery, String password,,byte[] salt,long gaslimit,long gasprice)
+```
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 |dnaid | String | 数字身份ID | 必选,身份Id |
+| | newRecovery| String |newRecovery账户地址 | 必选,newRecovery|
+| | oldRecovery| String |oldRecovery账户地址 | 必选,oldRecovery|
+| | oldRecovery password | String | oldRecovery password | 必选 |
+| | password| String | 数字身份密码 | 必选 |
+| | salt| byte[] | | required |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gasprice | 必选 |
+| 输出参数 | txhash | String | 交易hash | 交易hash是64位字符串 |
+
+
+方法二
+```
+Transaction makeChangeRecovery(String dnaid, String newRecovery, String oldRecovery, String password,byte[] salt,long gaslimit,long gasprice)
+```
+
+参数说明请参考上面的方法一
+
+
+
+
diff --git a/docs/dnaid_claim.md b/docs/dnaid_claim.md
new file mode 100644
index 0000000..0c738c0
--- /dev/null
+++ b/docs/dnaid_claim.md
@@ -0,0 +1,374 @@
+ 可信声明及存证
+
+
+
+## 1. 可信声明
+
+可验证声明用来证明实体的某些属性。
+
+可信声明存证合约提供了可信声明的存证服务。即存证可信声明Id,签发者ONT身份,属主ONT身份等信息,以及记录可用性信息即是否被吊销等信息。
+
+可信声明规范说明文档请参考:[可信声明规范](https://github.com/ontio/ontology-DID/blob/master/docs/cn/claim_spec_cn.md)
+
+
+### 1.1 数据结构和规范
+
+
+
+java-sdk采用JSON Web Token的格式表示claim以便于在声明发行者和申请者之间进行传递,jwt格式包含三部分header,payload,signature.
+
+
+### 1.2 可信声明格式
+
+我们使用JSON Web Token的扩展格式来表示一个可信声明,它可以在发行者和接收者之间传输。
+
+可信声明基本结构由三部分组成:Header,Payload,Signature。我们应该尽可能的多重用JWT标准属性,在某些特殊情况下可以使用定制属性。
+
+我们通过在最后附加区块链证明来扩展JWT格式,一个典型的可信声明被组织为**header.payload.signature.blockchain_proof**
+
+ 注意:blockchain_proof是可选的。某些情况下,可信声明可以不包含blockchain_proof
+
+#### Header
+Header部分定义了该可信声明的格式类型,使用的签名方案以及用于验证签名的公钥id
+```
+{
+ "alg": "ES256",
+ "typ": "JWT-X",
+ "kid": "did:ont:TRAtosUZHNSiLhzBdHacyxMX4Bg3cjWy3r#keys-1"
+}
+```
+
+- **alg** 指明使用的签名方案。
+
+- **typ** 格式类型,可以是以下两种值
+ - JWT:不包含区块链证明的可信声明
+ - JWT-X:包含区块链证明的可信声明
+
+
+- **kid** 指明用于签名验证的公钥。格式和DNA-ID 规范定义的一样:```#keys-```
+
+#### Payload
+在Payload部分,可信声明id,content,metadata被编码为JSON对象。使用JWT规范中指定的一些名称,即 `jti`,`iss`,`sub`,`iat`,`exp`
+```
+{
+ "ver": "0.7.0",
+ "iss": "did:ont:TRAtosUZHNSiLhzBdHacyxMX4Bg3cjWy3r",
+ "sub": "did:ont:SI59Js0zpNSiPOzBdB5cyxu80BO3cjGT70",
+ "iat": 1525465044,
+ "exp": 1530735444,
+ "jti":"4d9546fdf2eb94a364208fa65a9996b03ba0ca4ab2f56d106dac92e891b6f7fc",
+ "@context":"https://example.com/template/v1",
+ "clm":{
+ "Name": "Bob Dylan",
+ "Age": "22"
+ },
+ "clm-rev":{
+ "typ": "AttestContract",
+ "addr": "8055b362904715fd84536e754868f4c8d27ca3f6"
+ }
+}
+```
+
+- **ver** 指明可信声明版本
+- **iss** 可信声明签发者的ONT ID
+- **sub** 可信声明接收者的ONT ID
+- **iat** unix时间戳格式的创建时间
+- **exp** unix时间戳格式的过期时间
+- **jti** 可信声明的唯一标识符
+- **@context** 可信声明内容定义文档的uri,包含每个字段的含义和值的类型的定义
+- **clm** 指明了可信声明内容
+- **clm-rev** 指明了可信声明吊销方式。支持的方式在[附录C](claim_spec.md#C-Revocation).
+
+
+要签发一个可信声明,首先需要构造可信声明id、content和metadata的JSON对象,然后使用标准的JSON序列化方法对其进行序列化。最后,使用签发者的某个私钥对header和payload的二进制数据进行签名。例如上面的payload在序列化后看起来像这样:
+```
+ {"ver":"0.7.0","iss":"did:ont:TRAtosUZHNSiLhzBdHacyxMX4Bg3cjWy3r","sub":"did:ont:SI59Js0zpNSiPOzBdB5cyxu80BO3cjGT70","iat":1525465044,"exp":1530735444,"jti":"4d9546fdf2eb94a364208fa65a9996b03ba0ca4ab2f56d106dac92e891b6f7fc","@context":"https://example.com/template/v1","clm":{"Name":"Bob Dylan","Age":"22"},"clm-rev":{"Type":"Contract","Addr":"8055b362904715fd84536e754868f4c8d27ca3f6"}}
+
+```
+
+
+#### Signature
+
+在构造完Header和Payload部分后,根据JWS标准计算签名。详细的描述在 [RFC 7515 Section 5.1](https://tools.ietf.org/html/rfc7515#section-5.1)。简化的版本如下:
+
+- 根据JWS规范对Header和Payload部分进行序列化,作为签名的输入
+
+ sig := sign(Base64URL(header) || . || Base64URL(payload))
+
+
+- 根据Header部分指定的特定签名方案来计算签名。
+
+- 对签名进行编码
+
+ signature := Base64URL(sig).
+
+
+#### Blockchain proof
+```
+{
+ "Type":"MerkleProof",
+ "TxnHash":"c89e76ee58ae6ad99cfab829d3bf5bd7e5b9af3e5b38713c9d76ef2dcba2c8e0",
+ "ContractAddr": "8055b362904715fd84536e754868f4c8d27ca3f6",
+ "BlockHeight":10,
+ "MerkleRoot":"bfc2ac895685fbb01e22c61462f15f2a6e3544835731a43ae0cba82255a9f904",
+ "Nodes":[{
+ "Direction":"Right",
+ "TargetHash":"2fa49b6440104c2de900699d31506845d244cc0c8c36a2fffb019ee7c0c6e2f6"
+ }, {
+ "Direction":"Left",
+ "TargetHash":"fc4990f9758a310e054d166da842dab1ecd15ad9f8f0122ec71946f20ae964a4"
+ }]
+}
+```
+
+- **Type** 固定值"MerkleProof"
+- **TxnHash** 将可信声明id存证在合约里的交易hash值
+- **ContractAddr** 存证合约的地址
+- **BlockHeight** 存证交易对应的区块高度
+- **MerkleRoot** 该区块高度的区块对应的Merkle树根
+- **Nodes** Merkle树证明的证明路径
+
+MerkleProof按照以下格式编码
+
+ BASE64URL(MerkleProof)
+
+现在一个完整的可信声明就被创建好了
+
+ BASE64URL(Header) || '.' || BASE64URL(Payload) || '.' || BASE64URL(Signature) '.' || BASE64URL(MerkleProof)
+
+
+#### 数据结构
+
+* Claim 具有以下数据结构
+
+```java
+class Claim{
+ header : Header
+ payload : Payload
+ signature : byte[]
+}
+```
+
+
+```java
+class Header {
+ public String Alg = "DNA-ES256";
+ public String Typ = "JWT-X";
+ public String Kid;
+ }
+```
+
+字段说明
+`alg` 使用的签名框架
+`typ` 可以是下面两个值中的一个
+ JWT: 表示区块链证明不包含在claim中
+ JWT-X: 表示区块链证明是claim中的一部分
+`kid` 用于签名的公钥
+
+```java
+class Payload {
+ public String Ver;
+ public String Iss;
+ public String Sub;
+ public long Iat;
+ public long Exp;
+ public String Jti;
+ @JSONField(name = "@context")
+ public String Context;
+ public Map ClmMap = new HashMap();
+ public Map ClmRevMap = new HashMap();
+ }
+```
+
+`ver` Claim版本号
+`iss` 发行方的dnaid
+`sub` 申请方的dnaid
+`iat` 创建时间
+`exp` 超期时间
+`jti` claim的唯一标志
+`@context` 指定声明内容定义文档URI,其定义了每个字段的含义和值得类型
+`clm` 包含claim内容的对象
+`clm-rev` 定义个claim 的撤销机制,
+
+### 1.3 创建可信声明
+
+根据用户输入内容构造声明对象,该声明对象里包含了签名后的数据。
+创建claim:
+* 1.查询链上是否存在Issuer的DDO
+* 2.签名者的公钥必须在DDO的Owners中存在
+* 3.claimId 是对claim中删除Signature、Id、Proof的数据转byte数组,做一次sha256,再转hexstring
+* 4.对要签名的json数据转成Map对key做排序。
+* 5.Signature中Value值:claim 删除Signature、Proof后转byte数组, 做两次sha256得到的byte数组。
+
+```java
+Map map = new HashMap();
+map.put("Issuer", dids.get(0).dnaid);
+map.put("Subject", dids.get(1).dnaid);
+Map clmRevMap = new HashMap();
+clmRevMap.put("typ","AttestContract");
+clmRevMap.put("addr",dids.get(1).dnaid.replace(Common.diddna,""));
+String claim = dnaSdk.nativevm().dnaId().createDnaIdClaim(dids.get(0).dnaid,password,salt, "claim:context", map, map,clmRevMap,System.currentTimeMillis()/1000 +100000);
+```
+
+**createDnaIdClaim**
+
+```java
+String createDnaIdClaim(String signerDnaid, String password,byte[] salt, String context, Map claimMap, Map metaData,Map clmRevMap,long expire)
+```
+
+
+ 功能说明: 创建可信声明
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | signerDnaid| String | 签名者dnaid | 必选 |
+| | password | String | 签名者密码 | 必选 |
+| | salt | byte[] | 解密需要的参数|必选|
+| | context| String |指定声明内容定义文档URI,其定义了每个字段的含义和值得类型 | 必选|
+| | claimMap| Map |声明的内容 | 必选|
+| | metaData | Map | 声明发行者和申请者dnaid | 必选 |
+| | clmRevMap | Map | claim的撤回机制 | 必选 |
+| | expire | long | 声明过期时间 | 必选 |
+| 输出参数 | claim | String | 可信声明 | |
+
+
+
+### 1.4 验证可信声明
+
+验证claim步骤:
+* 1.查询链上是否存在Metadata中Issuer的DDO
+* 2.Owner是否存在Sgnature中的PublicKeyId
+* 3.对要验签的json数据转成Map对key做排序。
+* 4.删除Signature做验签(根据PublicKeyId的id值查找到公钥,签名是Signature中Value做base64解码)
+```java
+boolean b = dnaSdk.nativevm().dnaId().verifyDnaIdClaim(claim);
+```
+
+**verifyDnaIdClaim**
+
+```java
+boolean verifyDnaIdClaim(String claim)
+```
+
+功能说明: 验证可信声明
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | claim| String | 可信声明 | 必选 |
+| 输出参数 | true或false | boolean | | |
+
+
+
+
+## 2. 可信声明存证合约使用步骤
+
+该合约提供存储、吊销、查询状态等功能。
+
+### 2.1. 初始化SDK
+
+使用存证合约之前先初始化,并设置合约地址。
+
+```java
+String ip = "http://127.0.0.1";
+String restUrl = ip + ":" + "20334";
+String rpcUrl = ip + ":" + "20336";
+String wsUrl = ip + ":" + "20335";
+DnaSdk wm = DnaSdk.getInstance();
+wm.setRpc(rpcUrl);
+wm.setRestful(restUrl);
+wm.setDefaultConnect(wm.getRestful());
+wm.openWalletFile("RecordTxDemo.json");
+wm.setCodeAddress("803ca638069742da4b6871fe3d7f78718eeee78a");
+```
+
+> Note: codeAddress是存证合约地址。
+
+
+
+### 2.2 将可信申明保存到链上
+
+**sendCommit**
+
+```java
+String sendCommit(String issuerDnaid, String password,byte[] salt, String subjectDnaid, String claimId, Account payerAcct, long gaslimit, long gasprice)
+```
+
+功能说明: 将数据保存到链上,声明存证,当且仅当该声明没有被存证过,且Commit函数是由committer调用,才能存证成功;否则,存证失败。存证成功后,该声明的状态就是已存证(committed)。
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | issuerDnaid| String | 可信申明签发者数字身份dnaid | 必选 |
+| 输入参数 | password| String | 数字身份密码 | 必选 |
+| 输入参数 | subjectDnaid| String | 可信申明申请者dnaid | 必选 |
+| 输入参数 | claimId| String | 可信申明claim唯一性标志,即Claim里面的Jti字段 | 必选 |
+| 输入参数 | payerAcct| String | 交易费用支付者账号 | 必选 |
+| 输入参数 | gaslimit| String | gaslimit | 必选 |
+| 输入参数 | gasprice| String | gasprice | 必选 |
+| 输出参数 | 交易hash | boolean | | |
+
+
+
+示例代码
+
+```java
+String[] claims = claim.split("\\.");
+JSONObject payload = JSONObject.parseObject(new String(Base64.getDecoder().decode(claims[1].getBytes())));
+String commitHash = dnaSdk.neovm().claimRecord().sendCommit(dids.get(0).dnaid,password,dids.get(1).dnaid,payload.getString("jti"),account1,dnaSdk.DEFAULT_GAS_LIMIT,0)
+```
+
+### 2.3. 查询可信申明的状态
+
+**sendGetStatus**
+
+```
+String sendGetStatus(String claimId)
+```
+
+功能说明:查询可信申明的状态
+
+
+参数说明:
+
+```claimId```: 可信申明claim唯一性标志,即Claim里面的Jti字段
+
+返回值:有两部分: 第一部分,claim的状态:"Not attested", "Attested", "Attest has been revoked";第二部分是存证者的dnaid
+
+
+示例代码
+
+```java
+String getstatusRes2 = dnaSdk.neovm().claimRecord().sendGetStatus(payload.getString("jti"));
+```
+
+
+### 2.4. 撤销可信申明
+
+
+**sendRevoke**
+
+```java
+String sendRevoke(String issuerDnaid,String password,byte[] salt,String claimId,Account payerAcct,long gaslimit,long gas)
+```
+
+功能说明:撤销可信申明
+
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | issuerDnaid| String | 可信申明签发者数字身份dnaid | 必选 |
+| 输入参数 | password| String | 数字身份密码 | 必选 |
+| 输入参数 | salt| String | issuer的salt | 必选 |
+| 输入参数 | claimId| String | 可信申明claim唯一性标志,即Claim里面的Jti字段 | 必选 |
+| 输入参数 | payerAcct| String | 交易费用支付者账号 | 必选 |
+| 输入参数 | gaslimit| String | gaslimit | 必选 |
+| 输入参数 | gasprice| String | gasprice | 必选 |
+| 输出参数 | 交易hash | boolean | | |
+
+
+示例代码
+
+```java
+String revokeHash = dnaSdk.neovm().claimRecord().sendRevoke(dids.get(0).dnaid,password,salt,payload.getString("jti"),account1,dnaSdk.DEFAULT_GAS_LIMIT,0);
+```
diff --git a/docs/errorcode.md b/docs/errorcode.md
new file mode 100644
index 0000000..04ccdee
--- /dev/null
+++ b/docs/errorcode.md
@@ -0,0 +1,87 @@
+ 错误码
+
+
+
+| 返回代码 | 描述信息 | 说明 |
+| :---- | ----------------------------- | ----------------- |
+| 0 | SUCCESS | 成功 |
+| 41001 | SESSION_EXPIRED | 会话无效或已过期( 需要重新登录) |
+| 41002 | SERVICE_CEILING | 达到服务上限 |
+| 41003 | ILLEGAL_DATAFORMAT | 不合法数据格式 |
+| 41004 | INVALID_VERSION| 不合法的版本 |
+| 42001 | INVALID_METHOD | 无效的方法 |
+| 42002 | INVALID_PARAMS | 无效的参数 |
+| 43001 | INVALID_TRANSACTION | 无效的交易 |
+| 43002 | INVALID_ASSET | 无效的资产 |
+| 43003 | INVALID_BLOCK | 无效的块 |
+| 44001 | UNKNOWN_TRANSACTION | 找不到交易 |
+| 44002 | UNKNOWN_ASSET | 找不到资产 |
+| 44003 | UNKNOWN_BLOCK | 找不到块 |
+| 44004 | UNKNWN_CONTRACT | 找不到合约 |
+| 45001 | INTERNAL_ERROR | 内部错误 |
+| 47001 | SMARTCODE_ERROR| 智能合约错误 |
+|51001 | InvalidParams |Account Error,invalid params|
+|51002 | UnsupportedKeyType |Account Error,unsupported key type|
+|51003 | InvalidMessage |Account Error,invalid message|
+|51004 | WithoutPrivate |Account Error,account without private key cannot generate signature|
+|51005 | InvalidSM2Signature |Account Error,invalid SM2 signature parameter, ID (String) excepted|
+|51006 | AccountInvalidInput |Account Error,account without public key cannot verify signature|
+|51007 | AccountWithoutPublicKey |Account Error,unknown key type|
+|51008 | UnknownKeyType |Account Error,null input|
+|51009 | NullInput |Account Error,invalid data|
+|51010 | InvalidData |Account Error,invalid params|
+|51011 | Decoded3bytesError |Account Error,decoded 3 bytes error|
+|51012 | DecodePrikeyPassphraseError |Account Error,decode prikey passphrase error|
+|51013 | PrikeyLengthError |Account Error,Prikey length error|
+|51014 | EncryptedPriKeyError |Account Error,null prikey error|
+|51015 | encryptedPriKeyAddressPasswordErr |Account Error,encryptedPriKey address password not match.|
+|51016 | EncriptPrivateKeyError |Account Error, encript privatekey error,|
+|52001 | InputError |Uint256 Error,input error|
+|52002 | ChecksumNotValidate |Base58 Error,Checksum does not validate|
+|52003 | InputTooShort |Base58 Error,Input too short|
+|52004 | UnknownCurve |Curve Error,unknown curve|
+|52005 | UnknownCurveLabel |Curve Error,unknown curve label|
+|52006 | UnknownAsymmetricKeyType |keyType Error,unknown asymmetric key type|
+|52007 | InvalidSignatureData |Signature Error,invalid signature data: missing the ID parameter for SM3withSM2|
+|52008 | InvalidSignatureDataLen |Signature Error,invalid signature data length|
+|52009 | MalformedSignature |Signature Error,malformed signature|
+|52010 | UnsupportedSignatureScheme |Signature Error,unsupported signature scheme:|
+|52011 | DataSignatureErr |Signature Error,Data signature error.|
+|52012 | UnSupportOperation |Address Error, UnsupportedOperationException|
+|53001 | TxDeserializeError |Core Error,Transaction deserialize failed|
+|53002 | BlockDeserializeError |Core Error,Block deserialize failed|
+|54001 | MerkleVerifierErr |Wrong params: the tree size is smaller than the leaf index|
+|54002 | TargetHashesErr |targetHashes error|
+|54003 | ConstructedRootHashErr ||
+|54004 | AsserFailedHashFullTree |assert failed in hash full tree|
+|54005 | LeftTreeFull | left tree always full |
+|58001 | SendRawTxError |SmartCodeTx Error,sendRawTransaction error|
+|58002 | TypeError |SmartCodeTx Error,type error|
+|58003 | NullCodeHash |DnaIdTx Error,null codeHash|
+|58004 | ParamError |DnaIdTx Error,param error|
+|58005 | ParamErr |DnaIdTx Error,param error...|
+|58006 | DidNull |DnaIdTx Error,SendDid or receiverDid is null in metaData|
+|58007 | NotExistCliamIssuer |DnaIdTx Error,Not exist cliam issuer|
+|58007 | NotFoundPublicKeyId |DnaIdTx Error,not found PublicKeyId|
+|58008 | PublicKeyIdErr |DnaIdTx Error,PublicKeyId err|
+|58009 | BlockHeightNotMatch |DnaIdTx Error,BlockHeight not match|
+|58010 | NodesNotMatch |DnaIdTx Error,nodes not match|
+|58011 | ResultIsNull |DnaIdTx Error,result is null|
+|58012 | CreateDnaIdClaimErr |DnaIdTx Error, createDnaIdClaim error|
+|58013 | VerifyDnaIdClaimErr |DnaIdTx Error, verifyDnaIdClaim error|
+|58014 | WriteVarBytesError |DnaIdTx Error, writeVarBytes error|
+|58101 | AssetNameError |DnaAsset Error,asset name error|
+|58102 | DidError |OntAsset Error,Did error|
+|58103 | NullPkId |OntAsset Error,null pkId|
+|58104 | NullClaimId |OntAsset Error,null claimId|
+|58105 | DnaAsset Error,amount is less than or equal to zero|
+|58106 | ParamLengthNotSame |OntAsset Error,param length is not the same|
+|58201 | NullKeyOrValue |RecordTx Error,null key or value|
+|58202 | NullKey |RecordTx Error,null key|
+|58301 | WebsocketNotInit |DnaSdk Error,websocket not init|
+|58302 | ConnRestfulNotInit |DnaSdk Error,connRestful not init|
+|58401 | SetParamsValueValueNumError |AbiFunction Error,setParamsValue value num error|
+|58402 | InvalidUrlErr |Interfaces Error,Invalid url:|
+|58403 | InvalidUrl |Interfaces Error,Invalid url:|
+|58501 | GetAccountByAddressErr |WalletManager Error,getAccountByAddress err|
+|59000 | OtherError| other error|
diff --git a/docs/governance.md b/docs/governance.md
new file mode 100644
index 0000000..5cdbe65
--- /dev/null
+++ b/docs/governance.md
@@ -0,0 +1,344 @@
+ 治理合约
+
+
+## 治理合约接口
+
+治理合约用于管理节点。目前提供了以下接口。
+
+### 1. 申请成为候选节点
+
+* 申请成为候选节点
+
+```java
+String registerCandidate(Account account, String peerPubkey, long initPos, String dnaid,String dnaidpwd,byte[] salt, long keyNo, Account payerAcct, long gaslimit, long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | initPos | long | 初始化权益 |必选|
+| | dnaid | String |已授权的dnaid | 必选|
+| | dnaidpwd | String | dnaid密码 |必选|
+| | salt | byte[] | dnaid对应的salt |必选|
+| | keyNo | long | 公钥索引 |必选|
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+
+### 2. 取消申请成为候选节点
+
+* 取消申请成为候选节点,解冻抵押的ONT
+
+```java
+String unRegisterCandidate(Account account, String peerPubkey,Account payerAcct, long gaslimit, long gasprice)
+```
+
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+
+### 3. 查询节点信息
+
+* 查询节点信息
+
+```java
+String getPeerInfo(String peerPubkey)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | peerPubkey | String | 节点公钥| 必选 |
+| 输出参数 | 节点信息 | String | 节点信息 | |
+
+### 4. 查询所有节点信息
+
+* 查询节点信息
+
+```java
+String getPeerInfoAll()
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | | | | |
+| 输出参数 | 节点信息 | String | 节点信息 | |
+
+
+### 5. 查询某个地址对某个节点的授权信息
+
+* 查询某个地址对某个节点的授权信息
+
+```java
+String getAuthorizeInfo(String peerPubkey,Address addr)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | peerPubkey | String | 节点公钥|需要 |
+| 输入参数 | addr | String | 地址|需要 |
+| 输出参数 | 节点授权信息 | String | 节点授权信息 | |
+
+
+### 6. 取出处于未冻结状态的抵押
+
+* 取出处于未冻结状态的抵押
+
+```java
+String withdraw(Account account,String peerPubkey[],long[] withdrawList,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String[]| 节点公钥 | 必选 |
+| | withdrawList | long[] | 初始化权益 |必选|
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 7. 提取解绑gas
+
+* 提取解绑gas
+
+```java
+String withdrawGas(Account account,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 8. 赎回抵押权益获得收益
+
+* 赎回抵押权益获得收益
+
+```java
+String withdrawFee(Account account,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 9. 退出节点
+
+* 退出节点
+
+```java
+String quitNode(Account account,String peerPubkey,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit| 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+返回值
+```
+交易hash
+```
+### 10. 节点增加initPos
+
+* 节点增加initPos接口,只能由节点所有者调用
+
+```java
+String addInitPos(Account account,String peerPubkey,int pos,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | pos | int | 增加抵押的ont数量 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit| 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 11. 节点减少initPos
+* 节点减少initPos接口,只能由节点所有者调用,initPos不能低于承诺值,不能低于已接受授权数量的1/10
+
+```java
+String reduceInitPos(Account account,String peerPubkey,int pos,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | pos | int | 减少抵押的ont数量 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit| 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 12. 节点设置自己独占激励的比例
+
+* 节点设置自己独占激励的比例
+
+```java
+String setPeerCost(Account account,String peerPubkey,int peerCost,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | peerCost | int | 节点自己独占的比例 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit| 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 13. 节点修改自己接受的最大授权ONT数量
+* 节点修改自己接受的最大授权ONT数量
+
+```java
+String changeMaxAuthorization(Account account,String peerPubkey,int maxAuthorize,Account payerAcct,long gaslimit,long gasprice)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 节点钱包账户 | 必选 |
+| | peerPubkey | String | 节点公钥 | 必选 |
+| | maxAuthorize | int | 节点自己接受的最大授权ont数量 | 必选 |
+| | payerAcct | Account | 支付交易费用的账户 |必选|
+| | gaslimit | long | gaslimit| 必选 |
+| | gasprice | long | gas价格 | 必选|
+| 输出参数 | 交易hash | String | 交易hash | |
+
+
+### 14. 查询节点属性信息
+
+* 查询节点属性信息
+
+```java
+String getPeerAttributes(String peerPubkey)
+```
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | peerPubkey | String | 节点公钥 | 必选 |
+| 输出参数 | | String | 节点属性信息 | |
+
+
+### 15. 查询某地址得到的激励
+
+* 查询某地址得到的激励
+
+```java
+String getSplitFeeAddress(String address)
+```
+
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | address | String | 地址 | 必选 |
+| 输出参数 | | String | 查询某地址得到的激励 | |
+
+### 16. 给节点投票
+
+* 给候选节点或者共识节点投票
+
+```java
+String authorizeForPeer(Account account,String peerPubkey[],long[] posList,Account payerAcct,long gaslimit,long gasprice)
+```
+
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 投票的账户 | 必选 |
+| 输入参数 | peerPubkey | String[] | 接受投票的节点公钥数组 | 必选 |
+| 输入参数 | posList | long[] | 抵押的权益 | 必选 |
+| 输入参数 | payerAcct | Account | 支付交易费用的账户 | 必选 |
+| 输入参数 | gaslimit | long | gaslimit | 必选 |
+| 输入参数 | gasprice | long | gasprice | 必选 |
+| 输出参数 | | String | 交易hash | |
+
+### 17. 取消给节点投票
+
+* 取消给候选节点或者共识节点投票
+
+```java
+String unAuthorizeForPeer(Account account,String peerPubkey[],long[] posList,Account payerAcct,long gaslimit,long gasprice)
+```
+
+
+参数说明:
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | account | Account | 投票的账户 | 必选 |
+| 输入参数 | peerPubkey | String[] | 接受投票的节点公钥数组 | 必选 |
+| 输入参数 | posList | long[] | 抵押的权益 | 必选 |
+| 输入参数 | payerAcct | Account | 支付交易费用的账户 | 必选 |
+| 输入参数 | gaslimit | long | gaslimit | 必选 |
+| 输入参数 | gasprice | long | gasprice | 必选 |
+| 输出参数 | | String | 交易hash | |
+
+
diff --git a/docs/interface.md b/docs/interface.md
new file mode 100644
index 0000000..3dbc16a
--- /dev/null
+++ b/docs/interface.md
@@ -0,0 +1,277 @@
+ DNA Java SDK 接口
+
+
+## 介绍:
+
+本章节列出了Java SDK中关键的,SDK接口按如下几类区分:
+
+* 初始化接口
+* 与链交互接口
+* 钱包管理接口
+* 数字资产接口
+* 数字身份接口
+* NEO智能合约部署与调用接口
+* Native合约调用
+* 签名验签
+
+
+### 初始化接口:
+
+包括打开钱包文件和设置与链交互方式
+ ```
+ | Function | Description
+ ----|-----------------------------------------------|------------------------
+ 1 | sdk.setRpc(rpcUrl) | 设置rpc
+ 2 | sdk.setRestful(restUrl) | 设置restful
+ 3 | sdk.setWesocket(wsUrl, lock) | 设置websocket
+ 4 | wm.setDefaultConnect(wm.getWebSocket()); | 设置默认与链交互方式
+ 5 | wm.openWalletFile("OntAssetDemo.json"); | 打开钱包
+ ```
+
+### 与链交互接口:
+
+* 交互接口列表:
+```
+
+ | Main Function | Description
+ -----|----------------------------------------------------------|---------------------------------------------
+ 1 | dnaSdk.getConnect().getNodeCount() | 查询节点数量
+ 2 | dnaSdk.getConnect().getBlock(15) | 查询块
+ 3 | dnaSdk.getConnect().getBlockJson(15) | 查询块
+ 4 | dnaSdk.getConnect().getBlockJson("txhash") | 查询块
+ 5 | dnaSdk.getConnect().getBlock("txhash") | 查询块
+ 6 | dnaSdk.getConnect().getBlockHeight() | 查询当前块高
+ 7 | dnaSdk.getConnect().getTransaction("txhash") | 查询交易
+ 8 | dnaSdk.getConnect().getStorage("contractaddress", key) | 查询智能合约存储
+ 9 | dnaSdk.getConnect().getBalance("address") | 查询余额
+ 10 | dnaSdk.getConnect().getContractJson("contractaddress") | 查询智能合约
+ 11 | dnaSdk.getConnect().getSmartCodeEvent(59) | 查询智能合约事件
+ 12 | dnaSdk.getConnect().getSmartCodeEvent("txhash") | 查询智能合约事件
+ 13 | dnaSdk.getConnect().getBlockHeightByTxHash("txhash") | 查询交易所在高度
+ 14 | dnaSdk.getConnect().getMerkleProof("txhash") | 获取merkle证明
+ 15 | dnaSdk.getConnect().sendRawTransaction("txhexString") | 发送交易
+ 16 | dnaSdk.getConnect().sendRawTransaction(Transaction) | 发送交易
+ 17 | dnaSdk.getConnect().sendRawTransactionPreExec() | 发送预执行交易
+ 18 | dnaSdk.getConnect().getAllowance("ont","from","to") | 查询允许使用值
+ 19 | dnaSdk.getConnect().getMemPoolTxCount() | 查询交易池中交易总量
+ 20 | dnaSdk.getConnect().getMemPoolTxState() | 查询交易池中交易状态
+ 21 | dnaSdk.getConnect().syncSendRawTransaction("data") | 同步发送交易
+```
+
+### 钱包管理接口:
+
+包括数字资产和数字身份管理
+
+* 数字资产账户:
+
+```
+ | Main Function | Description
+ ----|----------------------------------------------------------------------------|------------------------
+ 1 | Account importAccount(String encryptedPrikey, String pwd,byte[] salt,String address) | 导入资产账户
+ 2 | Account createAccount(String password) | 创建资产账户
+ 3 | Account createAccountFromPriKey(String password, String prikey) | 根据私钥创建
+ 4 | AccountInfo createAccountInfo(String password) | 根据私钥创建
+ 5 | AccountInfo createAccountInfoFromPriKey(String password, String prikey) | 根据私钥创建
+ 6 | AccountInfo getAccountInfo(String address, String password,byte[] salt) | 获取账号信息
+ 7 | List getAccounts() | 查询所有账号
+ 8 | Account getAccount(String address) | 获取账户
+ 9 | Account getDefaultAccount() | 获取默认账户
+```
+
+* 数字身份:
+```
+ | Main Function | Description
+ ----|----------------------------------------------------------------------------|------------------------
+ 1 | Identity importIdentity(String encryptedPrikey, String pwd,byte[] salt,String address) | 导入身份
+ 2 | Identity createIdentity(String password) | 创建身份
+ 3 | Identity createIdentityFromPriKey(String password, String prikey) | 根据私钥创建
+ 4 | IdentityInfo createIdentityInfo(String password) | 创建身份
+ 5 | IdentityInfo createIdentityInfoFromPriKey(String password, String prikey) | 根据私钥创建
+ 6 | IdentityInfo getIdentityInfo(String dnaid, String password) | 查询身份信息
+ 7 | List getIdentitys() | 查询所有身份
+ 8 | Identity getIdentity(String dnaid) | 获取身份
+ 9 | Identity getDefaultIdentity() | 获取默认身份
+ 10 | Identity addDnaIdController(String dnaid, String key, String id) | 添加控制人
+```
+
+### 数字资产:
+1. 原生数字资产
+2. OEP4智能合约数字资产
+
+* 原生数字资产:
+
+gas:
+```
+
+ | Main Function | Description
+ -----|-------------------------------------------------------------------------------------------------------------|---------------------------------------------
+ 1 | String sendTransfer(Account sendAcct, String recvAddr, long amount,Account payerAcct,long gaslimit,long gasprice) | 转账
+ 2 | long queryBalanceOf(String address) | 查询余额
+ 3 | long queryAllowance(String fromAddr,String toAddr) | 查询Allowance
+ 4 | String sendApprove(Account sendAcct, String recvAddr, long amount,Account payerAcct,long gaslimit,long gasprice) | 发送Approve
+ 5 | String sendTransferFrom(Account sendAcct, String fromAddr, String toAddr,long amount,Account payerAcct,long gaslimit,long gasprice) | 发送TransferFrom
+ 6 | String queryName() | 查询资产名
+ 7 | String querySymbol() | 查询资产Symbol
+ 8 | long queryDecimals() | 查询精度
+ 9 | long queryTotalSupply() | 查询总供应量
+
+```
+
+
+* OEP4智能合约数字资产:
+
+```
+ | Main Function | Description
+ -----|-----------------------------------------------------------------------------------------------|---------------------------------------------
+ 1 | void setContractAddress(String codeHash) | 设置合约地址
+ 2 | String sendInit(Account acct, Account payerAcct,long gaslimit,long gasprice) | 初始化
+ 3 | long sendInitGetGasLimit() | 预执行初始化
+ 4 | String sendTransfer(Account acct, String recvAddr, long amount,Account payerAcct, long gaslimit,long gasprice) | 转账
+ 5 | long sendTransferGetGasLimit(Account acct, String recvAddr, long amount) | 预执行转账
+ 6 | String queryBalanceOf(String addr) | 查询余额
+ 7 | String queryTotalSupply() | 查询总供应量
+ 8 | String queryName() | 查询名字
+ 9 | String queryDecimals() | 查询精度
+ 10 | String querySymbol() | 查询资产Symbol
+
+```
+
+### 数字身份:
+1. 数字身份包括注册、公钥、属性、恢复人等操作。
+2. claim接口包括颁发和验证
+3. claim存证接口
+
+* dnaid功能接口:
+```
+ | Main Function | Description
+ -----|-------------------------------------------------------------------------------------------------------------|---------------------------------------------
+ 1 | String getContractAddress() | 查询合约地址
+ 2 | Identity sendRegister(Identity ident, String password,byte[] salt,Account payerAcct,long gaslimit,long gasprice) | 注册dnaid
+ 3 | Identity sendRegisterPreExec(Identity ident, String password,byte[] salt,Account payerAcct,long gaslimit,long gasprice) | 预执行注册dnaid
+ 4 | Identity sendRegisterWithAttrs(Identity ident, String password,byte[] salt,Attribute[] attributes,Account payerAcct,long gaslimit,long gasprice) | 注册dnaid并添加属性
+ 5 | String sendAddPubKey(String dnaid, String password,byte[] salt, String newpubkey,Account payerAcct,long gaslimit,long gasprice) | 添加公钥
+ 6 | String sendAddPubKey(String dnaid,String recoveryDnaid, String password,byte[] salt, String newpubkey,Account payerAcct,long gaslimit,long gasprice) | 添加公钥
+ 7 | String sendGetPublicKeys(String dnaid) | 获取公钥
+ 8 | String sendRemovePubKey(String dnaid, String password,byte[] salt, String removePubkey,Account payerAcct,long gaslimit,long gasprice) | 删除公钥
+ 9 | String sendRemovePubKey(String dnaid, String recoveryDnaid,String password,byte[] salt, String removePubkey,Account payerAcct,long gaslimit,long gasprice)| 删除公钥
+ 10 | String sendGetKeyState(String dnaid,int index) | 获取某公钥状态
+ 11 | String sendAddAttributes(String dnaid, String password,byte[] salt, Attribute[] attributes,Account payerAcct,long gaslimit,long gasprice) | 添加属性
+ 12 | String sendGetAttributes(String dnaid) | 查询属性
+ 13 | String sendRemoveAttribute(String dnaid,String password,byte[] salt,String path,Account payerAcct,long gaslimit,long gasprice) | 删除属性
+ 14 | String sendAddRecovery(String dnaid, String password,byte[] salt, String recoveryDnaid,Account payerAcct,long gaslimit,long gasprice) | 添加恢复人
+ 15 | String sendChangeRecovery(String dnaid, String newRecovery, String oldRecovery, String password,byte[] salt,Account payerAcct, long gaslimit,long gasprice) | 修改恢复人
+ 16 | String sendGetDDO(String dnaid) | 查询DDO
+
+```
+
+* 构造交易接口:
+
+ ```
+ | Make Transaction Function | Description
+ ----|---------------------------------------------------------------------------------------------------------------------|------------------------
+ 1 | Transaction makeRegister(String dnaid,String password,byte[] salt,String payer,long gaslimit,long gasprice) | 构造注册交易
+ 2 | Transaction makeRegisterWithAttrs(String dnaid, String password,byte[] salt, Attribute[] attributes, String payer, long gaslimit, long gasprice) | 构造注册dnaid并添加属性交易
+ 3 | Transaction makeAddPubKey(String dnaid,String password,byte[] salt,String newpubkey,String payer,long gaslimit,long gasprice) | 构造添加公钥交易
+ 4 | Transaction makeAddPubKey(String dnaid,String recoveryAddr,String password,byte[] salt,String newpubkey,String payer,long gaslimit,long gasprice) | 构造添加公钥交易
+ 5 | Transaction makeRemovePubKey(String dnaid, String password,byte[] salt, String removePubkey,String payer,long gaslimit,long gasprice) | 构造删除公钥交易
+ 6 | Transaction makeRemovePubKey(String dnaid,String recoveryAddr, String password,byte[] salt, String removePubkey,String payer,long gaslimit,long gasprice)| 构造删除公钥交易
+ 7 | Transaction makeAddAttributes(String dnaid, String password,byte[] salt, Attribute[] attributes,String payer,long gaslimit,long gasprice) | 构造添加属性交易
+ 8 | Transaction makeRemoveAttribute(String dnaid,String password,byte[] salt,String path,String payer,long gaslimit,long gasprice) | 构造删除属性交易
+ 9 | Transaction makeAddRecovery(String dnaid, String password,byte[] salt, String recoveryAddr,String payer,long gaslimit,long gasprice) | 构造添加恢复人交易
+ ```
+
+* Claim相关接口:
+
+ ```
+ | Claim Function | Description
+ ----|-------------------------------------------------------------------------------------------------------------------------------|------------------------
+ 1 | public Object getMerkleProof(String txhash) | 获取merkle证明
+ 2 | boolean verifyMerkleProof(String claim) | 验证merkle证明
+ 3 | String createDnaIdClaim(String signerDnaid, String pwd, byte[] salt,String context, Map claimMap, Map metaData,Map clmRevMap,long expire) | 创建claim
+ 4 | boolean verifyDnaIdClaim(String claim) | 验证claim
+
+ ```
+
+* Claim存证接口:
+
+ ```
+ | Function | Description
+ ----|-------------------------------------------------------------------------------------------------------------|------------------------
+ 1 | String sendCommit(String issuerDnaid,String password,byte[] salt,String subjectDnaid,String claimId,Account payerAcct,long gaslimit,long gasprice) | 存储claim
+ 2 | String sendRevoke(String issuerDnaid,String password,byte[] salt,String claimId,Account payerAcct,long gaslimit,long gasprice) | 吊销
+ 3 | String sendGetStatus(String claimId) | 获取状态
+
+ ```
+
+ ### 智能合约部署与调用接口
+
+ 部署与调用
+ ```
+ | Function | Description
+ ----|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------
+ 1 | DeployCode makeDeployCodeTransaction(String code, boolean needStorage, String name, String version, String author, String email, String desp, byte vmtype,String payer,long gaslimit,long gasprice)| 部署
+ 2 | InvokeCode makeInvokeCodeTransaction(String codeAddr,String method,byte[] params, String payer,long gaslimit,long gasprice) | 调用
+
+ ```
+
+ ### Native合约调用
+
+ #### 权限管理合约
+
+* 权限管理功能接口:
+ ```
+ | Function | Description
+ ----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------
+ 1 | String sendTransfer(String adminDnaId,String password,byte[] salt,String contractAddr, String newAdminDnaID,int key,Account payerAcct,long gaslimit,long gasprice) | 合约管理员转让合约管理权限
+ 2 | String assignFuncsToRole(String adminDnaID,String password,byte[] salt,String contractAddr,String role,String[] funcName,int key,Account payerAcct, long gaslimit,long gasprice) | 为角色分配函数
+ 3 | String assignDnaIDsToRole(String adminDnaId,String password,byte[] salt,String contractAddr,String role,String[] dnaIDs, int key,Account payerAcct, long gaslimit,long gasprice) | 绑定角色到实体身份
+ 4 | String delegate(String dnaid,String password,byte[] salt,String contractAddr,String toDnaId,String role,int period,int level,int key,Account payerAcct, long gaslimit,long gasprice)| 将合约调用权代理给其他人
+ 5 | String withdraw(String initiatorDnaid,String password,byte[] salt,String contractAddr,String delegate, String role,int key,Account payerAcct, long gaslimit,long gasprice) | 收回合约调用权
+ ```
+
+ * 构造交易接口:
+```
+ | Function | Description
+ ----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------
+ 1 | Transaction makeTransfer(String adminDnaID,String contractAddr, String newAdminDnaID,int key,String payer,long gaslimit,long gasprice) | 合约管理员转让合约管理权限
+ 2 | Transaction makeAssignFuncsToRole(String adminDnaID,String contractAddr,String role,String[] funcName,int key,String payer,long gaslimit,long gasprice) | 为角色分配函数
+ 3 | Transaction makeAssignDnaIDsToRole(String adminDnaId,String contractAddr,String role,String[] dnaIDs, int key,String payer,long gaslimit,long gasprice) | 绑定角色到实体身份
+ 4 | Transaction makeDelegate(String dnaid,String contractAddr,String toAddr,String role,int period,int level,int key,String payer,long gaslimit,long gasprice)| 将合约调用权代理给其他人
+ 5 | Transaction makeWithDraw(String dnaid,String contractAddr,String delegate, String role,int key,String payer,long gaslimit,long gasprice) | 收回合约调用权
+ ```
+
+#### 治理合约
+
+ | Function | Description
+ -----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ 1 | String registerCandidate(Account account, String peerPubkey, long initPos, String dnaid,String dnaidpwd,byte[] salt, long keyNo, Account payerAcct, long gaslimit, long gasprice) | 抵押一定的ONT,消耗一定的额外ONG,申请成为候选节点
+ 2 | String unRegisterCandidate(Account account, String peerPubkey,Account payerAcct, long gaslimit, long gasprice) | 取消申请成为候选节点,解冻抵押的ONT
+ 3 | String withdrawGas(Account account,Account payerAcct,long gaslimit,long gasprice) | 提取解绑ong
+ 4 | String getPeerInfo(String peerPubkey) | 查询节点信息
+ 5 | String getPeerInfoAll() | 查询所有节点
+ 6 | String getAuthorizeInfo(String peerPubkey,Address addr) | 查询某个地址对某个节点的授权信息
+ 7 | String withdraw(Account account,String peerPubkey[],long[] withdrawList,Account payerAcct,long gaslimit,long gasprice) | 取出处于未冻结状态的抵押ONT
+ 8 | String quitNode(Account account,String peerPubkey,Account payerAcct,long gaslimit,long gasprice) | 退出节点
+ 9 | String addInitPos(Account account,String peerPubkey,int pos,Account payerAcct,long gaslimit,long gasprice) | 节点增加initPos接口,只能由节点所有者调用
+ 10| String reduceInitPos(Account account,String peerPubkey,int pos,Account payerAcct,long gaslimit,long gasprice) | 节点减少initPos接口,只能由节点所有者调用,initPos不能低于承诺值,不能低于已接受授权数量的1/10
+ 11| String setPeerCost(Account account,String peerPubkey,int peerCost,Account payerAcct,long gaslimit,long gasprice) | 节点设置自己独占激励的比例
+ 12| String changeMaxAuthorization(Account account,String peerPubkey,int maxAuthorize,Account payerAcct,long gaslimit,long gasprice) | 节点修改自己接受的最大授权ONT数量
+ 13| String getPeerAttributes(String peerPubkey) | 查询节点属性信息
+ 14| String getSplitFeeAddress(String address) | 查询某地址得到的激励
+
+
+### 签名验签
+
+```
+
+com.github.DNAProject.account.Account acct = new com.github.DNAProject.account.Account(dnaSdk.defaultSignScheme);
+byte[] data = "12345".getBytes();
+DataSignature sign = new DataSignature(dnaSdk.defaultSignScheme, acct, data);
+byte[] signature = sign.signature();
+
+
+com.github.DNAProject.account.Account acct2 = new com.github.DNAProject.account.Account(false,acct.serializePublicKey());
+DataSignature sign2 = new DataSignature();
+System.out.println(sign2.verifySignature(acct2, data, signature));
+
+```
\ No newline at end of file
diff --git a/docs/sdk_get_start.md b/docs/sdk_get_start.md
new file mode 100644
index 0000000..c6e1f62
--- /dev/null
+++ b/docs/sdk_get_start.md
@@ -0,0 +1,743 @@
+ Java sdk 使用说明
+
+
+本文大纲如下:
+* [快速开始](#快速开始)
+ * [1. 公私钥和地址](#1-公私钥和地址)
+ * [1.1 公私钥存储](#11-公私钥存储)
+ * [1.1.1 自己存储:](#111-自己存储)
+ * [随机创建账号:](#随机创建账号)
+ * [根据私钥创建账号](#根据私钥创建账号)
+ * [1.1.2 按钱包规范存储:](#112-按钱包规范存储)
+ * [1.2 地址](#12-地址)
+ * [2. 原生资产转账](#2-原生资产转账)
+ * [2.1 初始化](#21-初始化)
+ * [2.2 查询](#22-查询)
+ * [ 查询ont,ong余额](#查询ontong余额)
+ * [ 查询交易是否在交易池中](#查询交易是否在交易池中)
+ * [ 查询交易是否调用成功](#查询交易是否调用成功)
+ * [ 同步查询智能合约event](#同步查询智能合约event)
+ * [其他与链交互接口列表:](#其他与链交互接口列表)
+ * [2.3 交易反序](#23-交易反序)
+ * [2.4 GAS转账](#24-GAS转账)
+ * [ 构造转账交易并发送](#构造转账交易并发送)
+ * [ 多次签名](#多次签名)
+ * [ 一转多或多转多](#一转多或多转多)
+ * [使用签名机签名](#使用签名机签名)
+ * [2.5 GAS转账](#25-GAS转账)
+ * [ GAS转账](#GAS转账)
+ * [ 提取GAS](#提取GAS)
+ * [3. OEP4转账](#3-OEP4转账)
+ * [3.1 查询](#31-查询)
+ * [3.2 转账](#32-转账)
+ * [4. 批量交易](#4-批量交易)
+ * [4.1 批量构造交易](#41-批量构造交易)
+ * [4.2 批量发送交易](#42-批量发送交易)
+ * [4.3 在钱包中创建Dnaid](#43-在钱包中创建Dnaid)
+
+# 快速开始
+
+在公私钥对创建前,请先熟悉区块链接口,如果对数字身份和智能合约感兴趣,请参考对应说明。
+
+区块链接口请参考:
+ - [区块链节点接口](basic.md)。
+数字身份请参考:
+ - [数字身份](dnaid.md)
+ - [可信声明](dnaid_claim.md)
+智能合约请参考:
+ - [智能合约部署和调用](smartcontract.md)
+
+## 1. 公私钥和地址
+
+账户是基于公私钥创建的,地址是公钥转换而来。
+
+### 1.1 **公私钥存储**
+
+公私钥存储可以根据情况存储在自己数据库中,也可以根据钱包规范存储在文件中。
+
+#### 1.1.1 自己存储:
+
+自己存储,是指账户信息保存在用户数据库或其他地方,而不存储在遵循钱包规范的文件中。
+##### 随机创建账号:
+```java
+com.github.DNAProject.account.Account acct = new com.github.DNAProject.account.Account(dnaSdk.defaultSignScheme);
+acct.serializePrivateKey();//私钥
+acct.serializePublicKey();//公钥
+acct.getAddressU160().toBase58();//base58地址
+```
+##### 根据私钥创建账号
+```java
+com.github.DNAProject.account.Account acct0 = new com.github.DNAProject.account.Account(Helper.hexToBytes(privatekey0), dnaSdk.defaultSignScheme);
+com.github.DNAProject.account.Account acct1 = new com.github.DNAProject.account.Account(Helper.hexToBytes(privatekey1), dnaSdk.defaultSignScheme);
+com.github.DNAProject.account.Account acct2 = new com.github.DNAProject.account.Account(Helper.hexToBytes(privatekey2), dnaSdk.defaultSignScheme);
+
+```
+
+#### 1.1.2 按钱包规范存储:
+
+账户和身份信息保持在遵循钱包规范的文件中。[例子](https://github.com/DNAProject/DNA-java-sdk/blob/master/src/main/java/example/wallet/WalletDemo.java)
+
+
+
+
+#### 在钱包中批量创建账号:
+
+一个创建多个账号的方法。
+```java
+dnaSdk.getWalletMgr().createAccounts(10, "passwordtest");
+dnaSdk.getWalletMgr().writeWallet();
+
+随机创建:
+AccountInfo info0 = dnaSdk.getWalletMgr().createAccountInfo("passwordtest");
+
+通过私钥创建:
+AccountInfo info = dnaSdk.getWalletMgr().createAccountInfoFromPriKey("passwordtest","e467a2a9c9f56b012c71cf2270df42843a9d7ff181934068b4a62bcdd570e8be");
+
+获取账号
+com.github.DNAProject.account.Account acct0 = dnaSdk.getWalletMgr().getAccount(info.addressBase58,"passwordtest",salt);
+
+```
+
+
+
+
+### 1.2 **地址**
+
+
+包括单签地址和多签地址,生成方式与NEO地址相同。
+
+签地址是由一个公钥转换而来,多签地址是由多个公钥转换而来。
+
+```java
+单签地址生成:
+String privatekey0 = "c19f16785b8f3543bbaf5e1dbb5d398dfa6c85aaad54fc9d71203ce83e505c07";
+String privatekey1 = "49855b16636e70f100cc5f4f42bc20a6535d7414fb8845e7310f8dd065a97221";
+String privatekey2 = "1094e90dd7c4fdfd849c14798d725ac351ae0d924b29a279a9ffa77d5737bd96";
+
+//生成账号,获取地址
+com.github.DNAProject.account.Account acct0 = new com.github.DNAProject.account.Account(Helper.hexToBytes(privatekey0), dnaSdk.defaultSignScheme);
+Address sender = acct0.getAddressU160();
+
+//base58地址解码
+sender = Address.decodeBase58("AVcv8YBABi9m6vH7faq3t8jWNamDXYytU2");
+
+多签地址生成:
+Address recvAddr = Address.addressFromMultiPubKeys(2, acct1.serializePublicKey(), acct2.serializePublicKey());
+
+
+```
+
+
+| 方法名 | 参数 | 参数描述 |
+| :--- | :--- | :--- |
+| addressFromMultiPubkeys | int m,byte[]... pubkeys | 最小验签个数(<=公钥个数),公钥 |
+
+## 2. 原生资产转账
+
+参考例子:[例子](https://github.com/DNAProject/DNA-java-sdk/blob/master/src/main/java/example/transaction/MakeTxWithoutWalletDemo.java)
+
+
+### 2.1 初始化
+
+转账之前需要创建SDK实例,配置节点IP。
+
+```java
+
+String ip = "http://127.0.0.1";
+String rpcUrl = ip + ":" + "20336";
+DnaSdk dnaSdk = DnaSdk.getInstance();
+dnaSdk.setRpc(rpcUrl);
+dnaSdk.setDefaultConnect(wm.getRpc());
+
+或使用restful:
+String restUrl = ip + ":" + "20334";
+dnaSdk.setRestful(restUrl);
+dnaSdk.setDefaultConnect(wm.getRestful());
+
+也可以选择websocket:
+String wsUrl = ip + ":" + "20335";
+dnaSdk.setWesocket(wsUrl, lock);
+dnaSdk.setDefaultConnect(wm.getWebSocket());
+
+```
+
+
+### 2.2 查询
+
+当发完交易之后可能需要查询交易是否已经落账,还可能需要查询账户余额。
+
+#### **查询gas余额**
+
+```java
+dnaSdk.getConnect().getBalance("AVcv8YBABi9m6vH7faq3t8jWNamDXYytU2");
+dnaSdk.nativevm().gas().queryBalanceOf("AVcv8YBABi9m6vH7faq3t8jWNamDXYytU2")
+
+查gas信息:
+System.out.println(dnaSdk.nativevm().gas().queryName());
+System.out.println(dnaSdk.nativevm().gas().querySymbol());
+System.out.println(dnaSdk.nativevm().gas().queryDecimals());
+System.out.println(dnaSdk.nativevm().gas().queryTotalSupply());
+
+
+
+```
+
+#### **查询交易是否在交易池中**
+
+通过接口查询交易是否在交易池中
+```json
+
+dnaSdk.getConnect().getMemPoolTxState("d441a967315989116bf0afad498e4016f542c1e7f8605da943f07633996c24cc")
+
+
+response 交易池存在此交易:
+
+{
+ "Action": "getmempooltxstate",
+ "Desc": "SUCCESS",
+ "Error": 0,
+ "Result": {
+ "State":[
+ {
+ "Type":1,
+ "Height":744,
+ "ErrCode":0
+ },
+ {
+ "Type":0,
+ "Height":0,
+ "ErrCode":0
+ }
+ ]
+ },
+ "Version": "1.0.0"
+}
+
+或 交易池不存在此交易
+
+{
+ "Action": "getmempooltxstate",
+ "Desc": "UNKNOWN TRANSACTION",
+ "Error": 44001,
+ "Result": "",
+ "Version": "1.0.0"
+}
+
+```
+
+
+#### **查询交易是否调用成功**
+
+查询智能合约推送内容,代表交易执行成功,如果没有成功```States```中不会有```transfer```的事件。
+
+```json
+dnaSdk.getConnect().getSmartCodeEvent("d441a967315989116bf0afad498e4016f542c1e7f8605da943f07633996c24cc")
+
+
+response:
+{
+ "Action": "getsmartcodeeventbyhash",
+ "Desc": "SUCCESS",
+ "Error": 0,
+ "Result": {
+ "TxHash": "20046da68ef6a91f6959caa798a5ac7660cc80cf4098921bc63604d93208a8ac",
+ "State": 1,
+ "GasConsumed": 0,
+ "Notify": [
+ {
+ "ContractAddress": "ff00000000000000000000000000000000000001",
+ "States": [
+ "transfer",
+ "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb",
+ "TA4WVfUB1ipHL8s3PRSYgeV1HhAU3KcKTq",
+ 1000000000
+ ]
+ }
+ ]
+ },
+ "Version": "1.0.0"
+}
+
+```
+
+根据块高查询智能合约事件,返回有事件的交易hash
+
+
+```json
+
+dnaSdk.getConnect().getSmartCodeEvent(10)
+
+response:
+{
+ "Action": "getsmartcodeeventbyheight",
+ "Desc": "SUCCESS",
+ "Error": 0,
+ "Result": [{
+ "GasConsumed": 0,
+ "Notify": [{
+ "States": ["transfer", "AFmseVrdL9f9oyCzZefL9tG6UbvhPbdYzM", "APrfMuKrAQB5sSb5GF8tx96ickZQJjCvwG", 1000000000],
+ "ContractAddress": "0100000000000000000000000000000000000000"
+ }],
+ "TxHash": "b8a4f77e19fcae04faa576fbc71fa5a9775166d4485ce13f1ba5ff30ce264c52",
+ "State": 1
+ }, {
+ "GasConsumed": 0,
+ "Notify": [{
+ "States": ["transfer", "AFmseVrdL9f9oyCzZefL9tG6UbvhPbdYzM", "AFmseVrdL9f9oyCzZefL9tG6UbvhUMqNMV", 1000000000000000000],
+ "ContractAddress": "0200000000000000000000000000000000000000"
+ }],
+ "TxHash": "7e8c19fdd4f9ba67f95659833e336eac37116f74ea8bf7be4541ada05b13503e",
+ "State": 1
+ }, {
+ "GasConsumed": 0,
+ "Notify": [],
+ "TxHash": "80617b4a97eb4266e5e38886f234f324d57587362b5039a01c45cf413461f53b",
+ "State": 1
+ }, {
+ "GasConsumed": 0,
+ "Notify": [],
+ "TxHash": "ede7ecc6e4e7e699b8ba1f07f2e5f8af3b65e70f126d82f7765d20a506080d2d",
+ "State": 0
+}],
+ "Version": "1.0.0"
+}
+
+```
+
+#### **同步查询智能合约event**
+
+发完交易后,直到查到交易才返回。
+
+```json
+//发完交易每隔3秒请求一次,最长等待60秒
+
+Object object = dnaSdk.getConnect().waitResult(tx.hash().toString());
+System.out.println(object);
+
+response success:
+{
+ "GasConsumed": 0,
+ "Notify": [],
+ "TxHash": "cb9e0d4a7a4aea0518bb39409613b8ef76798df3962feb8f8040e05329674890",
+ "State": 1
+}
+
+response fail,reject by txpool:
+com.github.DNAProject.sdk.exception.SDKException: {"Action":"getmempooltxstate","Desc":"UNKNOWN TRANSACTION","Error":44001,"Result":"","Version":"1.0.0"}
+
+```
+
+#### 其他与链交互接口列表:
+
+与链交互还有如下接口。
+```
+
+ | Main Function | Description
+ -----|----------------------------------------------------------|---------------------------------------------
+ 1 | dnaSdk.getConnect().getNodeCount() | 查询节点数量
+ 2 | dnaSdk.getConnect().getBlock(15) | 查询块
+ 3 | dnaSdk.getConnect().getBlockJson(15) | 查询块
+ 4 | dnaSdk.getConnect().getBlockJson("txhash") | 查询块
+ 5 | dnaSdk.getConnect().getBlock("txhash") | 查询块
+ 6 | dnaSdk.getConnect().getBlockHeight() | 查询当前块高
+ 7 | dnaSdk.getConnect().getTransaction("txhash") | 查询交易
+ 8 | dnaSdk.getConnect().getStorage("contractaddress", key) | 查询智能合约存储
+ 9 | dnaSdk.getConnect().getBalance("address") | 查询余额
+ 10 | dnaSdk.getConnect().getContractJson("contractaddress") | 查询智能合约
+ 11 | dnaSdk.getConnect().getSmartCodeEvent(59) | 查询智能合约事件
+ 12 | dnaSdk.getConnect().getSmartCodeEvent("txhash") | 查询智能合约事件
+ 13 | dnaSdk.getConnect().getBlockHeightByTxHash("txhash") | 查询交易所在高度
+ 14 | dnaSdk.getConnect().getMerkleProof("txhash") | 获取merkle证明
+ 15 | dnaSdk.getConnect().sendRawTransaction("txhexString") | 发送交易
+ 16 | dnaSdk.getConnect().sendRawTransaction(Transaction) | 发送交易
+ 17 | dnaSdk.getConnect().sendRawTransactionPreExec() | 发送预执行交易
+ 18 | dnaSdk.getConnect().getAllowance("gas","from","to") | 查询允许使用值
+ 19 | dnaSdk.getConnect().getMemPoolTxCount() | 查询交易池中交易总量
+ 20 | dnaSdk.getConnect().getMemPoolTxState() | 查询交易池中交易状态
+```
+
+### 2.3 交易反序
+
+获取json格式的交易数据
+
+```json
+http://127.0.0.1:20334/api/v1/transaction/8f4ab5db768e41e56643eee10ad9749be0afa54a891bcd8e5c45543a8dd0cf7d?raw=0
+
+{
+ "Action": "gettransaction",
+ "Desc": "SUCCESS",
+ "Error": 0,
+ "Result": {
+ "Version": 0,
+ "Nonce": 391455426,
+ "GasPrice": 500,
+ "GasLimit": 20000,
+ "Payer": "ASyx6be9APCR6BzcM81615FgBU26gqr1JL",
+ "TxType": 209,
+ "Payload": {
+ "Code": "00c66b147af216ff3da82b999b26f5efe165de5f944ac5496a7cc814d2c124dd088190f709b684e0bc676d70c41b37766a7cc80800ca9a3b000000006a7cc86c51c1087472616e736665721400000000000000000000000000000000000000010068164f6e746f6c6f67792e4e61746976652e496e766f6b65"
+ },
+ "Attributes": [],
+ "Sigs": [
+ {
+ "PubKeys": [
+ "0369d1e9a5a1d83fa1798bbd162e8d8d8ef8e4e1a0e03aa2753b472943e235e219"
+ ],
+ "M": 1,
+ "SigData": [
+ "017b80d5f0826b52b2037ee564be55f0ada1d0cb714a80967deb2d04b49a59f6c4358c57d06ee8f7666aec3fc570c5251c30be1cd134acb791775de9e11cacd22c"
+ ]
+ }
+ ],
+ "Hash": "8f4ab5db768e41e56643eee10ad9749be0afa54a891bcd8e5c45543a8dd0cf7d",
+ "Height": 95796
+ },
+ "Version": "1.0.0"
+}
+
+```
+
+获取hex格式的交易数据
+```json
+http://127.0.0.1:20334/api/v1/transaction/8f4ab5db768e41e56643eee10ad9749be0afa54a891bcd8e5c45543a8dd0cf7d?raw=1
+
+
+{
+ "Action": "gettransaction",
+ "Desc": "SUCCESS",
+ "Error": 0,
+ "Result": "00d1c2225517f401000000000000204e0000000000007af216ff3da82b999b26f5efe165de5f944ac5497900c66b147af216ff3da82b999b26f5efe165de5f944ac5496a7cc814d2c124dd088190f709b684e0bc676d70c41b37766a7cc80800ca9a3b000000006a7cc86c51c1087472616e736665721400000000000000000000000000000000000000010068164f6e746f6c6f67792e4e61746976652e496e766f6b6500014241017b80d5f0826b52b2037ee564be55f0ada1d0cb714a80967deb2d04b49a59f6c4358c57d06ee8f7666aec3fc570c5251c30be1cd134acb791775de9e11cacd22c23210369d1e9a5a1d83fa1798bbd162e8d8d8ef8e4e1a0e03aa2753b472943e235e219ac",
+ "Version": "1.0.0"
+}
+
+```
+
+要理解交易中的数据内容,需要反序列化交易数据,才能推断出是什么类型的交易和具体信息。
+```
+//版本号 交易类型 随机数 gasprice gaslimit 网络费付款人 交易数据
+(version(1) type(1) nonce(4) gasprice(8) gaslimit(8))22 bytes + (payer)21 bytes + payload code bytes( any bytes)
+
+claim gas
+// claim address contract address to address amount "transferFrom" gas SYSCALL "*.Native.Invoke"
+//00 c66b 14bb2d5b718efeac060ac825338ca440216da4d8dc 6a7cc8 140000000000000000000000000000000000000001 6a7cc8 14bb2d5b718efeac060ac825338ca440216da4d8dc 6a7cc8 08 806a735501000000 6a7cc8 6c 0c7472616e7366657246726f6d 140000000000000000000000000000000000000002 0068 164f6e746f6c6f67792e4e61746976652e496e766f6b65
+gas transfer
+// from to amount "transfer" gas SYSCALL "*.Native.Invoke"
+//00 c66b 147af216ff3da82b999b26f5efe165de5f944ac549 6a7cc8 14d2c124dd088190f709b684e0bc676d70c41b3776 6a7cc8 08 00ca9a3b00000000 6a7cc8 6c 51c1 087472616e73666572 140000000000000000000000000000000000000001 0068 164f6e746f6c6f67792e4e61746976652e496e766f6b65
+
+For amount : 1-16 is 0x51-0x60 . >=16 is long, 08 is the total amount bytes .
+Example: 1000 is 0xe803000000000000 -> 0x00000000000003e8 change from little endian to big endian if print.
+
+```
+
+### 2.4 GAS转账
+
+GAS转账可以一对一,也可以一对多,多对多,多对一。
+
+#### **构造转账交易并发送**
+
+```java
+转出方与收款方地址:
+Address sender = acct0.getAddressU160();
+Address recvAddr = acct1;
+//多签地址生成
+//Address recvAddr = Address.addressFromMultiPubKeys(2, acct1.serializePublicKey(), acct2.serializePublicKey());
+
+构造转账交易:
+long amount = 1000;
+Transaction tx = dnaSdk.nativevm().gas().makeTransfer(sender.toBase58(),recvAddr.toBase58(), amount,sender.toBase58(),30000,0);
+String hash = tx.hash().toString()
+
+对交易做签名:
+dnaSdk.signTx(tx, new com.github.DNAProject.account.Account[][]{{acct0}});
+//多签地址的签名方法:
+dnaSdk.signTx(tx, new com.github.DNAProject.account.Account[][]{{acct1, acct2}});
+//如果转出方与网络费付款人不是同一个地址,需要添加网络费付款人的签名
+
+
+发送预执行(可选):
+Object obj = dnaSdk.getConnect().sendRawTransactionPreExec(tx.toHexString());
+System.out.println(obj);
+成功返回:
+{"State":1,"Gas":30000,"Result":"01"}
+余额不足返回异常:
+com.github.DNAProject.network.exception.RestfulException: {"Action":"sendrawtransaction","Desc":"SMARTCODE EXEC ERROR","Error":47001,"Result":"","Version":"1.0.0"}
+
+
+发送交易:
+dnaSdk.getConnect().sendRawTransaction(tx.toHexString());
+
+
+同步发送交易:
+Object obj = dnaSdk.getConnect().syncSendRawTransaction(tx.toHexString());
+
+response success:
+{
+ "GasConsumed": 0,
+ "Notify": [],
+ "TxHash": "cb9e0d4a7a4aea0518bb39409613b8ef76798df3962feb8f8040e05329674890",
+ "State": 1
+}
+
+response fail,reject by txpool:
+com.github.DNAProject.sdk.exception.SDKException: {"Action":"getmempooltxstate","Desc":"UNKNOWN TRANSACTION","Error":44001,"Result":"","Version":"1.0.0"}
+
+```
+
+
+
+| 方法名 | 参数 | 参数描述 |
+| :--- | :--- | :--- |
+| makeTransfer | String sender,String recvAddr,long amount,String payer,long gaslimit,long gasprice | 发送方地址,接收方地址,金额,网络费付款人地址,gaslimit,gasprice |
+| makeTransfer | State\[\] states,String payer,long gaslimit,long gasprice | 一笔交易包含多个转账。 |
+
+
+#### **多次签名**
+
+如果转出方与网络费付款人不是同一个地址,需要添加网络费付款人的签名
+
+```java
+
+1.添加单签签名
+dnaSdk.addSign(tx,acct0);
+
+2.添加多签签名
+dnaSdk.addMultiSign(tx,2,new byte[][]{acct.serializePublicKey(),acct2.serializePublicKey()},acct);
+dnaSdk.addMultiSign(tx,2,new byte[][]{acct.serializePublicKey(),acct2.serializePublicKey()},acct2);
+
+3.多签签名分多次签
+acct0签名:
+dnaSdk.addMultiSign(tx,2,new byte[][]{acct.serializePublicKey(),acct2.serializePublicKey()},acct);
+
+acct1签名:
+dnaSdk.addMultiSign(tx,2,new byte[][]{acct.serializePublicKey(),acct2.serializePublicKey()},acct2);
+
+```
+
+
+
+#### **一转多或多转多**
+
+1. 构造多个state的交易
+2. 签名
+3. 一笔交易上限为1024笔转账
+
+
+```java
+
+Address sender1 = acct0.getAddressU160();
+Address sender2 = Address.addressFromMultiPubKeys(2, acct1.serializePublicKey(), acct2.serializePublicKey());
+int amount = 10;
+int amount2 = 20;
+
+State state = new State(sender1, recvAddr, amount);
+State state2 = new State(sender2, recvAddr, amount2);
+Transaction tx = dnaSdk.nativevm().ont().makeTransfer(new State[]{state1,state2},sender1.toBase58(),30000,0);
+
+//第一个转出方是单签地址,第二个转出方是多签地址:
+dnaSdk.signTx(tx, new com.github.DNAProject.account.Account[][]{{acct0}});
+dnaSdk.addMultiSign(tx,2,new byte[][]{acct1.serializePublicKey(),acct2.serializePublicKey()},acct1);
+dnaSdk.addMultiSign(tx,2,new byte[][]{acct1.serializePublicKey(),acct2.serializePublicKey()},acct2);
+```
+
+#### 使用签名机签名
+
+ **构造交易并签名**
+
+1. 构造交易,序列化交易,发送交易给签名机
+2. 签名机接收到交易,反序列化,检查交易,添加签名
+3. 发送交易
+
+```java
+
+序列化交易发送给签名机:
+Transaction tx = dnaSdk.nativevm().gas().makeTransfer(sender.toBase58(),recvAddr.toBase58(), amount,sender.toBase58(),30000,0);
+String txHex = tx.toHexString();
+
+接收方反序列化交易并签名:
+
+Transaction txRx = Transaction.deserializeFrom(Helper.hexToBytes(txHex));
+
+
+签名:
+dnaSdk.addSign(txRx,acct0);
+```
+
+**SDK与签名机交互**:
+
+[例子](https://github.com/DNAProject/DNA-java-sdk/blob/master/src/main/java/example/signature/SignServerDemo.java)
+
+```java
+节点启动时打开签名机服务:
+go run SigSvr.go
+
+
+设置签名机URL:
+String url = ip + ":" + "20000/cli";
+DnaSdk dnaSdk = DnaSdk.getInstance();
+dnaSdk.setSignServer(url);
+
+
+String txHex = tx.toHexString();
+
+请求单签交易:
+dnaSdk.getSignServer().sendSigRawTx(txHex);
+
+请求多签交易:
+String[] signs = new String[]{"02039b196d5ed74a4d771ade78752734957346597b31384c3047c1946ce96211c2a7",
+ "0203428daa06375b8dd40a5fc249f1d8032e578b5ebb5c62368fc6c5206d8798a966"};
+dnaSdk.getSignServer().sendMultiSigRawTx(txHex,2,signs);
+
+请求构造转账交易并签名:
+dnaSdk.getSignServer().sendSigTransferTx("ont","TU5exRFVqjRi5wnMVzNoWKBq9WFncLXEjK","TA5SgQXTeKWyN4GNfWGoXqioEQ4eCDFMqE",10,30000,0);
+
+
+```
+
+ **对数据做签名**
+
+SDK提供直接对数据做签名的接口。[例子](https://github.com/DNAProject/DNA-java-sdk/blob/master/src/main/java/example/signature/SignatureDemo.java)
+
+
+```java
+com.github.DNAProject.account.Account acct = new com.github.DNAProject.account.Account(dnaSdk.defaultSignScheme);
+
+byte[] data = "12345".getBytes();
+byte[] signature = dnaSdk.signatureData(acct, data);
+
+System.out.println(dnaSdk.verifySignature(acct.serializePublicKey(), data, signature));
+
+```
+
+
+
+### 2.5 GAS转账
+
+GAS的精度是9。
+#### **GAS转账**
+
+
+```json
+dnaSdk.nativevm().gas().makeTransfer(sender.toBase58(),recvAddr.toBase58(), amount,sender.toBase58(),30000,0);
+```
+
+#### **提取gas**
+
+1. 查询是否有gas可以提取
+2. 发送提取gas交易
+
+```json
+查询未提取gas:
+String addr = acct0.getAddressU160().toBase58();
+String gas = sdk.nativevm().gas().unboundGas(addr);
+
+//提取gas
+com.github.DNAProject.account.Account account = new com.github.DNAProject.account.Account(Helper.hexToBytes(privatekey0), dnaSdk.signatureScheme);
+String hash = dnaSdk.nativevm().gas().withdrawGas(account,toAddr,64000L,payerAcct,30000,500);
+
+```
+
+
+
+## 3. OEP4转账
+
+
+### 3.1 查询
+
+```
+dnaSdk.neovm().oep4().setContractAddress("dff96f4a83b9cb0de3d5e05ca3dff7af841dc0f3");
+System.out.println(dnaSdk.neovm().oep4().queryBalanceOf(account.getAddressU160().toBase58()));
+
+```
+### 3.2 转账
+
+```
+dnaSdk.neovm().oep4().setContractAddress("dff96f4a83b9cb0de3d5e05ca3dff7af841dc0f3");
+String txhash = dnaSdk.neovm().oep4().sendTransfer(acct1, acct2.getAddressU160().toBase58(), 1000, acct1, 20000, 500);
+
+```
+
+### 3.3 并发
+
+实现步骤如 [例子](https://github.com/DNAProject/DNA-java-sdk/tree/master/src/main/java/example/oep/Oep4MultiTheadDemo.java)
+
+
+
+## 4. 批量交易
+
+SDK发送注册Dnaid和转账等交易时,根据钱包中账户和身份信息解密出私钥再做签名,这个过程大概需要1-2秒时间。为了节省发交易时间,可以多线程或多机器事先创建交易,再批量发送。
+
+实现步骤如下,[例子](https://github.com/DNAProject/DNA-java-sdk/tree/master/src/main/java/example/transaction/CreateManyTx.java)
+
+### 4.1 批量构造交易
+
+1. 打开文件
+2. 构造交易,下面以构造注册Dnaid交易为例。
+3. 写入交易
+
+> 构造交易时,如果新创建账户,需要用户自己保存账户私钥。
+
+```
+//open file, make registry dnaid transaction, save tx to file.
+File file = new File(filePath);
+if (!file.exists()) {
+ file.createNewFile();
+}
+com.github.DNAProject.account.Account payerAcct = new com.github.DNAProject.account.Account(Helper.hexToBytes(privatekey1), SignatureScheme.SHA256WITHECDSA);
+FileOutputStream fos = new FileOutputStream(file);
+for (int i = 0; i < 3; i++) {
+ com.github.DNAProject.account.Account account = new com.github.DNAProject.account.Account(SignatureScheme.SHA256WITHECDSA);
+ String dnaid = Common.diddna + account.getAddressU160().toBase58();
+ Transaction tx = dnaSdk.nativevm().dnaId().makeRegister(dnaid, Helper.toHexString(account.serializePublicKey()), payerAcct.getAddressU160().toBase58(), 20000, 500);
+ dnaSdk.addSign(tx, account);
+ dnaSdk.addSign(tx, payerAcct);
+ System.out.println("PrivateKey:"+Helper.toHexString(account.serializePrivateKey())+",txhash:"+tx.hash().toString());
+
+ fos.write(tx.toHexString().getBytes());
+ fos.write(",".getBytes());
+ fos.write(tx.hash().toString().getBytes());
+ fos.write("\n".getBytes());
+}
+
+
+```
+文件中数据格式:
+
+```
+交易,交易hash
+交易,交易hash
+
+00d1df24a313f401000000000000204e000000000000aa6e06c79f864152ab7f3139074aad822ffea8559800c66b2a6469643a6f6e743a414774577a7933693148453654516e31633265636b78527841516d524662467333686a7cc821036391476eed630fc1cffb1317545d9390f22d68cdc7092095dc1b78e4baeef27c6a7cc86c127265674944576974685075626c69634b65791400000000000000000000000000000000000000030068164f6e746f6c6f67792e4e61746976652e496e766f6b6500024241011928500aa1ac40d908e92c9db7c16be4063dda2cdabe9908206747c6303635578fde0be66032f586596e91c80f490a085e612be28b95da0edb319cb60f774e472321036391476eed630fc1cffb1317545d9390f22d68cdc7092095dc1b78e4baeef27cac424101bb1df17b91cd709ce38b4ec40db10c2dfd5e9ca7219dd5ca1c6200eaf60d8ccf1be9b85b9b22398204c6366ac20e8bb7797f21ebc17e7db540627b99d5a8bb41232102df6f28e327352a44720f2b384e55034c1a7f54ba31785aa3a338f613a5b7cc26ac,b7e2c99f449cb3403619bc5c5887c52f44993180c61c9fae85d5e772ce3d7fda
+00d1039e89c7f401000000000000204e000000000000aa6e06c79f864152ab7f3139074aad822ffea8559800c66b2a6469643a6f6e743a416446335547344867515864515a5577714a53756536744a6f534e564237644d32596a7cc82102a1f44af3d81c6cb0aaa5e1d597b891c436b0c724ae446b5d9cb9039e09b9938c6a7cc86c127265674944576974685075626c69634b65791400000000000000000000000000000000000000030068164f6e746f6c6f67792e4e61746976652e496e766f6b65000242410168436b2f5da6db0b2b4260b587ba7bce3dba1597a400dec52d0f00a4aa77f37c9979d10c31a80888edd6a41da4c89596033ab9ee634886f26850b32e83681f4e232102a1f44af3d81c6cb0aaa5e1d597b891c436b0c724ae446b5d9cb9039e09b9938cac4241019ba8633b42d3427ab202cafcb1c50a65de30c65120a96d958f985aff7205fcc6230e64842ea5cdf4e6b2d0b8bef1b19c795bf392a0c1cc8a93bc9ec9bebc9a35232102df6f28e327352a44720f2b384e55034c1a7f54ba31785aa3a338f613a5b7cc26ac,a8bd8258c8819f0ecf0652bb1d8c08860a5b75d16e194f3d6cd395f5c2a9f7fe
+00d1554170d9f401000000000000204e000000000000aa6e06c79f864152ab7f3139074aad822ffea8559800c66b2a6469643a6f6e743a41547a4d6e79556d42614369686355556872786472566d437173336d73426351685a6a7cc8210274af46f5f038d040e5096f4653df4e7ea5598567effe4542ad6f19cda6ea05846a7cc86c127265674944576974685075626c69634b65791400000000000000000000000000000000000000030068164f6e746f6c6f67792e4e61746976652e496e766f6b650002424101ea9d7dedf17ecfef8d1d03f4d00b819c16fab8275b5d77d811a1db8140d25722fc2200a60ea76e5a449cce4e127ceec73377cce1b227c624b8df9f95be55bf4123210274af46f5f038d040e5096f4653df4e7ea5598567effe4542ad6f19cda6ea0584ac424101e401877fc4892212a309b7de30d5d9dd675a7171f89d945fe44c3b9eba46df2c2966f54fefdf5eabfa651acf63332cf9475868aa3055531a97a1fffbd43b09b8232102df6f28e327352a44720f2b384e55034c1a7f54ba31785aa3a338f613a5b7cc26ac,bd888014a82cec39f72400e4b8c43e46702bd96a16172b144361cb7b3bc024f4
+
+```
+
+### 4.2 批量发送交易
+
+1. 打开文件
+2. 读取一行数据
+3. 提取交易数据,发送交易数据
+
+```
+//read transaction from file, send transaction to node
+FileReader fr = new FileReader(filePath);
+BufferedReader bf = new BufferedReader(fr);
+String txHex = null;
+while ((txHex=bf.readLine())!=null){
+ txHex = txHex.split(",")[0];
+ Object obj = dnaSdk.getConnect().sendRawTransactionPreExec(txHex);//change to sendRawTransaction
+ System.out.println(obj);
+}
+
+
+```
+
+
+### 4.3 在钱包中创建Dnaid
+
+如果需要把Dnaid保存到钱包,根据4.1中保存的私钥,在钱包中创建Dnaid即可。
+
+```
+Identity identity = dnaSdk.getWalletMgr().createIdentityFromPriKey(password,privatekey0);
+dnaSdk.getWalletMgr().writeWallet();
+```
\ No newline at end of file
diff --git a/docs/smartcontract.md b/docs/smartcontract.md
new file mode 100644
index 0000000..bc8646e
--- /dev/null
+++ b/docs/smartcontract.md
@@ -0,0 +1,406 @@
+ Java sdk 智能合约
+
+
+## 介绍
+
+这个章节介绍如何通过Java SDK使用智能合约。
+
+## 智能合约部署、调用、事件推送
+
+> Note:目前java-sdk支持neo和WASM智能合约部署和调用,NEO和WASM合约部署和调用方法不同,见下面详解:
+
+
+### 部署
+
+通过[SmartX]()编译智能合约,可以在SmartX上直接部署合约,也可以通过java sdk部署合约。
+
+```java
+InputStream is = new FileInputStream("/Users/sss/dev/test/IdContract/IdContract.avm");
+byte[] bys = new byte[is.available()];
+is.read(bys);
+is.close();
+code = Helper.toHexString(bys);
+dnaSdk.setCodeAddress(Address.AddressFromVmCode(code).toHexString());
+
+//部署合约
+Transaction tx = dnaSdk.vm().makeDeployCodeTransaction(code, true, "name",
+ "v1.0", "author", "email", "desp", account.getAddressU160().toBase58(),dnaSdk.DEFAULT_DEPLOY_GAS_LIMIT,500);
+String txHex = Helper.toHexString(tx.toArray());
+dnaSdk.getConnect().sendRawTransaction(txHex);
+//等待出块
+Thread.sleep(6000);
+DeployCodeTransaction t = (DeployCodeTransaction) dnaSdk.getConnect().getTransaction(txHex);
+```
+
+**DeployCode**
+
+```java
+public DeployCode makeDeployCodeTransaction(String codeStr, boolean needStorage, String name, String codeVersion, String author, String email, String desp,String payer,long gaslimit,long gasprice)
+
+```
+
+| 参数 | 字段 | 类型 | 描述 | 说明 |
+| ----- | ------- | ------ | ------------- | ----------- |
+| 输入参数 | codeHexStr| String | 合约code十六进制字符串 | 必选 |
+| | needStorage | Boolean | 是否需要存储 | 必选 |
+| | name | String | 名字 | 必选|
+| | codeVersion | String | 版本 | 必选 |
+| | author | String | 作者 | 必选 |
+| | email | String | emal | 必选 |
+| | desp | String | 描述信息 | 必选 |
+| | VmType | byte | 虚拟机类型 | 必选 |
+| | payer | String | 支付交易费用的账户地址 | 必选 |
+| | gaslimit | long | gaslimit | 必选 |
+| | gasprice | long | gas价格 | 必选 |
+| 输出参数 | tx | Transaction | 交易实例 | |
+
+
+**DeployWasmCode**
+
+```java
+DeployWasmCode tx = dnaSdk.wasmvm().makeDeployCodeTransaction(code, "helloWorld", "1.0", "NashMiao",
+ "wdx7266@vip.qq.com", "wasm contract for java sdk test", payer.getAddressU160(),
+ 500, 25000000);
+
+```
+
+### 调用
+
+#### NEO智能合约调用
+
+* 基本流程:
+
+ 1. 构造调用智能合约调用参数;
+ 2. 构造交易;
+ 3. 交易签名(预执行不需要签名);
+ 4. 发送交易。
+
+* 示例
+
+```java
+
+List paramList = new ArrayList<>();
+paramList.add("testHello".getBytes());
+
+List args = new ArrayList();
+args.add(true);
+args.add(100);
+args.add("test".getBytes());
+args.add("test");
+args.add(account.getAddressU160().toArray());
+
+paramList.add(args);
+byte[] params = BuildParams.createCodeParamsScript(paramList);
+
+String result = invokeContract(params, account, 20000, 500,true);
+System.out.println(result);
+
+public static String invokeContract(byte[] params, Account payerAcct, long gaslimit, long gasprice, boolean preExec) throws Exception{
+ if(payerAcct == null){
+ throw new SDKException("params should not be null");
+ }
+ if(gaslimit < 0 || gasprice< 0){
+ throw new SDKException("gaslimit or gasprice should not be less than 0");
+ }
+ Transaction tx = dnaSdk.vm().makeInvokeCodeTransaction(Helper.reverse(contractAddress),null,params,payerAcct.getAddressU160().toBase58(),gaslimit,gasprice);
+ dnaSdk.addSign(tx, payerAcct);
+ Object result = null;
+ if(preExec) {
+ result = dnaSdk.getConnect().sendRawTransactionPreExec(tx.toHexString());
+ }else {
+ result = dnaSdk.getConnect().sendRawTransaction(tx.toHexString());
+ return tx.hash().toString();
+ }
+ return result.toString();
+}
+```
+
+
+
+#### WASM智能合约调用
+
+* 基本流程:
+ 1. 构造调用合约中的方法需要的参数;
+ 2. 构造交易;
+ 3. 交易签名(如果是预执行不需要签名);
+ 4. 发送交易。
+
+* 示例:
+
+```java
+String contractHash = "bf8ee176c360f7a77b9c45b6faab213bc50eaf5d";
+List