diff --git a/java-sdk/README.md b/java-sdk/README.md
index f2984a6..cf062b5 100644
--- a/java-sdk/README.md
+++ b/java-sdk/README.md
@@ -7,23 +7,6 @@ at [Bytom wiki](https://github.com/Bytom/bytom/wiki/API-Reference)
## Installation
-There are various ways to install and use this sdk. We'll provide three ways to get it. Note that the bytom-sdk requires JAVA 7 or newer.
-
-### Apache Maven
-
-```xml
-
- io.bytom
- java-sdk
- 1.0.2
-
-```
-
-### Gradle/Grails
-```xml
-compile 'io.bytom:bytom-sdk:1.0.2'
-```
-
### Building from source code
To clone, compile, and install in your local maven repository (or copy the artifacts from the target/ directory to wherever you need them):
@@ -62,7 +45,7 @@ Client client = Client.generateClient();
* [`Secondly sign the transaction`](#secondly-sign-the-transaction)
* [`Finally submit the transaction`](#finally-submit-the-transaction)
-> For more details, see [API methods](https://github.com/Bytom/java-sdk/blob/master/doc/index.md#api-methods)
+> For more details, see [API methods](https://github.com/Bytom/bytom-java-sdk/blob/master/java-sdk/doc/index.md#api-methods)
### Create a key
@@ -113,7 +96,7 @@ receiverAsset = builder.create(client);
### Issue asset
-For more transaction details, see [transactions](https://github.com/Bytom/java-sdk/blob/master/doc/transactions.md)
+For more transaction details, see [transactions](https://github.com/Bytom/bytom-java-sdk/blob/master/java-sdk/doc/transactions.md)
#### Firstly build the transaction
diff --git a/java-sdk/src/main/java/io/bytom/api/Account.java b/java-sdk/src/main/java/io/bytom/api/Account.java
index c84e526..a62d090 100644
--- a/java-sdk/src/main/java/io/bytom/api/Account.java
+++ b/java-sdk/src/main/java/io/bytom/api/Account.java
@@ -71,12 +71,25 @@ public static List list(Client client) throws BytomException {
/**
* delete-account
* @param client client object that makes requests to the core
- * @param account_info account_info
+ * @param account_alias account_alias
* @throws BytomException BytomException
*/
- public static void delete(Client client, String account_info) throws BytomException {
+ public static void deleteByAccountAlias(Client client, String account_alias) throws BytomException {
Map req = new HashMap<>();
- req.put("account_info", account_info);
+ req.put("account_alias", account_alias);
+ client.request("delete-account", req);
+ }
+
+ /**
+ * delete-account
+ * @param client client object that makes requests to the core
+ * @param account_id account_id
+ * @throws BytomException BytomException
+ */
+
+ public static void deleteByAccountID(Client client,String account_id) throws BytomException {
+ Map req = new HashMap<>();
+ req.put("account_id", account_id);
client.request("delete-account", req);
}
@@ -214,8 +227,8 @@ public static class Address {
@SerializedName("change")
public Boolean change;
- @SerializedName("vaild")
- public Boolean vaild;
+ @SerializedName("valid")
+ public Boolean valid;
@SerializedName("is_local")
public Boolean is_local;
diff --git a/java-sdk/src/main/java/io/bytom/api/Block.java b/java-sdk/src/main/java/io/bytom/api/Block.java
index 3af14dc..0d6817e 100644
--- a/java-sdk/src/main/java/io/bytom/api/Block.java
+++ b/java-sdk/src/main/java/io/bytom/api/Block.java
@@ -7,7 +7,6 @@
import org.apache.log4j.Logger;
import java.util.List;
-import java.util.Map;
public class Block {
@@ -24,18 +23,9 @@ public class Block {
public Integer timestamp;
- public Integer nonce;
-
- public long bits;
-
- public String difficulty;
-
@SerializedName("transaction_merkle_root")
public String transactionsMerkleRoot;
- @SerializedName("transaction_status_hash")
- public String transactionStatusHash;
-
public List transactions;
@@ -133,40 +123,6 @@ public BlockHeader getBlockHeader(Client client) throws BytomException {
return blockHeader;
}
- /**
- * Call get-difficulty api
- *
- * @param client
- * @return
- * @throws BytomException
- */
- public BlockDifficulty getBlockDifficulty(Client client) throws BytomException {
- BlockDifficulty blockDifficulty =
- client.request("get-difficulty", this, BlockDifficulty.class);
-
- logger.info("get-difficulty:");
- logger.info(blockDifficulty.toJson());
-
- return blockDifficulty;
- }
-
- /**
- * Call get-hash-rate api
- *
- * @param client
- * @return
- * @throws BytomException
- */
- public BlockHashRate getHashRate(Client client) throws BytomException {
- BlockHashRate blockHashRate =
- client.request("get-hash-rate", this, BlockHashRate.class);
-
- logger.info("get-hash-rate:");
- logger.info(blockHashRate.toJson());
-
- return blockHashRate;
- }
-
}
public static class BlockHeader {
@@ -183,27 +139,4 @@ public String toJson() {
}
- public static class BlockDifficulty {
- public String hash;
- public Integer height;
- public Integer bits;
- public String difficulty;
-
- public String toJson() {
- return Utils.serializer.toJson(this);
- }
-
-
- }
-
- public static class BlockHashRate {
- public String hash;
- public Integer height;
- public Integer hash_rate;
-
- public String toJson() {
- return Utils.serializer.toJson(this);
- }
-
- }
}
diff --git a/java-sdk/src/main/java/io/bytom/api/CoreConfig.java b/java-sdk/src/main/java/io/bytom/api/CoreConfig.java
index 3334773..babbf92 100644
--- a/java-sdk/src/main/java/io/bytom/api/CoreConfig.java
+++ b/java-sdk/src/main/java/io/bytom/api/CoreConfig.java
@@ -60,22 +60,22 @@ public static class NetInfo {
public boolean mining;
/**
- * peer_count, current count of connected peers.
+ * nodeXPub, the node xpub.
*/
- @SerializedName("peer_count")
- public int peerCount;
+ @SerializedName("node_xpub")
+ public String nodeXPub;
/**
- * current_block, current block height in the node's blockchain.
+ * peer_count, current count of connected peers.
*/
- @SerializedName("current_block")
- public long currentBlock;
+ @SerializedName("peer_count")
+ public int peerCount;
/**
- * highest_block, current highest block of the connected peers.
+ * highest_height, current highest block of the connected peers.
*/
- @SerializedName("highest_block")
- public long highestBlock;
+ @SerializedName("highest_height")
+ public long highestHeight;
/**
* network_id, network id.
@@ -93,4 +93,62 @@ public String toJson() {
return Utils.serializer.toJson(this);
}
}
+
+ /**
+ * Call chain-status api
+ *
+ * @param client
+ * @return
+ * @throws BytomException
+ */
+ public static ChainStatus getChainStatus(Client client) throws BytomException {
+ ChainStatus chainStatus = client.request("chain-status", null, ChainStatus.class);
+
+ logger.info("chain-status:");
+ logger.info(chainStatus.toJson());
+
+ return chainStatus;
+ }
+
+ public static class ChainStatus {
+ /**
+ * current_height, current block height in the node's blockchain.
+ */
+ @SerializedName("current_height")
+ public long currentHeight;
+
+ /**
+ * current_hash, current block hash in the node's blockchain.
+ */
+ @SerializedName("current_hash")
+ public String currentHash;
+
+ /**
+ * finalized_height, finalized block height in the node's blockchain.
+ */
+ @SerializedName("finalized_height")
+ public long finalizedHeight;
+
+ /**
+ * finalized_hash, finalized block hash in the node's blockchain.
+ */
+ @SerializedName("finalized_hash")
+ public String finalizedHash;
+
+ /**
+ * justified_height, justified block height in the node's blockchain.
+ */
+ @SerializedName("justified_height")
+ public long justifiedHeight;
+
+ /**
+ * justified_hash, justified block hash in the node's blockchain.
+ */
+ @SerializedName("justified_hash")
+ public String justifiedHash;
+
+ public String toJson() {
+ return Utils.serializer.toJson(this);
+ }
+ }
}
diff --git a/java-sdk/src/main/java/io/bytom/api/Transaction.java b/java-sdk/src/main/java/io/bytom/api/Transaction.java
index 42accee..d6b6155 100644
--- a/java-sdk/src/main/java/io/bytom/api/Transaction.java
+++ b/java-sdk/src/main/java/io/bytom/api/Transaction.java
@@ -47,12 +47,6 @@ public class Transaction {
@SerializedName("block_height")
public int blockHeight;
- /**
- * whether the state of the request has failed.
- */
- @SerializedName("status_fail")
- public boolean statusFail;
-
/**
* List of specified inputs for a transaction.
*/
@@ -106,6 +100,11 @@ public Template build(Client client) throws BytomException {
return client.request("build-transaction", this, Template.class);
}
+ public List buildChainTx(Client client) throws BytomException {
+ Type listType = new ParameterizedTypeImpl(List.class, new Class[]{Template.class});
+ return client.request("build-chain-transactions", this, listType);
+ }
+
/**
* Default constructor initializes actions list.
*/
@@ -275,7 +274,6 @@ public Template sign(Client client, Template template,
return templateResult;
}
-
}
/**
diff --git a/java-sdk/src/test/java/io/bytom/integration/AccessTokenTest.java b/java-sdk/src/test/java/io/bytom/integration/AccessTokenTest.java
index 49930b9..7fe067b 100644
--- a/java-sdk/src/test/java/io/bytom/integration/AccessTokenTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/AccessTokenTest.java
@@ -33,7 +33,13 @@ public void testTokenList() throws Exception {
@Test
public void testTokenCheck() throws Exception {
- String secret = "5e37378eb59de6b10e60f2247ebf71c4955002e75e0cd31ede3bf48813a0a799";
+ String secret = "dad13ed9f34ffd063cd34abb2320fbbb5c768db4588e319f4444109944b65218";
AccessToken.check(client, "sheng", secret);
}
+
+ @Test
+ public void testDeleteCheck() throws Exception {
+ String secret = "dad13ed9f34ffd063cd34abb2320fbbb5c768db4588e319f4444109944b65218";
+ AccessToken.delete(client, "sheng");
+ }
}
diff --git a/java-sdk/src/test/java/io/bytom/integration/AccountTest.java b/java-sdk/src/test/java/io/bytom/integration/AccountTest.java
index d8314f2..cdc9dfe 100644
--- a/java-sdk/src/test/java/io/bytom/integration/AccountTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/AccountTest.java
@@ -26,10 +26,6 @@ public void testAccountCreate() throws Exception {
List root_xpubs = new ArrayList<>();
root_xpubs.add("c4b25825e92cd8623de4fd6a35952ad0efb2ed215fdb1b40754f0ed12eff7827d147d1e8b003601ba2f78a4a84dcc77e93ed282633f2679048c5d5ac5ea10cb5");
-
-// Key.Builder builder = new Key.Builder().setAlias(alias).setPassword(password);
-// key = Key.create(client, builder);
-
Account.Builder builder = new Account.Builder().setAlias(alias).setQuorum(quorum).setRootXpub(root_xpubs);
account = Account.create(client, builder);
@@ -47,9 +43,9 @@ public void testAccountList() throws Exception {
public void testAccountDelete() throws Exception {
client = TestUtils.generateClient();
List accountList = Account.list(client);
- String alias = accountList.get(accountList.size()-1).alias;
+ Account lastAccount = accountList.get(accountList.size()-1);
//delete the last Account Object
- Account.delete(client, alias);
+ Account.deleteByAccountAlias(client, lastAccount.alias);
}
@Test
diff --git a/java-sdk/src/test/java/io/bytom/integration/BlockTest.java b/java-sdk/src/test/java/io/bytom/integration/BlockTest.java
index 71b8e3f..ece24e6 100644
--- a/java-sdk/src/test/java/io/bytom/integration/BlockTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/BlockTest.java
@@ -23,19 +23,17 @@ public class BlockTest {
static Block block;
static Block.BlockHeader blockHeader;
- static Block.BlockDifficulty blockDifficulty;
- static Block.BlockHashRate blockHashRate;
@Test
public void testBlockCountGet() throws Exception {
int count = Block.getBlockCount(client);
- Assert.assertEquals(158, count);
+ System.out.println(count);
}
@Test
public void testBlockHashGet() throws Exception {
String blockHash = Block.getBlockHash(client);
- Assert.assertNotNull(blockHash);
+ System.out.println(blockHash);
}
@Test
@@ -59,27 +57,4 @@ public void testBlockHeader() throws Exception {
.setBlockHash(blockHash)
.getBlockHeader(client);
}
-
- @Test
- public void testBlockDifficulty() throws Exception {
- int height = Block.getBlockCount(client);
- String blockHash = Block.getBlockHash(client);
-
- blockDifficulty = new Block.QueryBuilder()
- .setBlockHeight(height)
- .setBlockHash(blockHash)
- .getBlockDifficulty(client);
- }
-
- @Test
- public void testBlockHashRate() throws Exception {
- int height = Block.getBlockCount(client);
- String blockHash = Block.getBlockHash(client);
-
- blockHashRate = new Block.QueryBuilder()
- .setBlockHeight(height)
- .setBlockHash(blockHash)
- .getHashRate(client);
- }
-
}
diff --git a/java-sdk/src/test/java/io/bytom/integration/CoreConfigTest.java b/java-sdk/src/test/java/io/bytom/integration/CoreConfigTest.java
index d656da8..c7607b4 100644
--- a/java-sdk/src/test/java/io/bytom/integration/CoreConfigTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/CoreConfigTest.java
@@ -29,12 +29,16 @@ public void testNetInfo() throws Exception {
Assert.assertNotNull(netInfo);
}
+ @Test
+ public void testChainStatus() throws Exception {
+ CoreConfig.ChainStatus chainStatus = CoreConfig.getChainStatus(client);
+ Assert.assertNotNull(chainStatus);
+ }
+
@Test
public void testGasRate() throws Exception {
gasRate = CoreConfig.getGasRate(client);
Assert.assertNotNull(gasRate);
}
-
-
}
diff --git a/java-sdk/src/test/java/io/bytom/integration/KeyTest.java b/java-sdk/src/test/java/io/bytom/integration/KeyTest.java
index ec68a92..d173727 100644
--- a/java-sdk/src/test/java/io/bytom/integration/KeyTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/KeyTest.java
@@ -33,8 +33,7 @@ public void testClientKeyCreate() throws Exception {
@Test
public void testClientKeyList() throws Exception {
- //client = TestUtils.generateClient();
- client = new Client("http://127.0.0.1:9888/");
+ client = TestUtils.generateClient();
List keyList = Key.list(client);
}
diff --git a/java-sdk/src/test/java/io/bytom/integration/RawTransactionTest.java b/java-sdk/src/test/java/io/bytom/integration/RawTransactionTest.java
index a4b3960..b9b9489 100644
--- a/java-sdk/src/test/java/io/bytom/integration/RawTransactionTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/RawTransactionTest.java
@@ -25,7 +25,7 @@ public class RawTransactionTest {
@Test
public void testRawTxDecode() throws Exception {
- String rawTxId = "070100010161015f30e052cd50e385951936c08fb5642bd12b727da958960249ddad8c9a77e5371fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d59901000116001412a47b53b3bbdaf9f3510e1d8c19d69f81ca91426302405a8b5adebd2ab63ba1ac55a7bbadc1fe246806c37732df0442b827fa4e06058137711d9d012becdc9de507a8ad0de0dd50780c0503c0dcff2dc03d7592e31a08206e1efce70e2b29efa348aec7c148edc2beb72edc0d4422a03cfb0f40e6e4cfc602013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80d3bdc6980101160014a9c0ea4abe4d09546197bac3c86f4dd39fde1afb00013cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8084af5f011600144cc6edb1f4077c740e0201bb3688e6efba4a098c00";
+ String rawTxId = "070100010161015f4894fb81ee71b343a1990dae5655cb99d74abf99d16cf06aad6a3095865ccf9bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed8fcf5050001160014e933e5a0545c63ff2c28eaedb47c831cac3b16cf006302408b50ffb295d4571e320d3d28982e42ba61d939210be8b5dc4e0d5cd2f45f2b79fb06d98b6f6024208fe9194878e6824c70811f44a1f4fc911f37fd8604de05062006ec50c0c335cd6c4d06b08d12f89ca5af3bd099b159544d4c8818e7c9d6b8af0201003effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaeadaea30501160014e933e5a0545c63ff2c28eaedb47c831cac3b16cf000001003dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0d1894901160014d69556c7ae252fbcc38fd34a34a3ba21dd0537c10000";
rawTransaction = RawTransaction.decode(client, rawTxId);
Assert.assertNotNull(rawTransaction);
}
diff --git a/java-sdk/src/test/java/io/bytom/integration/TransactionTest.java b/java-sdk/src/test/java/io/bytom/integration/TransactionTest.java
index 180b12d..dc090b5 100644
--- a/java-sdk/src/test/java/io/bytom/integration/TransactionTest.java
+++ b/java-sdk/src/test/java/io/bytom/integration/TransactionTest.java
@@ -62,7 +62,7 @@ public void testGetAll() throws Exception {
logger.info("receiver-address:" + receiverAddress.toJson());
senderAsset = new Asset.QueryBuilder().list(client).get(0);
- receiverAsset = new Asset.QueryBuilder().list(client).get(1);
+ receiverAsset = new Asset.QueryBuilder().list(client).get(0);
logger.info("senderAsset:" + senderAsset.toJson());
logger.info("receiverAsset:" + receiverAsset.toJson());
}
diff --git a/tx-signer/README.md b/tx-signer/README.md
index 3d7abd8..407c34a 100755
--- a/tx-signer/README.md
+++ b/tx-signer/README.md
@@ -12,22 +12,7 @@ Java implementation of signing transaction offline.
```
git clone https://github.com/Bytom/bytom-java-sdk.git
- ```
-
-2. install to maven repository
-
- ```
- $ mvn clean install -DskipTests
- ```
-
-3. add dependency
- ```xml
-
- io.bytom
- tx-signer
- 1.0.2
-
- ```
+ ```
## Example
diff --git a/tx-signer/README_zh.md b/tx-signer/README_zh.md
index 524815e..05c5204 100644
--- a/tx-signer/README_zh.md
+++ b/tx-signer/README_zh.md
@@ -14,27 +14,6 @@
```
git clone https://github.com/Bytom/bytom-java-sdk.git
```
-
-2. 打包成JAR包并安装到本地的Maven仓库
-
- ```
- $ mvn clean install -DskipTests
- ```
-
-3. 在项目的POM文件中添加依赖。其中,第一个依赖是bytomd api的封装,可用于查询可用的utxo以及提交交易;第二个依赖用于构建交易以及对交易进行离线签名。
- ```xml
-
- io.bytom
- java-sdk
- 1.0.2
-
-
-
- io.bytom
- tx-signer
- 1.0.2
-
- ```
## 构建交易
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/BaseInput.java b/tx-signer/src/main/java/io/bytom/offline/api/BaseInput.java
index 6b909a7..bce8182 100644
--- a/tx-signer/src/main/java/io/bytom/offline/api/BaseInput.java
+++ b/tx-signer/src/main/java/io/bytom/offline/api/BaseInput.java
@@ -11,6 +11,8 @@ public abstract class BaseInput {
static final int ISSUANCE_INPUT_TYPE = 0;
static final int SPEND_INPUT_TYPE = 1;
+ static final int Coinbase_INPUT_TYPE = 2;
+ static final int Veto_INPUT_TYPE = 3;
static final byte AssetKeySpace = 0;
static final byte AccountKeySpace = 1;
@@ -52,7 +54,7 @@ public BaseInput() {}
public byte[] serializeInput() throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
- // assert version
+ // asset version
Utils.writeVarint(1, stream);
Utils.writeExtensibleString(serializeInputCommitment(), stream);
Utils.writeExtensibleString(serializeInputWitness(), stream);
@@ -133,4 +135,8 @@ public int getKeyIndex() {
public void setKeyIndex(int keyIndex) {
this.keyIndex = keyIndex;
}
+
+ public void appendWitnessComponent(String witness){
+ witnessComponent.appendWitness(witness);
+ }
}
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/BaseOutput.java b/tx-signer/src/main/java/io/bytom/offline/api/BaseOutput.java
new file mode 100644
index 0000000..e1d9f96
--- /dev/null
+++ b/tx-signer/src/main/java/io/bytom/offline/api/BaseOutput.java
@@ -0,0 +1,55 @@
+package io.bytom.offline.api;
+
+import io.bytom.offline.common.Utils;
+import io.bytom.offline.types.*;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+public abstract class BaseOutput {
+ /**
+ * The number of units of the asset being controlled.
+ */
+ private Long amount;
+
+ /**
+ * The id of the asset being controlled.
+ */
+ private String assetId;
+
+ /**
+ * The control program which must be satisfied to transfer this output.
+ */
+ private String controlProgram;
+
+ /**
+ * The id of the output.
+ */
+ private String id;
+
+ StateData stateData = new StateData();
+
+ public BaseOutput() {
+ }
+
+ public BaseOutput(String assetID, long amount, String controlProgram) {
+ this.assetId = assetID;
+ this.amount = amount;
+ this.controlProgram = controlProgram;
+ }
+
+
+ public abstract byte[] serializeOutputCommitment() throws IOException;
+
+
+ public byte[] serializeOutput() throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ // asset version
+ Utils.writeVarint(1, stream);
+ Utils.writeExtensibleString(serializeOutputCommitment(), stream);
+ return stream.toByteArray();
+ }
+
+}
\ No newline at end of file
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/CoinbaseInput.java b/tx-signer/src/main/java/io/bytom/offline/api/CoinbaseInput.java
new file mode 100644
index 0000000..27045a4
--- /dev/null
+++ b/tx-signer/src/main/java/io/bytom/offline/api/CoinbaseInput.java
@@ -0,0 +1,48 @@
+package io.bytom.offline.api;
+
+import io.bytom.offline.common.Utils;
+import io.bytom.offline.types.*;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+public class CoinbaseInput extends BaseInput{
+ private String arbitrary;
+
+ @Override
+ public InputEntry toInputEntry(Map entryMap, int index) {
+ Coinbase coinbase = new Coinbase(arbitrary);
+
+ Hash prevOutID = coinbase.entryID();
+ entryMap.put(prevOutID, coinbase);
+ return new Coinbase(prevOutID,index);
+ }
+
+ @Override
+ public void buildWitness(String txID) throws Exception {
+
+ }
+
+ @Override
+ public byte[] serializeInputCommitment() throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Utils.writeVarint(Coinbase_INPUT_TYPE, stream);
+ Utils.writeVarStr(Hex.decode(this.arbitrary),stream);
+ return stream.toByteArray();
+ }
+
+ @Override
+ public byte[] serializeInputWitness() throws IOException {
+ return new byte[0];
+ }
+
+ public String getArbitrary() {
+ return arbitrary;
+ }
+
+ public void setArbitrary(String arbitrary) {
+ this.arbitrary = arbitrary;
+ }
+}
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/IssuanceInput.java b/tx-signer/src/main/java/io/bytom/offline/api/IssuanceInput.java
index c3b4d16..b13f07b 100644
--- a/tx-signer/src/main/java/io/bytom/offline/api/IssuanceInput.java
+++ b/tx-signer/src/main/java/io/bytom/offline/api/IssuanceInput.java
@@ -5,6 +5,7 @@
import io.bytom.offline.common.Signer;
import io.bytom.offline.common.Utils;
import io.bytom.offline.types.*;
+import io.bytom.offline.util.AssetIdUtil;
import io.bytom.offline.util.SHA3Util;
import org.bouncycastle.util.encoders.Hex;
import java.io.ByteArrayOutputStream;
@@ -18,7 +19,15 @@ public class IssuanceInput extends BaseInput {
private String rawAssetDefinition;
- public IssuanceInput() {}
+ public IssuanceInput(){
+
+ }
+
+ public IssuanceInput(String rawAssetDefinition,String issuanceProgram) {
+ this.rawAssetDefinition = rawAssetDefinition;
+ this.setProgram(issuanceProgram);
+ this.setAssetId(AssetIdUtil.computeAssetID(rawAssetDefinition,issuanceProgram));
+ }
public IssuanceInput(String assetID, Long amount, String issuanceProgram) {
this.setAssetId(assetID);
@@ -66,7 +75,10 @@ public byte[] serializeInputCommitment() throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Utils.writeVarint(ISSUANCE_INPUT_TYPE, stream);
Utils.writeVarStr(Hex.decode(nonce), stream);
- stream.write(Hex.decode(getAssetId()));
+ if (this.getAssetId()==null){
+ this.setAssetId(AssetIdUtil.computeAssetID(rawAssetDefinition,this.getProgram()));
+ }
+ stream.write(Hex.decode(this.getAssetId()));
Utils.writeVarint(getAmount(), stream);
return stream.toByteArray();
}
@@ -84,13 +96,16 @@ public byte[] serializeInputWitness() throws IOException {
@Override
public void validate() {
- super.validate();
if (nonce == null) {
throw new IllegalArgumentException("the nonce of issuance input must be specified.");
}
if (rawAssetDefinition == null) {
throw new IllegalArgumentException("the nonce of issuance input must be specified.");
}
+
+ if (this.getProgram() == null) {
+ throw new IllegalArgumentException("the program of issuance must be specified.");
+ }
}
public String getNonce() {
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/Output.java b/tx-signer/src/main/java/io/bytom/offline/api/OriginalOutput.java
similarity index 73%
rename from tx-signer/src/main/java/io/bytom/offline/api/Output.java
rename to tx-signer/src/main/java/io/bytom/offline/api/OriginalOutput.java
index 8f7a2b0..b95c5b6 100644
--- a/tx-signer/src/main/java/io/bytom/offline/api/Output.java
+++ b/tx-signer/src/main/java/io/bytom/offline/api/OriginalOutput.java
@@ -2,12 +2,12 @@
import io.bytom.offline.common.Utils;
import io.bytom.offline.common.VMUtil;
+import io.bytom.offline.util.AssetIdUtil;
import org.bouncycastle.util.encoders.Hex;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-public class Output {
-
+public class OriginalOutput {
/**
* The number of units of the asset being controlled.
*/
@@ -28,27 +28,28 @@ public class Output {
*/
private String id;
- /**
- * The output's position in a transaction's list of outputs.
- */
- private Integer position;
+ StateData stateData = new StateData();
+
+ public OriginalOutput() {
+ }
- public Output(String assetID, long amount, String controlProgram) {
+ public OriginalOutput(String assetID, long amount, String controlProgram) {
this.assetId = assetID;
this.amount = amount;
this.controlProgram = controlProgram;
}
- public static Output newRetireOutput(String assetID, long amount, String arbitrary) {
- String retireProgram = Hex.toHexString(new byte[]{VMUtil.OP_FAIL}) + Hex.toHexString(VMUtil.pushDataBytes(Hex.decode(arbitrary)));
- return new Output(assetID, amount, retireProgram);
+ public OriginalOutput(String rawAssetDefinition,String program) {
+ this.assetId = AssetIdUtil.computeAssetID(rawAssetDefinition,program);
+ this.controlProgram = program;
}
public byte[] serializeOutput() throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
-
- //assetVersion
- Utils.writeVarint(1, stream); //AssetVersion是否默认为1
+ // asset version
+ Utils.writeVarint(1, stream);
+ //outputType
+ Utils.writeVarint(0, stream); //outputType
//outputCommit
ByteArrayOutputStream outputCommitSteam = new ByteArrayOutputStream();
//assetId
@@ -59,6 +60,8 @@ public byte[] serializeOutput() throws IOException {
Utils.writeVarint(1, outputCommitSteam); //db中获取vm_version
//controlProgram
Utils.writeVarStr(Hex.decode(controlProgram), outputCommitSteam);
+ //stateData
+ Utils.writeVarList(this.stateData.toByteArray(), outputCommitSteam);
Utils.writeExtensibleString(outputCommitSteam.toByteArray(), stream);
@@ -67,6 +70,7 @@ public byte[] serializeOutput() throws IOException {
return stream.toByteArray();
}
+
public Long getAmount() {
return amount;
}
@@ -99,11 +103,7 @@ public void setId(String id) {
this.id = id;
}
- public Integer getPosition() {
- return position;
- }
-
- public void setPosition(Integer position) {
- this.position = position;
+ public void appendStateData(String stateDataStr){
+ stateData.appendStateData(stateDataStr);
}
}
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/SpendInput.java b/tx-signer/src/main/java/io/bytom/offline/api/SpendInput.java
index 0a11c32..1803cde 100644
--- a/tx-signer/src/main/java/io/bytom/offline/api/SpendInput.java
+++ b/tx-signer/src/main/java/io/bytom/offline/api/SpendInput.java
@@ -19,6 +19,8 @@ public class SpendInput extends BaseInput {
private BIPProtocol bipProtocol = BIPProtocol.BIP44;
+ StateData stateData = new StateData();
+
public SpendInput() {}
public SpendInput(String assetID, long amount, String controlProgram) {
@@ -40,7 +42,7 @@ public InputEntry toInputEntry(Map entryMap, int index) {
Hash sourceID = new Hash(this.sourceID);
ValueSource src = new ValueSource(sourceID, assetAmount, this.sourcePosition);
- OutputEntry prevOut = new OutputEntry(src, pro, 0);
+ Output prevOut = new Output(src, pro, 0,stateData.toByteArray());
Hash prevOutID = prevOut.entryID();
entryMap.put(prevOutID, prevOut);
return new Spend(prevOutID, index);
@@ -82,6 +84,7 @@ public byte[] serializeInputCommitment() throws IOException {
// vm version
Utils.writeVarint(1, spendCommitSteam);
Utils.writeVarStr(Hex.decode(getProgram()), spendCommitSteam);
+ Utils.writeVarList(stateData.toByteArray(), spendCommitSteam);
Utils.writeExtensibleString(spendCommitSteam.toByteArray(), stream);
return stream.toByteArray();
}
@@ -129,4 +132,8 @@ public void setControlProgramIndex(int controlProgramIndex) {
public void setBipProtocol(BIPProtocol bipProtocol) {
this.bipProtocol = bipProtocol;
}
+
+ public void appendStateData(String stateDataStr){
+ stateData.appendStateData(stateDataStr);
+ }
}
\ No newline at end of file
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/StateData.java b/tx-signer/src/main/java/io/bytom/offline/api/StateData.java
new file mode 100644
index 0000000..692dbd9
--- /dev/null
+++ b/tx-signer/src/main/java/io/bytom/offline/api/StateData.java
@@ -0,0 +1,26 @@
+package io.bytom.offline.api;
+
+import org.bouncycastle.util.encoders.Hex;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class StateData {
+ private List stateData;
+
+ public StateData() {
+ stateData = new ArrayList<>();
+ }
+
+ public byte[][] toByteArray() {
+ byte[][] byteArray = new byte[stateData.size()][];
+ for (int i = 0; i < stateData.size(); i++) {
+ byteArray[i] = Hex.decode(stateData.get(i));
+ }
+ return byteArray;
+ }
+
+ public void appendStateData(String stateDataStr) {
+ stateData.add(stateDataStr);
+ }
+}
diff --git a/tx-signer/src/main/java/io/bytom/offline/api/Transaction.java b/tx-signer/src/main/java/io/bytom/offline/api/Transaction.java
index 8798307..9165848 100755
--- a/tx-signer/src/main/java/io/bytom/offline/api/Transaction.java
+++ b/tx-signer/src/main/java/io/bytom/offline/api/Transaction.java
@@ -41,7 +41,7 @@ public class Transaction {
/**
* List of specified outputs for a transaction.
*/
- private List