diff --git a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java index cf791421..c183d8df 100644 --- a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java +++ b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java @@ -30,9 +30,9 @@ public enum PrimitiveType { INT64((byte) (DataType.NUMERIC | 0x04)), /** - * 日期时间; + * 时间戳; */ - DATETIME((byte) (DataType.NUMERIC | 0x08)), + TIMESTAMP((byte) (DataType.NUMERIC | 0x08)), /** * 文本数据; diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java index 2a0202c4..2e025bf2 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java @@ -19,7 +19,7 @@ public interface AccountAccessPolicy { * @param account * @return Return true if it satisfies this policy, or false if it doesn't; */ - boolean checkCommitting(AccountHeader account); + boolean checkDataWriting(AccountHeader account); boolean checkRegistering(Bytes address, PubKey pubKey); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountSet.java index 19b195f1..b9ee4324 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountSet.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountSet.java @@ -160,10 +160,8 @@ public class AccountSet implements Transactional, MerkleProvable { * * 只有最新版本的账户才能可写的,其它都是只读; * - * @param address - * 账户地址; - * @param version - * 账户版本;如果指定为 -1,则返回最新版本; + * @param address 账户地址; + * @param version 账户版本;如果指定为 -1,则返回最新版本; * @return */ public BaseAccount getAccount(Bytes address, long version) { @@ -226,10 +224,8 @@ public class AccountSet implements Transactional, MerkleProvable { * * 如果指定的地址和公钥不匹配,则会引发 {@link LedgerException} 异常; * - * @param address - * 区块链地址; - * @param pubKey - * 公钥; + * @param address 区块链地址; + * @param pubKey 公钥; * @return 注册成功的账户对象; */ public BaseAccount register(Bytes address, PubKey pubKey) { @@ -283,15 +279,14 @@ public class AccountSet implements Transactional, MerkleProvable { private VersioningAccount createInstance(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, long version) { - return new VersioningAccount(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage, accessPolicy, - version); + return new VersioningAccount(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage, version); } private VersioningAccount deserialize(byte[] bytes, CryptoSetting cryptoSetting, String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, long version) { AccountHeader accInfo = BinaryProtocol.decode(bytes); return new VersioningAccount(accInfo.getAddress(), accInfo.getPubKey(), accInfo.getRootHash(), cryptoSetting, - keyPrefix, exStorage, verStorage, readonly, accessPolicy, version); + keyPrefix, exStorage, verStorage, readonly, version); } private byte[] serialize(AccountHeader account) { @@ -388,15 +383,14 @@ public class AccountSet implements Transactional, MerkleProvable { public VersioningAccount(Bytes address, PubKey pubKey, HashDigest rootHash, CryptoSetting cryptoSetting, String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, - AccountAccessPolicy accessPolicy, long version) { - super(address, pubKey, rootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly, accessPolicy); + long version) { + super(address, pubKey, rootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly); this.version = version; } public VersioningAccount(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix, - ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy, - long version) { - super(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage, accessPolicy); + ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, long version) { + super(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage); this.version = version; } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/BaseAccount.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/BaseAccount.java index 6af10149..501f64c3 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/BaseAccount.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/BaseAccount.java @@ -23,8 +23,6 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional protected MerkleDataSet dataset; - private AccountAccessPolicy accessPolicy; - /** * Create a new Account with the specified address and pubkey;
* @@ -38,8 +36,8 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional * @param pubKey */ public BaseAccount(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix, - ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy) { - this(address, pubKey, null, cryptoSetting, keyPrefix, exStorage, verStorage, false, accessPolicy); + ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) { + this(address, pubKey, null, cryptoSetting, keyPrefix, exStorage, verStorage, false); } /** @@ -58,8 +56,8 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional * @param accessPolicy */ public BaseAccount(BlockchainIdentity bcid, CryptoSetting cryptoSetting, String keyPrefix, - ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy) { - this(bcid, null, cryptoSetting, keyPrefix, exStorage, verStorage, false, accessPolicy); + ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) { + this(bcid, null, cryptoSetting, keyPrefix, exStorage, verStorage, false); } /** @@ -69,9 +67,8 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional * * @param address * @param pubKey - * @param dataRootHash - * merkle root hash of account's data; if null be set, create a new - * empty merkle dataset; + * @param dataRootHash merkle root hash of account's data; if null be set, + * create a new empty merkle dataset; * @param cryptoSetting * @param exStorage * @param verStorage @@ -79,18 +76,15 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional * @param accessPolicy */ public BaseAccount(Bytes address, PubKey pubKey, HashDigest dataRootHash, CryptoSetting cryptoSetting, - String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, - AccountAccessPolicy accessPolicy) { + String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) { this(new BlockchainIdentityData(address, pubKey), dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, - readonly, accessPolicy); + readonly); } public BaseAccount(BlockchainIdentity bcid, HashDigest dataRootHash, CryptoSetting cryptoSetting, String keyPrefix, - ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, - AccountAccessPolicy accessPolicy) { + ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) { this.bcid = bcid; this.dataset = new MerkleDataSet(dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly); - this.accessPolicy = accessPolicy; } /* @@ -151,12 +145,9 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional * If updating is performed, the version of the key increase by 1.
* If creating is performed, the version of the key initialize by 0.
* - * @param key - * The key of data; - * @param value - * The value of data; - * @param version - * The expected version of the key. + * @param key The key of data; + * @param value The value of data; + * @param version The expected version of the key. * @return The new version of the key.
* If the key is new created success, then return 0;
* If the key is updated success, then return the new version;
@@ -164,7 +155,6 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional * return -1; */ public long setBytes(Bytes key, byte[] value, long version) { - // TODO: 支持多种数据类型; return dataset.setValue(key, value, version); } @@ -207,10 +197,6 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional @Override public void commit() { - if (!accessPolicy.checkCommitting(this)) { - throw new LedgerException("Account Committing was rejected for the access policy!"); - } - dataset.commit(); } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java index 0655cb24..08b5c23a 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java @@ -6,10 +6,10 @@ import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.AccountHeader; import com.jd.blockchain.ledger.BytesValue; +import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.KVDataEntry; import com.jd.blockchain.ledger.KVDataObject; import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; public class DataAccount implements AccountHeader, MerkleProvable { @@ -41,9 +41,22 @@ public class DataAccount implements AccountHeader, MerkleProvable { public MerkleProof getProof(Bytes key) { return baseAccount.getProof(key); } + + + public long setBytes(Bytes key, BytesValue value, long version) { + byte[] bytesValue = BinaryProtocol.encode(value, BytesValue.class); + return baseAccount.setBytes(key, bytesValue, version); + } + + + public long setBytes(Bytes key, String value, long version) { + BytesValue bv = BytesValueEntry.fromText(value); + return setBytes(key, bv, version); + } public long setBytes(Bytes key, byte[] value, long version) { - return baseAccount.setBytes(key, value, version); + BytesValue bv = BytesValueEntry.fromBytes(value); + return setBytes(key, bv, version); } /** @@ -119,7 +132,6 @@ public class DataAccount implements AccountHeader, MerkleProvable { */ public KVDataEntry[] getDataEntries(int fromIndex, int count) { - if (getDataEntriesTotalCount() == 0 || count == 0) { return null; } @@ -162,5 +174,4 @@ public class DataAccount implements AccountHeader, MerkleProvable { } return baseAccount.dataset.getDataCount(); } - } \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PermissionService.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PermissionService.java new file mode 100644 index 00000000..b3b9a7c2 --- /dev/null +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PermissionService.java @@ -0,0 +1,9 @@ +package com.jd.blockchain.ledger.core; + +import java.util.SortedSet; + +public interface PermissionService { + + boolean checkLedgerPermission(); + +} diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/Privilege.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/Privilege.java deleted file mode 100644 index d5a71455..00000000 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/Privilege.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.jd.blockchain.ledger.core; - -import java.util.SortedSet; - -public interface Privilege { - - SortedSet getOpCodes(); - - long getVersion(); - -} diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java index d5017e83..1687c989 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java @@ -4,6 +4,6 @@ public interface PrivilegeModelSetting { long getLatestVersion(); - Privilege getPrivilege(long version); + PermissionService getPrivilege(long version); } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/OpeningAccessPolicy.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/OpeningAccessPolicy.java index 3af84a5a..14c5b9b4 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/OpeningAccessPolicy.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/OpeningAccessPolicy.java @@ -16,7 +16,7 @@ import com.jd.blockchain.utils.Bytes; public class OpeningAccessPolicy implements AccountAccessPolicy { @Override - public boolean checkCommitting(AccountHeader account) { + public boolean checkDataWriting(AccountHeader account) { return true; } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java index 43595152..c631f044 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java @@ -3,10 +3,25 @@ package com.jd.blockchain.ledger.core.impl.handles; import java.util.ArrayList; import java.util.List; -import com.alibaba.fastjson.JSON; import com.jd.blockchain.contract.LedgerContext; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.*; +import com.jd.blockchain.ledger.AccountHeader; +import com.jd.blockchain.ledger.BlockchainIdentity; +import com.jd.blockchain.ledger.BytesValue; +import com.jd.blockchain.ledger.BytesValueEntry; +import com.jd.blockchain.ledger.DataAccountKVSetOperation; +import com.jd.blockchain.ledger.DataAccountRegisterOperation; +import com.jd.blockchain.ledger.KVDataEntry; +import com.jd.blockchain.ledger.KVInfoVO; +import com.jd.blockchain.ledger.LedgerBlock; +import com.jd.blockchain.ledger.LedgerInfo; +import com.jd.blockchain.ledger.LedgerMetadata; +import com.jd.blockchain.ledger.LedgerTransaction; +import com.jd.blockchain.ledger.Operation; +import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.ledger.TransactionState; +import com.jd.blockchain.ledger.UserInfo; +import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.transaction.BlockchainQueryService; import com.jd.blockchain.transaction.DataAccountKVSetOperationBuilder; @@ -16,7 +31,6 @@ import com.jd.blockchain.transaction.KVData; import com.jd.blockchain.transaction.UserRegisterOperationBuilder; import com.jd.blockchain.transaction.UserRegisterOperationBuilderImpl; import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.io.BytesUtils; public class ContractLedgerContext implements LedgerContext { @@ -250,17 +264,6 @@ public class ContractLedgerContext implements LedgerContext { this.accountAddress = accountAddress; } - public boolean isJson(String str) { - boolean result = false; - try { - Object obj=JSON.parse(str); - result = true; - } catch (Exception e) { - result=false; - } - return result; - } - @Override public DataAccountKVSetOperation getOperation() { return op; @@ -268,41 +271,88 @@ public class ContractLedgerContext implements LedgerContext { @Override public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) { - BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value); + BytesValue bytesValue = BytesValueEntry.fromBytes(value); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); - generatedOpList.add(op); - opHandleContext.handle(op); + handle(op); return this; } + + @Override + public DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromText(value); + this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromBytes(value); + this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromInt64(value); + this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); + return this; + } + + @Deprecated @Override public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { - BytesValue bytesValue; - if (isJson(value)) { - bytesValue = new BytesValueEntry(BytesValueType.JSON, value.getBytes()); - } - else { - bytesValue = new BytesValueEntry(BytesValueType.TEXT, value.getBytes()); - } + BytesValue bytesValue = BytesValueEntry.fromText(value); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); - generatedOpList.add(op); - opHandleContext.handle(op); + handle(op); return this; } + @Override - public DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion) { - BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value.toBytes()); + public DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromJSON(value); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); - generatedOpList.add(op); - opHandleContext.handle(op); + handle(op); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromXML(value); + this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromBytes(value); + this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromImage(value); + this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); return this; } + @Override - public DataAccountKVSetOperationBuilder set(String key, long value, long expVersion) { - BytesValue bytesValue = new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value)); + public DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromTimestamp(value); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); + handle(op); + return this; + } + + private void handle(Operation op) { generatedOpList.add(op); opHandleContext.handle(op); - return this; } /** diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java index 2d7735d4..4331c29c 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java @@ -24,8 +24,7 @@ public class DataAccountKVSetOperationHandle implements OperationHandle{ DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress()); KVWriteEntry[] writeset = kvWriteOp.getWriteSet(); for (KVWriteEntry kvw : writeset) { - byte[] value = BinaryProtocol.encode(kvw.getValue(), BytesValue.class); - account.setBytes(Bytes.fromString(kvw.getKey()), value, kvw.getExpectedVersion()); + account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion()); } } diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java index 23b3445a..644b2863 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java @@ -14,7 +14,6 @@ import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.core.BaseAccount; import com.jd.blockchain.ledger.core.CryptoConfig; -import com.jd.blockchain.ledger.core.impl.OpeningAccessPolicy; import com.jd.blockchain.storage.service.utils.MemoryKVStorage; import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.io.BytesUtils; @@ -44,13 +43,12 @@ public class BaseAccountTest { cryptoConf.setAutoVerifyHash(true); cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256); - OpeningAccessPolicy accPlc = new OpeningAccessPolicy(); +// OpeningAccessPolicy accPlc = new OpeningAccessPolicy(); BlockchainKeypair bck = BlockchainKeyGenerator.getInstance().generate(); // 新建账户; - BaseAccount baseAccount = new BaseAccount(bck.getIdentity(), cryptoConf, keyPrefix, testStorage, testStorage, - accPlc); + BaseAccount baseAccount = new BaseAccount(bck.getIdentity(), cryptoConf, keyPrefix, testStorage, testStorage); assertFalse(baseAccount.isUpdated());// 空的账户; assertFalse(baseAccount.isReadonly()); diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java index 864484f3..ae340106 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java @@ -4,7 +4,7 @@ import com.jd.blockchain.binaryproto.DataContract; import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.utils.io.BytesSlice; +import com.jd.blockchain.utils.Bytes; /** * BytesValue is the base structure of Value in Blockchain Account; @@ -29,6 +29,6 @@ public interface BytesValue { * @return */ @DataField(order = 1, primitiveType = PrimitiveType.BYTES) - BytesSlice getValue(); + Bytes getValue(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java index 753f5f3d..b5ce137b 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java @@ -1,18 +1,79 @@ package com.jd.blockchain.ledger; -import com.jd.blockchain.utils.io.BytesSlice; +import com.jd.blockchain.utils.Bytes; +import com.jd.blockchain.utils.io.BytesUtils; /** - * Created by zhangshuang3 on 2018/12/3. + * + * @author huanghaiquan + * */ public class BytesValueEntry implements BytesValue{ BytesValueType type; - BytesSlice slice; + Bytes value; - public BytesValueEntry(BytesValueType type, byte[] bytes) { + private BytesValueEntry(BytesValueType type, byte[] bytes) { this.type = type; - this.slice = new BytesSlice(bytes); + this.value = new Bytes(bytes); } + + private BytesValueEntry(BytesValueType type, Bytes bytes) { + this.type = type; + this.value = bytes; + } + + public static BytesValue fromBytes(byte[] value) { + return new BytesValueEntry(BytesValueType.BYTES, value); + } + + public static BytesValue fromBytes(Bytes value) { + return new BytesValueEntry(BytesValueType.BYTES, value); + } + + public static BytesValue fromImage(byte[] value) { + return new BytesValueEntry(BytesValueType.IMG, value); + } + + public static BytesValue fromImage(Bytes value) { + return new BytesValueEntry(BytesValueType.IMG, value); + } + + public static BytesValue fromText(String value) { + return new BytesValueEntry(BytesValueType.TEXT, BytesUtils.toBytes(value)); + } + + public static BytesValue fromJSON(String value) { + return new BytesValueEntry(BytesValueType.JSON, BytesUtils.toBytes(value)); + } + + public static BytesValue fromXML(String value) { + return new BytesValueEntry(BytesValueType.XML, BytesUtils.toBytes(value)); + } + + public static BytesValue fromInt32(int value) { + return new BytesValueEntry(BytesValueType.INT32, BytesUtils.toBytes(value)); + } + + public static BytesValue fromInt64(long value) { + return new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value)); + } + + public static BytesValue fromInt16(short value) { + return new BytesValueEntry(BytesValueType.INT16, BytesUtils.toBytes(value)); + } + + public static BytesValue fromInt8(byte value) { + return new BytesValueEntry(BytesValueType.INT8, BytesUtils.toBytes(value)); + } + + public static BytesValue fromTimestamp(long value) { + return new BytesValueEntry(BytesValueType.TIMESTAMP, BytesUtils.toBytes(value)); + } + + public static BytesValue fromBoolean(boolean value) { + return new BytesValueEntry(BytesValueType.BOOLEAN, BytesUtils.toBytes(value)); + } + @Override public BytesValueType getType() { @@ -24,8 +85,8 @@ public class BytesValueEntry implements BytesValue{ } @Override - public BytesSlice getValue() { - return this.slice; + public Bytes getValue() { + return this.value; } } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java index 306b2b89..11049ea9 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java @@ -37,9 +37,9 @@ public enum BytesValueType { INT64(PrimitiveType.INT64.CODE), /** - * 日期时间; + * 时间戳; */ - DATETIME(PrimitiveType.DATETIME.CODE), + TIMESTAMP(PrimitiveType.TIMESTAMP.CODE), /** * 文本数据; @@ -81,7 +81,6 @@ public enum BytesValueType { */ LOCATION(PrimitiveType.LOCATION.CODE); - @EnumField(type = PrimitiveType.INT8) public final byte CODE; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java index 26467e85..b39d9a1c 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java @@ -228,7 +228,7 @@ public class KVDataObject implements KVDataEntry { * 返回日期时间值; *

* - * 仅当数据类型 {@link #getType()} 为 {@link PrimitiveType#DATETIME} 有效; + * 仅当数据类型 {@link #getType()} 为 {@link PrimitiveType#TIMESTAMP} 有效; *

* * 无效类型将引发 {@link IllegalStateException} 异常; @@ -236,11 +236,11 @@ public class KVDataObject implements KVDataEntry { * @return */ public Date datetimeValue() { - if (PrimitiveType.DATETIME == type) { + if (PrimitiveType.TIMESTAMP == type) { long ts = BytesUtils.toLong(bytesValue); return new Date(ts); } - throw new IllegalStateException(String.format("Expected type [%s], but [%s]", PrimitiveType.DATETIME, type)); + throw new IllegalStateException(String.format("Expected type [%s], but [%s]", PrimitiveType.TIMESTAMP, type)); } /** diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerException.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerException.java similarity index 100% rename from source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerException.java rename to source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerException.java diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerPermissionException.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerPermissionException.java new file mode 100644 index 00000000..6c1a3b5c --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerPermissionException.java @@ -0,0 +1,15 @@ +package com.jd.blockchain.ledger.core; + +public class LedgerPermissionException extends LedgerException { + + private static final long serialVersionUID = 6077975401474519117L; + + public LedgerPermissionException(String message) { + super(message); + } + + public LedgerPermissionException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PermissionType.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PermissionType.java new file mode 100644 index 00000000..3f6a4634 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PermissionType.java @@ -0,0 +1,68 @@ +package com.jd.blockchain.ledger; + +/** + * 权限类型; + * + * @author huanghaiquan + * + */ +public enum PermissionType { + + /** + * 账户权限配置; + */ + SET_PRIVILEGE(1), + + /** + * 注册参与方; + */ + REG_PARTICIPANT(2), + + /** + * 配置账本;包括除了{@link #SET_PRIVILEGE}、 {@link #REG_PARTICIPANT} 之外的其它账本设置,例如:设置密码参数、共识参数等; + */ + CONFIG_LEDGER(4), + + /** + * 用户注册; + */ + REG_USER(8), + + /** + * 注册数据账户; + */ + REG_DATA_ACCOUNT(16), + + /** + * 部署新的合约代码; + */ + DEPLOY_CONTRACT(32), + + /** + * 写入用户信息; + */ + SET_USER(1024), + + /** + * 写入数据; + */ + SET_DATA(2048), + + /** + * 写入数据; + */ + INVOKE_CONTRACT(4096), + + /** + * 升级合约代码; + */ + UPDATE_CONTRACT(8192); + + + public final int CODE; + + private PermissionType(int code) { + this.CODE = code; + } + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PrivilegeType.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PrivilegeType.java deleted file mode 100644 index 63e1383d..00000000 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PrivilegeType.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.jd.blockchain.ledger; - -/** - * 权限类型; - * - * @author huanghaiquan - * - */ -public enum PrivilegeType { - - /** - * 账户注册; - */ - ACCOUNT_REGISTER(1), - - /** - * 账户权限配置; - */ - PRIVILEGE_CONFIG(2), - - /** - * 状态数据写入; - */ - STATE_WRITE(4), - - /** - * 合约应用部署; - */ - CONTRACT_APP_DEPLOY(8), - - /** - * 合约应用调用; - */ - CONTRACT_APP_INVOKE(16); - - public final int CODE; - - private PrivilegeType(int code) { - this.CODE = code; - } - -} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java index bd1bfd5b..107bcbf7 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java @@ -31,7 +31,6 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe private static final ContractEventSendOperationBuilderImpl CONTRACT_EVENT_SEND_OP_BUILDER = new ContractEventSendOperationBuilderImpl(); - private LedgerInitOperationBuilder ledgerInitOpBuilder = new LedgerInitOperationBuilderFilter(); private UserRegisterOperationBuilder userRegOpBuilder = new UserRegisterOperationBuilderFilter(); @@ -78,7 +77,7 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe public ContractEventSendOperationBuilder contractEvents() { return contractEventSendOpBuilder; } - + @Override public T contract(String address, Class contractIntf) { // TODO Auto-generated method stub @@ -144,40 +143,80 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe return innerBuilder.getOperation(); } - @Override - public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) { - innerBuilder.set(key, value, expVersion); + private void addOperation() { if (op == null) { op = innerBuilder.getOperation(); operationList.add(op); } + } + + @Override + public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) { + innerBuilder.set(key, value, expVersion); + addOperation(); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion) { + innerBuilder.setText(key, value, expVersion); + addOperation(); return this; } + + @Override + public DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion) { + innerBuilder.setInt64(key, value, expVersion); + addOperation(); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion) { + innerBuilder.setBytes(key, value, expVersion); + addOperation(); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion) { + innerBuilder.setBytes(key, value, expVersion); + addOperation(); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion) { + innerBuilder.setImage(key, value, expVersion); + addOperation(); + return this; + } + @Override public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { - innerBuilder.set(key, value, expVersion); - if (op == null) { - op = innerBuilder.getOperation(); - operationList.add(op); - } + innerBuilder.setText(key, value, expVersion); + addOperation(); return this; } + @Override - public DataAccountKVSetOperationBuilder set(String key, long value, long expVersion) { - innerBuilder.set(key, value, expVersion); - if (op == null) { - op = innerBuilder.getOperation(); - operationList.add(op); - } + public DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion) { + innerBuilder.setJSON(key, value, expVersion); + addOperation(); return this; } + @Override - public DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion) { - innerBuilder.set(key, value, expVersion); - if (op == null) { - op = innerBuilder.getOperation(); - operationList.add(op); - } + public DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion) { + innerBuilder.setXML(key, value, expVersion); + addOperation(); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion) { + innerBuilder.setTimestamp(key, value, expVersion); + addOperation(); return this; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilder.java index 4e0a903c..11971efc 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilder.java @@ -3,6 +3,10 @@ package com.jd.blockchain.transaction; import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.utils.Bytes; +/** + * @author huanghaiquan + * + */ public interface DataAccountKVSetOperationBuilder { /** @@ -13,7 +17,7 @@ public interface DataAccountKVSetOperationBuilder { DataAccountKVSetOperation getOperation(); /** - * 写入键值; + * 写入字节数组; * * @param key * 键; @@ -23,7 +27,35 @@ public interface DataAccountKVSetOperationBuilder { * 预期的当前版本;如果版本不匹配,则写入失败; * @return */ + @Deprecated DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion); + + /** + * 写入字节数组; + * + * @param key + * 键; + * @param value + * 值;byte[]格式 + * @param expVersion + * 预期的当前版本;如果版本不匹配,则写入失败; + * @return + */ + DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion); + + /** + * 写入字节数组; + * + * @param key + * 键; + * @param value + * 值;Bytes格式 + * @param expVersion + * 预期的当前版本;如果版本不匹配,则写入失败; + * @return + */ + DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion); + /** * 写入键值; * @@ -35,21 +67,76 @@ public interface DataAccountKVSetOperationBuilder { * 预期的当前版本;如果版本不匹配,则写入失败; * @return */ + DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion); + + /** + * 写入文本键值; + * + * @param key + * 键; + * @param value + * 值;String格式 + * @param expVersion + * 预期的当前版本;如果版本不匹配,则写入失败; + * @return + */ + @Deprecated DataAccountKVSetOperationBuilder set(String key, String value, long expVersion); + /** - * 写入键值; + * 写入文本键值; * * @param key * 键; * @param value - * 值;Bytes格式 + * 值;String格式 * @param expVersion * 预期的当前版本;如果版本不匹配,则写入失败; * @return */ - DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion); + DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion); + /** - * 写入键值; + * 写入JSON键值; + * + * @param key + * 键; + * @param value + * 值;String格式 + * @param expVersion + * 预期的当前版本;如果版本不匹配,则写入失败; + * @return + */ + DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion); + + /** + * 写入XML键值; + * + * @param key + * 键; + * @param value + * 值;String格式 + * @param expVersion + * 预期的当前版本;如果版本不匹配,则写入失败; + * @return + */ + DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion); + + /** + * 写入64位整数; + * + * @param key + * 键; + * @param value + * 值;long格式 + * @param expVersion + * 预期的当前版本;如果版本不匹配,则写入失败; + * @return + */ + DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion); + + /** + * 写入时间戳; * * @param key * 键; @@ -59,6 +146,6 @@ public interface DataAccountKVSetOperationBuilder { * 预期的当前版本;如果版本不匹配,则写入失败; * @return */ - DataAccountKVSetOperationBuilder set(String key, long value, long expVersion); + DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java index c0511e55..ce056eb4 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java @@ -3,15 +3,12 @@ package com.jd.blockchain.transaction; import com.jd.blockchain.ledger.BytesValue; import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.BytesValueType; import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.io.BytesUtils; -import com.jd.blockchain.utils.serialize.json.JSONSerializeUtils; -public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOperationBuilder{ - +public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOperationBuilder { + private DataAccountKVSetOpTemplate operation; - + public DataAccountKVSetOperationBuilderImpl(Bytes accountAddress) { operation = new DataAccountKVSetOpTemplate(accountAddress); } @@ -21,35 +18,69 @@ public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOpe return operation; } + @Deprecated @Override public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) { - BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value); + return setBytes(key, value, expVersion); + } + + @Override + public DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromBytes(value); + operation.set(key, bytesValue, expVersion); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromImage(value); operation.set(key, bytesValue, expVersion); return this; } @Override public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { - BytesValue bytesValue; - if (JSONSerializeUtils.isJSON(value)) { - bytesValue = new BytesValueEntry(BytesValueType.JSON, value.getBytes()); - } - else { - bytesValue = new BytesValueEntry(BytesValueType.TEXT, value.getBytes()); - } + return setText(key, value, expVersion); + } + + @Override + public DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromText(value); operation.set(key, bytesValue, expVersion); return this; } @Override - public DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion) { - BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value.toBytes()); + public DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromBytes(value); operation.set(key, bytesValue, expVersion); return this; } + + @Override + public DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromInt64(value); + operation.set(key, bytesValue, expVersion); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromJSON(value); + operation.set(key, bytesValue, expVersion); + return this; + } + + @Override + public DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromXML(value); + operation.set(key, bytesValue, expVersion); + return this; + } + @Override - public DataAccountKVSetOperationBuilder set(String key, long value, long expVersion) { - BytesValue bytesValue = new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value)); + public DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion) { + BytesValue bytesValue = BytesValueEntry.fromTimestamp(value); operation.set(key, bytesValue, expVersion); return this; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountOperator.java index 7964e7ef..89ea895e 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountOperator.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountOperator.java @@ -13,14 +13,16 @@ public interface DataAccountOperator { DataAccountRegisterOperationBuilder dataAccounts(); /** - * 写入数据; + * 写入数据;
+ * * @param accountAddress * @return */ DataAccountKVSetOperationBuilder dataAccount(String accountAddress); - + /** * 写入数据; + * * @param accountAddress * @return */ diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PrivilegeSettingOperationBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PrivilegeSettingOperationBuilder.java index f2cbab74..f10d77e1 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PrivilegeSettingOperationBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PrivilegeSettingOperationBuilder.java @@ -1,6 +1,6 @@ package com.jd.blockchain.transaction; -import com.jd.blockchain.ledger.PrivilegeType; +import com.jd.blockchain.ledger.PermissionType; /** * 账户权限设置操作; @@ -16,10 +16,10 @@ import com.jd.blockchain.ledger.PrivilegeType; */ public interface PrivilegeSettingOperationBuilder { - PrivilegeSettingOperationBuilder setThreshhold(PrivilegeType privilege, long threshhold); + PrivilegeSettingOperationBuilder setThreshhold(PermissionType privilege, long threshhold); - PrivilegeSettingOperationBuilder enable(PrivilegeType privilege, String address, int weight); + PrivilegeSettingOperationBuilder enable(PermissionType privilege, String address, int weight); - PrivilegeSettingOperationBuilder disable(PrivilegeType privilege, String address); + PrivilegeSettingOperationBuilder disable(PermissionType privilege, String address); } diff --git a/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/DataAccountKVSetOpTemplateTest.java b/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/DataAccountKVSetOpTemplateTest.java index c5ccd7f6..005af7c6 100644 --- a/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/DataAccountKVSetOpTemplateTest.java +++ b/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/DataAccountKVSetOpTemplateTest.java @@ -8,22 +8,21 @@ */ package test.com.jd.blockchain.ledger.data; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.BytesValueType; import com.jd.blockchain.ledger.Operation; import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; import com.jd.blockchain.transaction.KVData; import com.jd.blockchain.utils.Bytes; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; - /** * * @author shaozhuguang @@ -43,11 +42,11 @@ public class DataAccountKVSetOpTemplateTest { String accountAddress = "zhangsandhakhdkah"; data = new DataAccountKVSetOpTemplate(Bytes.fromString(accountAddress)); KVData kvData1 = - new KVData("test1", new BytesValueEntry(BytesValueType.TEXT, "zhangsan".getBytes()), 9999L); + new KVData("test1", BytesValueEntry.fromText("zhangsan"), 9999L); KVData kvData2 = - new KVData("test2", new BytesValueEntry(BytesValueType.TEXT, "lisi".getBytes()), 9990L); + new KVData("test2", BytesValueEntry.fromText("lisi"), 9990L); KVData kvData3 = - new KVData("test3", new BytesValueEntry(BytesValueType.TEXT, "wangwu".getBytes()), 1990L); + new KVData("test3", BytesValueEntry.fromText("wangwu"), 1990L); data.set(kvData1); data.set(kvData2); data.set(kvData3); diff --git a/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/KVDataTest.java b/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/KVDataTest.java index 86314a6f..39824505 100644 --- a/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/KVDataTest.java +++ b/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/KVDataTest.java @@ -8,20 +8,19 @@ */ package test.com.jd.blockchain.ledger.data; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.BytesValueType; import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; import com.jd.blockchain.transaction.KVData; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; - /** * * @author shaozhuguang @@ -30,26 +29,26 @@ import static org.junit.Assert.assertEquals; */ public class KVDataTest { - private KVData kvData; - - @Before - public void initKVData() throws Exception { - DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); - String key = "test-key"; - byte[] value = "test-value".getBytes(); - long expectedVersion = 9999L; - - kvData = new KVData(key, new BytesValueEntry(BytesValueType.BYTES, value), expectedVersion); - } - - @Test - public void testSerialize_KVEntry() throws Exception { - byte[] serialBytes = BinaryProtocol.encode(kvData, DataAccountKVSetOperation.KVWriteEntry.class); - DataAccountKVSetOpTemplate.KVWriteEntry resolvedKvData = BinaryProtocol.decode(serialBytes); - System.out.println("------Assert start ------"); - assertEquals(resolvedKvData.getKey(), kvData.getKey()); - assertEquals(resolvedKvData.getExpectedVersion(), kvData.getExpectedVersion()); - assertArrayEquals(resolvedKvData.getValue().getValue().toBytes(), kvData.getValue().getValue().toBytes()); - System.out.println("------Assert OK ------"); - } + private KVData kvData; + + @Before + public void initKVData() throws Exception { + DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); + String key = "test-key"; + byte[] value = "test-value".getBytes(); + long expectedVersion = 9999L; + + kvData = new KVData(key, BytesValueEntry.fromBytes(value), expectedVersion); + } + + @Test + public void testSerialize_KVEntry() throws Exception { + byte[] serialBytes = BinaryProtocol.encode(kvData, DataAccountKVSetOperation.KVWriteEntry.class); + DataAccountKVSetOpTemplate.KVWriteEntry resolvedKvData = BinaryProtocol.decode(serialBytes); + System.out.println("------Assert start ------"); + assertEquals(resolvedKvData.getKey(), kvData.getKey()); + assertEquals(resolvedKvData.getExpectedVersion(), kvData.getExpectedVersion()); + assertArrayEquals(resolvedKvData.getValue().getValue().toBytes(), kvData.getValue().getValue().toBytes()); + System.out.println("------Assert OK ------"); + } } \ No newline at end of file diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/PrivilegeSetting.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/PrivilegeSetting.java index c78ee579..deafc113 100644 --- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/PrivilegeSetting.java +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/PrivilegeSetting.java @@ -1,6 +1,6 @@ package com.jd.blockchain.sdk; -import com.jd.blockchain.ledger.PrivilegeType; +import com.jd.blockchain.ledger.PermissionType; /** * 权限设置;
@@ -16,6 +16,6 @@ public interface PrivilegeSetting { long getMask(String address); - boolean isEnable(String address, PrivilegeType privilege); + boolean isEnable(String address, PermissionType privilege); } diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java index 5b1b5457..e7bf18c5 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java @@ -197,7 +197,7 @@ public class IntegrationTestDataAccount { // // //add kv ops for data account: Bytes, string, long, json string DataAccountKVSetOperation dataKvsetOP = txTpl.dataAccount(dataAddr).set("A", "Value_A_0".getBytes(), -1) - .set("B", "Value_B_0", -1).set("C", currentTime, -1).set("D", JSON.toJSONString(jsonTest), -1) + .setText("B", "Value_B_0", -1).setInt64("C", currentTime, -1).setText("D", JSON.toJSONString(jsonTest), -1) .getOperation(); // 签名; diff --git a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java index 62d152bd..c6b0bccf 100644 --- a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java +++ b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java @@ -19,6 +19,10 @@ public class BytesUtils { public static final int MAX_BUFFER_SIZE = 1024 * 1024 * 1024; public static final int BUFFER_SIZE = 64; + public static final byte TRUE_BYTE = 1; + + public static final byte FALSE_BYTE = 0; + private BytesUtils() { } @@ -28,10 +32,8 @@ public class BytesUtils { * * 此方法不处理两者其中之一为 null 的情形,因为无法定义相等性,所以将引发 {@link NullPointerException} 异常; * - * @param bytes1 - * bytes1 - * @param bytes2 - * bytes2 + * @param bytes1 bytes1 + * @param bytes2 bytes2 * @return boolean */ public static boolean equals(byte[] bytes1, byte[] bytes2) { @@ -64,8 +66,7 @@ public class BytesUtils { * 将输入流的所有内容都读入到字节数组返回; 如果输入流的长度超出 MAX_BUFFER_SIZE 定义的值,则抛出 * IllegalArgumentException ; * - * @param in - * in + * @param in in * @return byte[] */ public static byte[] copyToBytes(InputStream in) { @@ -95,15 +96,11 @@ public class BytesUtils { /** * 将输入流复制到输出流; * - * @param in - * 输入流; - * @param out - * 输出流; - * @param maxSize - * 最大字节大小; + * @param in 输入流; + * @param out 输出流; + * @param maxSize 最大字节大小; * @return 返回实际复制的字节数; - * @throws IOException - * exception + * @throws IOException exception */ public static int copy(InputStream in, OutputStream out, int maxSize) throws IOException { byte[] buffer = new byte[BUFFER_SIZE]; @@ -126,8 +123,7 @@ public class BytesUtils { /** * 将 int 值转为4字节的二进制数组; * - * @param value - * value + * @param value value * @return 转换后的二进制数组,高位在前,低位在后; */ public static byte[] toBytes(int value) { @@ -142,11 +138,14 @@ public class BytesUtils { return bytes; } + public static byte[] toBytes(boolean value) { + return new byte[] { value ? TRUE_BYTE : FALSE_BYTE }; + } + /** * 将 long 值转为8字节的二进制数组; * - * @param value - * value + * @param value value * @return 转换后的二进制数组,高位在前,低位在后; */ public static byte[] toBytes(long value) { @@ -158,10 +157,8 @@ public class BytesUtils { /** * 将 int 值转为4字节的二进制数组; * - * @param value - * 要转换的int整数; - * @param bytes - * 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 0 开始的4个元素; + * @param value 要转换的int整数; + * @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 0 开始的4个元素; */ public static void toBytes(short value, byte[] bytes) { toBytes(value, bytes, 0); @@ -176,12 +173,9 @@ public class BytesUtils { *

* 以“高位在前”的方式转换,即:数值的高位保存在数组地址的低位; * - * @param value - * 要转换的int整数; - * @param bytes - * 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素; - * @param offset - * 写入转换结果的起始位置; + * @param value 要转换的int整数; + * @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素; + * @param offset 写入转换结果的起始位置; * @return 返回写入的长度; */ public static int toBytes(int value, byte[] bytes, int offset) { @@ -197,12 +191,9 @@ public class BytesUtils { *

* 以“高位在后”的方式转换,即:数值的高位保存在数组地址的高位; * - * @param value - * 要转换的int整数; - * @param bytes - * 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素; - * @param offset - * 写入转换结果的起始位置; + * @param value 要转换的int整数; + * @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素; + * @param offset 写入转换结果的起始位置; * @return 返回写入的长度; */ public static int toBytesInReverse(int value, byte[] bytes, int offset) { @@ -218,14 +209,10 @@ public class BytesUtils { *

* 以“高位在后”的方式转换,即:数值的高位保存在数组地址的高位; * - * @param value - * 要转换的int整数; - * @param bytes - * 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素; - * @param offset - * 写入转换结果的起始位置; - * @param len - * 写入长度;必须大于 0 ,小于等于 4; + * @param value 要转换的int整数; + * @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素; + * @param offset 写入转换结果的起始位置; + * @param len 写入长度;必须大于 0 ,小于等于 4; * @return 返回写入的长度; */ public static int toBytesInReverse(int value, byte[] bytes, int offset, int len) { @@ -263,12 +250,9 @@ public class BytesUtils { /** * 将 long 值转为8字节的二进制数组; * - * @param value - * 要转换的long整数; - * @param bytes - * 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的8个元素; - * @param offset - * 写入转换结果的起始位置; + * @param value 要转换的long整数; + * @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的8个元素; + * @param offset 写入转换结果的起始位置; * @return 返回写入的长度; */ public static int toBytes(long value, byte[] bytes, int offset) { @@ -345,8 +329,7 @@ public class BytesUtils { /** * 按从高位到低位的顺序将指定二进制数组从位置 0 开始的 4 个字节转换为 int 整数; * - * @param bytes - * 要转换的二进制数组; + * @param bytes 要转换的二进制数组; * @return 转换后的 int 整数; */ public static int toInt(byte[] bytes) { @@ -362,10 +345,8 @@ public class BytesUtils { /** * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 2 个字节转换为 short 整数; * - * @param bytes - * 要转换的二进制数组; - * @param offset - * 要读取数据的开始位置 + * @param bytes 要转换的二进制数组; + * @param offset 要读取数据的开始位置 * @return 转换后的 short 整数; */ public static short toShort(byte[] bytes, int offset) { @@ -387,10 +368,8 @@ public class BytesUtils { /** * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数; * - * @param bytes - * 要转换的二进制数组; - * @param offset - * 要读取数据的开始位置 + * @param bytes 要转换的二进制数组; + * @param offset 要读取数据的开始位置 * @return 转换后的 int 整数; */ public static int toInt(byte[] bytes, int offset) { @@ -407,14 +386,11 @@ public class BytesUtils { /** * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数; * - * @param bytes - * 要转换的二进制数组; - * @param offset - * 要读取数据的开始位置 + * @param bytes 要转换的二进制数组; + * @param offset 要读取数据的开始位置 * @return 转换后的 int 整数; * - * @param len - * 长度;len 必须满足: len 大于等于 1 且小于等于4; + * @param len 长度;len 必须满足: len 大于等于 1 且小于等于4; * @return 转换后的 int 整数; */ public static int toInt(byte[] bytes, int offset, int len) { @@ -433,18 +409,14 @@ public class BytesUtils { /** * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数; * - * @param bytes - * 要转换的二进制数组; - * @param offset - * 要读取数据的开始位置 + * @param bytes 要转换的二进制数组; + * @param offset 要读取数据的开始位置 * @return 转换后的 int 整数; * - * @param len - * 长度;len 必须满足: len 大于等于 1 且小于等于4; - * @param highAlign - * 是否高位对齐;
- * true 表示参数 bytes 的首个字节对应为整数的最高8位;
- * false 表示参数 bytes 的最后字节对应为整数的最低8位; + * @param len 长度;len 必须满足: len 大于等于 1 且小于等于4; + * @param highAlign 是否高位对齐;
+ * true 表示参数 bytes 的首个字节对应为整数的最高8位;
+ * false 表示参数 bytes 的最后字节对应为整数的最低8位; * @return 转换后的 int 整数; */ public static int toInt(byte[] bytes, int offset, int len, boolean highAlign) { @@ -472,10 +444,8 @@ public class BytesUtils { /** * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 8个字节转换为 long 整数; * - * @param bytes - * 要转换的二进制数组; - * @param offset - * 要读取数据的开始位置 + * @param bytes 要转换的二进制数组; + * @param offset 要读取数据的开始位置 * @return 转换后的 long 整数; */ public static long toLong(byte[] bytes, int offset) { @@ -495,8 +465,7 @@ public class BytesUtils { /** * 从指定的输入流中读入2个字节,由前到后按由高位到低位的方式转为 short 整数; * - * @param in - * in + * @param in in * @return short */ public static short readShort(InputStream in) { @@ -531,8 +500,7 @@ public class BytesUtils { /** * 从指定的输入流中读入4个字节,由前到后按由高位到低位的方式转为 int 整数; * - * @param in - * in + * @param in in * @return int */ public static int readInt(InputStream in) { @@ -658,11 +626,9 @@ public class BytesUtils { /** * 从字节数组获取对象 * - * @param objBytes - * objBytes + * @param objBytes objBytes * @return object - * @throws Exception - * exception + * @throws Exception exception */ // public static Object getObjectFromBytes(byte[] objBytes) throws Exception { // if (objBytes == null || objBytes.length == 0) { @@ -676,11 +642,9 @@ public class BytesUtils { /** * 从对象获取一个字节数组; * - * @param obj - * obj + * @param obj obj * @return byte array - * @throws Exception - * exception + * @throws Exception exception */ public static byte[] getBytesFromObject(Object obj) throws Exception { if (obj == null) {