package io.bytom.api;
+import io.bytom.common.Utils;
import io.bytom.types.*;
+
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
public BaseInput() {}
- public abstract InputEntry convertInputEntry(Map<Hash, Entry> entryMap, int index);
- public abstract byte[] serializeInput() throws IOException;
+ public abstract InputEntry toInputEntry(Map<Hash, Entry> entryMap, int index);
public abstract void buildWitness(String txID) throws Exception;
+ public abstract byte[] serializeInputCommitment() throws IOException;
+ public abstract byte[] serializeInputWitness() throws IOException;
+
+ public byte[] serializeInput() throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ // assert version
+ Utils.writeVarint(1, stream);
+ Utils.writeExtensibleString(serializeInputCommitment(), stream);
+ Utils.writeExtensibleString(serializeInputWitness(), stream);
+ return stream.toByteArray();
+ }
+
public void validate() {
if (assetId == null) {
}
@Override
- public InputEntry convertInputEntry(Map<Hash, Entry> entryMap, int index) {
+ public InputEntry toInputEntry(Map<Hash, Entry> entryMap, int index) {
if (this.nonce == null) {
SecureRandom sr = new SecureRandom();
byte[] randBytes = new byte[8];
Hash assetDefHash = new Hash(this.rawAssetDefinition);
AssetAmount value = this.getAssetAmount();
- Program pro = new Program(this.getVmVersion(), Hex.decode(this.getProgram()));
- return new Issue(nonceHash, value, index, new AssetDefinition(assetDefHash, pro));
- }
-
- @Override
- public byte[] serializeInput() throws IOException {
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- //assetVersion
- Utils.writeVarint(1, stream);
-
- ByteArrayOutputStream issueInfo = new ByteArrayOutputStream();
- Utils.writeVarint(ISSUANCE_INPUT_TYPE, issueInfo);
- Utils.writeVarStr(Hex.decode(nonce), issueInfo);
- issueInfo.write(Hex.decode(getAssetId()));
- Utils.writeVarint(getAmount(), issueInfo);
- stream.write(issueInfo.toByteArray().length);
- stream.write(issueInfo.toByteArray());
-
- ByteArrayOutputStream issueInfo1 = new ByteArrayOutputStream();
- Utils.writeVarint(1, issueInfo1);
- Utils.writeVarStr(Hex.decode(rawAssetDefinition), issueInfo1);
- // vm version
- Utils.writeVarint(1, issueInfo1);
- Utils.writeVarStr(Hex.decode(getProgram()), issueInfo1);
-
- //inputWitness
- ByteArrayOutputStream witnessStream = new ByteArrayOutputStream();
- //arguments
- int witnessSize = witnessComponent.size();
- //arguments的length
- Utils.writeVarint(witnessSize, witnessStream);
- for (int i = 0; i < witnessSize; i++) {
- String witness = witnessComponent.getWitness(i);
- Utils.writeVarStr(Hex.decode(witness), witnessStream);
- }
- issueInfo1.write(witnessStream.toByteArray());
- stream.write(issueInfo1.toByteArray().length - 1);
- stream.write(issueInfo1.toByteArray());
- return stream.toByteArray();
+ Program program = new Program(this.getVmVersion(), Hex.decode(this.getProgram()));
+ return new Issue(nonceHash, value, index, new AssetDefinition(assetDefHash, program));
}
@Override
}
@Override
+ 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()));
+ Utils.writeVarint(getAmount(), stream);
+ return stream.toByteArray();
+ }
+
+ @Override
+ public byte[] serializeInputWitness() throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Utils.writeVarStr(Hex.decode(rawAssetDefinition), stream);
+ // vm version
+ Utils.writeVarint(1, stream);
+ Utils.writeVarStr(Hex.decode(getProgram()), stream);
+ Utils.writeVarList(witnessComponent.toByteArray(), stream);
+ return new byte[0];
+ }
+
+ @Override
public void validate() {
super.validate();
if (nonce == null) {
//controlProgram
Utils.writeVarStr(Hex.decode(controlProgram), outputCommitSteam);
- byte[] dataOutputCommit = outputCommitSteam.toByteArray();
- //outputCommit的length
- Utils.writeVarint(dataOutputCommit.length, stream);
- stream.write(dataOutputCommit);
+ Utils.writeExtensibleString(outputCommitSteam.toByteArray(), stream);
//outputWitness
Utils.writeVarint(0, stream);
}
@Override
- public InputEntry convertInputEntry(Map<Hash, Entry> entryMap, int index) {
+ public InputEntry toInputEntry(Map<Hash, Entry> entryMap, int index) {
Program pro = new Program(this.getVmVersion(), Hex.decode(this.getProgram()));
AssetAmount assetAmount = this.getAssetAmount();
Hash sourceID = new Hash(this.sourceID);
ValueSource src = new ValueSource(sourceID, assetAmount, this.sourcePosition);
- OutputEntry prevout = new OutputEntry(src, pro, 0);
- Hash prevOutID = prevout.entryID();
- entryMap.put(prevOutID, prevout);
+ OutputEntry prevOut = new OutputEntry(src, pro, 0);
+ Hash prevOutID = prevOut.entryID();
+ entryMap.put(prevOutID, prevOut);
return new Spend(prevOutID, index);
}
@Override
- public byte[] serializeInput() throws IOException {
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- //assetVersion
- Utils.writeVarint(1, stream); //AssetVersion是否默认为1
-
- //inputCommitment
- ByteArrayOutputStream inputCommitStream = new ByteArrayOutputStream();
- //spend type flag
- Utils.writeVarint(SPEND_INPUT_TYPE, inputCommitStream);
- //spendCommitment
- ByteArrayOutputStream spendCommitSteam = new ByteArrayOutputStream();
- spendCommitSteam.write(Hex.decode(sourceID)); //计算muxID
- spendCommitSteam.write(Hex.decode(getAssetId()));
- Utils.writeVarint(getAmount(), spendCommitSteam);
- //sourcePosition
- Utils.writeVarint(sourcePosition, spendCommitSteam); //db中获取position
- //vmVersion
- Utils.writeVarint(1, spendCommitSteam); //db中获取vm_version
- //controlProgram
- Utils.writeVarStr(Hex.decode(getProgram()), spendCommitSteam);
-
- byte[] dataSpendCommit = spendCommitSteam.toByteArray();
-
- Utils.writeVarint(dataSpendCommit.length, inputCommitStream);
- inputCommitStream.write(dataSpendCommit);
- byte[] dataInputCommit = inputCommitStream.toByteArray();
- //inputCommit的length
- Utils.writeVarint(dataInputCommit.length, stream);
- stream.write(dataInputCommit);
-
- //inputWitness
- ByteArrayOutputStream witnessStream = new ByteArrayOutputStream();
- //arguments
- int witnessSize = witnessComponent.size();
- //arguments的length
- Utils.writeVarint(witnessSize, witnessStream);
- for (int i = 0; i < witnessSize; i++) {
- String witness = witnessComponent.getWitness(i);
- Utils.writeVarStr(Hex.decode(witness), witnessStream);
- }
- byte[] dataWitnessComponents = witnessStream.toByteArray();
- //witness的length
- Utils.writeVarint(dataWitnessComponents.length, stream);
- stream.write(dataWitnessComponents);
- return stream.toByteArray();
- }
-
- @Override
public void buildWitness(String txID) throws Exception {
String rootPrvKey = witnessComponent.getRootPrivateKey();
}
@Override
+ public byte[] serializeInputCommitment() throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Utils.writeVarint(SPEND_INPUT_TYPE, stream);
+
+ ByteArrayOutputStream spendCommitSteam = new ByteArrayOutputStream();
+ spendCommitSteam.write(Hex.decode(sourceID));
+ spendCommitSteam.write(Hex.decode(getAssetId()));
+ Utils.writeVarint(getAmount(), spendCommitSteam);
+ Utils.writeVarint(sourcePosition, spendCommitSteam);
+ // vm version
+ Utils.writeVarint(1, spendCommitSteam);
+ Utils.writeVarStr(Hex.decode(getProgram()), spendCommitSteam);
+ Utils.writeExtensibleString(spendCommitSteam.toByteArray(), stream);
+ return stream.toByteArray();
+ }
+
+ @Override
+ public byte[] serializeInputWitness() throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ Utils.writeVarList(witnessComponent.toByteArray(), stream);
+ return stream.toByteArray();
+ }
+
+ @Override
public void validate() {
super.validate();
if (sourceID == null) {
try {\r
for (int i = 0; i < inputs.size(); i++) {\r
BaseInput input = inputs.get(i);\r
- InputEntry inputEntry = input.convertInputEntry(entryMap, i);\r
+ InputEntry inputEntry = input.toInputEntry(entryMap, i);\r
Hash spendID = addEntry(entryMap, inputEntry);\r
input.setInputID(spendID.toString());\r
\r
package io.bytom.api;
+import org.bouncycastle.util.encoders.Hex;
+
import java.util.ArrayList;
import java.util.List;
witnesses = new ArrayList<>();
}
- public int size() {
- return witnesses.size();
+ public byte[][] toByteArray() {
+ byte[][] byteArray = new byte[witnesses.size()][];
+ for (int i = 0; i < witnesses.size(); i++) {
+ byteArray[i] = Hex.decode(witnesses.get(i));
+ }
+ return byteArray;
}
public String getWitness(int index) {
+++ /dev/null
-package io.bytom.common;\r
-\r
-import java.io.FileNotFoundException;\r
-import java.io.IOException;\r
-import java.util.Properties;\r
-\r
-public class Configuration {\r
-\r
- private static Properties props = new Properties();\r
-\r
- static {\r
- try {\r
- props.load(Thread.currentThread().getContextClassLoader()\r
- .getResourceAsStream("config.properties"));\r
- } catch (FileNotFoundException e) {\r
- e.printStackTrace();\r
- } catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
-\r
- public static String getValue(String key) {\r
- return props.getProperty(key);\r
- }\r
-\r
- public static void updateProperties(String key, String value) {\r
- props.setProperty(key, value);\r
- }\r
-\r
-}\r
+++ /dev/null
-package io.bytom.common;\r
-\r
-import com.google.gson.annotations.SerializedName;\r
-\r
-public class SuccessRespon<T> {\r
- public String status;\r
- @SerializedName("data")\r
- public T dataObject;\r
-}\r
return n + (buf.length);\r
}\r
\r
+ public static int writeVarList(byte[][] list, ByteArrayOutputStream stream) throws IOException {\r
+ int n = writeVarint(list.length, stream);\r
+ for (byte[] bytes : list) {\r
+ n += writeVarStr(bytes, stream);\r
+ }\r
+ return n;\r
+ }\r
+\r
+ public static int writeExtensibleString(byte[] bytes, ByteArrayOutputStream stream) throws IOException {\r
+ int n = writeVarint(bytes.length, stream);\r
+ stream.write(bytes);\r
+ return n + bytes.length;\r
+ }\r
+\r
public static int getLengthVarInt(long x) {\r
byte[] varint = new byte[9];\r
int n = putUvarint(varint, x);\r