diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
index d936c788..d83a311e 100644
--- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
+++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
@@ -22,7 +22,7 @@ public interface DataCodes {
public static final int DATA_SNAPSHOT = 0x130;
- public static final int LEDGER_ADMIN_INFO = 0x131;
+// public static final int LEDGER_ADMIN_DATA = 0x131;
public static final int TX = 0x200;
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 bb57cd3c..f0ec9748 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
@@ -48,6 +48,10 @@ public class AccountSet implements Transactional, MerkleProvable {
public boolean isReadonly() {
return merkleDataset.isReadonly();
}
+
+ void setReadonly() {
+ merkleDataset.setReadonly();
+ }
public AccountSet(CryptoSetting cryptoSetting, String keyPrefix, ExPolicyKVStorage exStorage,
VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy) {
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ContractAccountSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ContractAccountSet.java
index 039be73d..ad51fd63 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ContractAccountSet.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ContractAccountSet.java
@@ -33,6 +33,10 @@ public class ContractAccountSet implements MerkleProvable, Transactional {
return accountSet.isReadonly();
}
+ void setReadonly() {
+ accountSet.setReadonly();
+ }
+
@Override
public HashDigest getRootHash() {
return accountSet.getRootHash();
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccountSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccountSet.java
index d44e9dbf..97bdb107 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccountSet.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccountSet.java
@@ -33,6 +33,10 @@ public class DataAccountSet implements MerkleProvable, Transactional {
return accountSet.isReadonly();
}
+ void setReadonly() {
+ accountSet.setReadonly();
+ }
+
@Override
public HashDigest getRootHash() {
return accountSet.getRootHash();
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java
index 07d91d34..cbc0af77 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java
@@ -77,20 +77,28 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminInfo {
private ExPolicyKVStorage storage;
- private HashDigest adminAccountHash;
+ private HashDigest adminDataHash;
private boolean readonly;
private boolean updated;
public HashDigest getHash() {
- return adminAccountHash;
+ return adminDataHash;
}
public boolean isReadonly() {
return readonly;
}
+ void setReadonly() {
+ this.readonly = true;
+ }
+
+ public LedgerSettings getPreviousSetting() {
+ return previousSettings;
+ }
+
@Override
public RolePrivilegeSettings getRolePrivileges() {
return rolePrivileges;
@@ -132,7 +140,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminInfo {
initSetting.getCryptoSetting());
this.previousSettings = new LedgerConfiguration(settings);
this.previousSettingHash = null;
- this.adminAccountHash = null;
+ this.adminDataHash = null;
// 基于原配置初始化参与者列表;
String partiPrefix = keyPrefix + LEDGER_PARTICIPANT_PREFIX;
@@ -168,7 +176,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminInfo {
// 复制记录一份配置作为上一个区块的原始配置,该实例仅供读取,不做修改,也不会回写到存储;
this.previousSettings = new LedgerConfiguration(settings);
this.previousSettingHash = metadata.getSettingsHash();
- this.adminAccountHash = adminAccountHash;
+ this.adminDataHash = adminAccountHash;
String partiPrefix = keyPrefix + LEDGER_PARTICIPANT_PREFIX;
this.participants = new ParticipantDataset(metadata.getParticipantsHash(), previousSettings.getCryptoSetting(),
@@ -238,17 +246,17 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminInfo {
return metadata;
}
- /**
- * 返回原来的账本配置;
- *
- *
- * 此方法总是返回从上一个区块加载的账本配置,即时调用 {@link #setLedgerSetting(LedgerSettings)} 做出了新的更改;
- *
- * @return
- */
- public LedgerSettings getPreviousSetting() {
- return previousSettings;
- }
+// /**
+// * 返回原来的账本配置;
+// *
+// *
+// * 此方法总是返回从上一个区块加载的账本配置,即时调用 {@link #setLedgerSetting(LedgerSettings)} 做出了新的更改;
+// *
+// * @return
+// */
+// public LedgerSettings getPreviousSetting() {
+// return previousSettings;
+// }
/**
* 返回当前设置的账本配置;
@@ -339,7 +347,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminInfo {
byte[] metadataBytes = serializeMetadata(metadata);
HashDigest metadataHash = hashFunc.hash(metadataBytes);
- if (adminAccountHash == null || !adminAccountHash.equals(metadataHash)) {
+ if (adminDataHash == null || !adminDataHash.equals(metadataHash)) {
// update modify;
// String base58MetadataHash = metadataHash.toBase58();
// String metadataKey = encodeMetadataKey(base58MetadataHash);
@@ -354,7 +362,7 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminInfo {
throw new LedgerException(errMsg);
}
- adminAccountHash = metadataHash;
+ adminDataHash = metadataHash;
}
updated = false;
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataSet.java
deleted file mode 100644
index 0736101b..00000000
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataSet.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.jd.blockchain.ledger.core;
-
-import com.jd.blockchain.ledger.LedgerAdminInfo;
-
-/**
- * {@link LedgerDataSet} 表示账本在某一个区块上的数据集合;
- *
- * @author huanghaiquan
- *
- */
-public interface LedgerDataSet{
-
- boolean isReadonly();
-
- LedgerAdminInfo getAdminAccount();
-
- UserAccountSet getUserAccountSet();
-
- DataAccountSet getDataAccountSet();
-
- ContractAccountSet getContractAccountSet();
-
-}
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerDataSetImpl.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataSetImpl.java
similarity index 62%
rename from source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerDataSetImpl.java
rename to source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataSetImpl.java
index cfcaa50d..613990aa 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerDataSetImpl.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataSetImpl.java
@@ -1,34 +1,31 @@
-package com.jd.blockchain.ledger.core.impl;
+package com.jd.blockchain.ledger.core;
-import com.jd.blockchain.ledger.LedgerAdminInfo;
-import com.jd.blockchain.ledger.core.*;
import com.jd.blockchain.utils.Transactional;
-public class LedgerDataSetImpl implements LedgerDataSet, Transactional {
+public class LedgerDataSetImpl implements LedgerDataset, Transactional {
- private LedgerAdminDataset adminAccount;
+ private LedgerAdminDataset adminDataset;
private UserAccountSet userAccountSet;
private DataAccountSet dataAccountSet;
private ContractAccountSet contractAccountSet;
-
- private boolean readonly;
+ private boolean readonly;
/**
* Create new block;
+ *
* @param adminAccount
* @param userAccountSet
* @param dataAccountSet
* @param contractAccountSet
* @param readonly
*/
- public LedgerDataSetImpl(LedgerAdminDataset adminAccount,
- UserAccountSet userAccountSet, DataAccountSet dataAccountSet, ContractAccountSet contractAccountSet,
- boolean readonly) {
- this.adminAccount = adminAccount;
+ public LedgerDataSetImpl(LedgerAdminDataset adminAccount, UserAccountSet userAccountSet,
+ DataAccountSet dataAccountSet, ContractAccountSet contractAccountSet, boolean readonly) {
+ this.adminDataset = adminAccount;
this.userAccountSet = userAccountSet;
this.dataAccountSet = dataAccountSet;
this.contractAccountSet = contractAccountSet;
@@ -37,8 +34,8 @@ public class LedgerDataSetImpl implements LedgerDataSet, Transactional {
}
@Override
- public LedgerAdminInfo getAdminAccount() {
- return adminAccount;
+ public LedgerAdminDataset getAdminDataset() {
+ return adminDataset;
}
@Override
@@ -52,13 +49,13 @@ public class LedgerDataSetImpl implements LedgerDataSet, Transactional {
}
@Override
- public ContractAccountSet getContractAccountSet() {
+ public ContractAccountSet getContractAccountset() {
return contractAccountSet;
}
@Override
public boolean isUpdated() {
- return adminAccount.isUpdated() || userAccountSet.isUpdated() || dataAccountSet.isUpdated()
+ return adminDataset.isUpdated() || userAccountSet.isUpdated() || dataAccountSet.isUpdated()
|| contractAccountSet.isUpdated();
}
@@ -71,7 +68,7 @@ public class LedgerDataSetImpl implements LedgerDataSet, Transactional {
return;
}
- adminAccount.commit();
+ adminDataset.commit();
userAccountSet.commit();
dataAccountSet.commit();
contractAccountSet.commit();
@@ -79,7 +76,7 @@ public class LedgerDataSetImpl implements LedgerDataSet, Transactional {
@Override
public void cancel() {
- adminAccount.cancel();
+ adminDataset.cancel();
userAccountSet.cancel();
dataAccountSet.cancel();
contractAccountSet.cancel();
@@ -90,4 +87,12 @@ public class LedgerDataSetImpl implements LedgerDataSet, Transactional {
return readonly;
}
+ void setReadonly() {
+ this.readonly = true;
+ this.adminDataset.setReadonly();
+ this.userAccountSet.setReadonly();
+ this.dataAccountSet.setReadonly();
+ this.contractAccountSet.setReadonly();
+ }
+
}
\ No newline at end of file
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataset.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataset.java
new file mode 100644
index 00000000..46e91855
--- /dev/null
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerDataset.java
@@ -0,0 +1,21 @@
+package com.jd.blockchain.ledger.core;
+
+/**
+ * {@link LedgerDataset} 表示账本在某一个区块上的数据集合;
+ *
+ * @author huanghaiquan
+ *
+ */
+public interface LedgerDataset{
+
+ boolean isReadonly();
+
+ LedgerAdminDataset getAdminDataset();
+
+ UserAccountSet getUserAccountSet();
+
+ DataAccountSet getDataAccountSet();
+
+ ContractAccountSet getContractAccountset();
+
+}
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerEditor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerEditor.java
index 46c21655..466dd30a 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerEditor.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerEditor.java
@@ -11,7 +11,7 @@ import com.jd.blockchain.ledger.TransactionRequest;
*
*
* {@link LedgerEditor} 以上一个区块作为数据编辑的起点;
- * 对账本数据({@link #getDataSet()})的批量更改可以作为一个交易({@link LedgerTransaction})整体提交暂存,形成暂存点;
+ * 对账本数据({@link #getDataset()})的批量更改可以作为一个交易({@link LedgerTransaction})整体提交暂存,形成暂存点;
*
*
* @author huanghaiquan
@@ -33,11 +33,25 @@ public interface LedgerEditor {
*/
long getBlockHeight();
+ /**
+ * 最新的账本数据集;
+ *
+ * @return
+ */
+ LedgerDataset getLedgerDataset();
+
+ /**
+ * 最新的交易集合;
+ *
+ * @return
+ */
+ TransactionSet getTransactionSet();
+
/**
* 开始新事务;
*
* 方法返回之前,将会校验交易请求的用户签名列表和节点签名列表,并在后续对数据集
- * {@link LedgerTransactionContext#getDataSet()} 的操作时,校验这些用户和节点是否具备权限;
+ * {@link LedgerTransactionContext#getDataset()} 的操作时,校验这些用户和节点是否具备权限;
*
* 校验失败将引发异常 {@link LedgerException};
*
@@ -52,7 +66,8 @@ public interface LedgerEditor { * * * - * 注:方法不解析、不执行交易中的操作;
+ * 注:方法不解析、不执行交易中的操作; + *
*
* @param txRequest 交易请求;
* @return
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepository.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepository.java
index 137d15a2..73400223 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepository.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepository.java
@@ -53,22 +53,22 @@ public interface LedgerRepository extends Closeable {
LedgerBlock getBlock(long height);
LedgerAdminInfo getAdminInfo();
+
+ LedgerAdminInfo getAdminInfo(LedgerBlock block);
LedgerBlock getBlock(HashDigest hash);
- LedgerDataSet getDataSet(LedgerBlock block);
+ LedgerDataset getDataSet(LedgerBlock block);
TransactionSet getTransactionSet(LedgerBlock block);
- LedgerAdminInfo getAdminAccount(LedgerBlock block);
-
UserAccountSet getUserAccountSet(LedgerBlock block);
DataAccountSet getDataAccountSet(LedgerBlock block);
ContractAccountSet getContractAccountSet(LedgerBlock block);
- default LedgerDataSet getDataSet() {
+ default LedgerDataset getDataSet() {
return getDataSet(getLatestBlock());
}
@@ -76,10 +76,6 @@ public interface LedgerRepository extends Closeable {
return getTransactionSet(getLatestBlock());
}
- default LedgerAdminInfo getAdminAccount() {
- return getAdminAccount(getLatestBlock());
- }
-
default UserAccountSet getUserAccountSet() {
return getUserAccountSet(getLatestBlock());
}
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepositoryImpl.java
similarity index 66%
rename from source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java
rename to source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepositoryImpl.java
index 8a14f014..0b973a69 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerRepositoryImpl.java
@@ -1,4 +1,4 @@
-package com.jd.blockchain.ledger.core.impl;
+package com.jd.blockchain.ledger.core;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.crypto.Crypto;
@@ -12,18 +12,8 @@ import com.jd.blockchain.ledger.LedgerDataSnapshot;
import com.jd.blockchain.ledger.LedgerInitSetting;
import com.jd.blockchain.ledger.LedgerSettings;
import com.jd.blockchain.ledger.TransactionRequest;
-import com.jd.blockchain.ledger.core.AccountAccessPolicy;
-import com.jd.blockchain.ledger.core.ContractAccountSet;
-import com.jd.blockchain.ledger.core.DataAccountSet;
-import com.jd.blockchain.ledger.core.LedgerAdminDataset;
-import com.jd.blockchain.ledger.core.LedgerConsts;
-import com.jd.blockchain.ledger.core.LedgerDataSet;
-import com.jd.blockchain.ledger.core.LedgerEditor;
-import com.jd.blockchain.ledger.core.LedgerRepository;
-import com.jd.blockchain.ledger.core.LedgerTransactionContext;
-import com.jd.blockchain.ledger.core.SettingContext;
-import com.jd.blockchain.ledger.core.TransactionSet;
-import com.jd.blockchain.ledger.core.UserAccountSet;
+import com.jd.blockchain.ledger.core.impl.LedgerBlockData;
+import com.jd.blockchain.ledger.core.impl.OpeningAccessPolicy;
import com.jd.blockchain.storage.service.ExPolicyKVStorage;
import com.jd.blockchain.storage.service.VersioningKVStorage;
import com.jd.blockchain.utils.Bytes;
@@ -57,11 +47,6 @@ public class LedgerRepositoryImpl implements LedgerRepository {
private static final Bytes TRANSACTION_SET_PREFIX = Bytes.fromString("TXS" + LedgerConsts.KEY_SEPERATOR);
private static final AccountAccessPolicy DEFAULT_ACCESS_POLICY = new OpeningAccessPolicy();
-
- /**
- * 经过上一轮共识确认的账本管理配置;
- */
- private LedgerAdminInfo approvedAdminInfo;
private HashDigest ledgerHash;
@@ -78,7 +63,7 @@ public class LedgerRepositoryImpl implements LedgerRepository {
private volatile LedgerEditor nextBlockEditor;
private volatile boolean closed = false;
-
+
public LedgerRepositoryImpl(HashDigest ledgerHash, String keyPrefix, ExPolicyKVStorage exPolicyStorage,
VersioningKVStorage versioningStorage) {
this.keyPrefix = keyPrefix;
@@ -91,6 +76,8 @@ public class LedgerRepositoryImpl implements LedgerRepository {
if (getLatestBlockHeight() < 0) {
throw new RuntimeException("Ledger doesn't exist!");
}
+
+ retrieveLatestState();
}
/*
@@ -121,25 +108,37 @@ public class LedgerRepositoryImpl implements LedgerRepository {
@Override
public LedgerBlock getLatestBlock() {
- LedgerState state = getLatestState();
- return state.block;
+ return latestState.block;
}
- private LedgerState getLatestState() {
- LedgerState state = latestState;
- if (state == null) {
- LedgerBlock latestBlock = innerGetBlock(innerGetLatestBlockHeight());
- state = new LedgerState(latestBlock);
- latestState = state;
- }
- return state;
+// private LedgerState getLatestState() {
+// LedgerState state = latestState;
+// if (state == null) {
+// LedgerBlock latestBlock = innerGetBlock(innerGetLatestBlockHeight());
+// state = new LedgerState(latestBlock);
+// latestState = state;
+// }
+// return state;
+// }
+
+ /**
+ * 重新检索加载最新的状态;
+ *
+ * @return
+ */
+ private LedgerState retrieveLatestState() {
+ LedgerBlock latestBlock = innerGetBlock(innerGetLatestBlockHeight());
+ LedgerDataset ledgerDataset = innerGetLedgerDataset(latestBlock);
+ TransactionSet txSet = loadTransactionSet(latestBlock.getTransactionSetHash(),
+ ledgerDataset.getAdminDataset().getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage,
+ versioningStorage, true);
+ this.latestState = new LedgerState(latestBlock, ledgerDataset, txSet);
+ return latestState;
}
@Override
public LedgerBlock retrieveLatestBlock() {
- LedgerBlock latestBlock = innerGetBlock(innerGetLatestBlockHeight());
- latestState = new LedgerState(latestBlock);
- return latestBlock;
+ return retrieveLatestState().block;
}
@Override
@@ -198,7 +197,7 @@ public class LedgerRepositoryImpl implements LedgerRepository {
if (height < 0) {
return null;
}
- return innerGetBlock(getBlockHash(height));
+ return innerGetBlock(innerGetBlockHash(height));
}
@Override
@@ -220,26 +219,18 @@ public class LedgerRepositoryImpl implements LedgerRepository {
throw new RuntimeException("Block hash not equals to it's storage key!");
}
- // verify hash;
- // boolean requiredVerifyHash =
- // adminAccount.getMetadata().getSetting().getCryptoSetting().getAutoVerifyHash();
- // TODO: 未实现从配置中加载是否校验 Hash 的设置;
- if (SettingContext.queryingSettings().verifyHash()) {
- byte[] blockBodyBytes = null;
- if (block.getHeight() == 0) {
- // 计算创世区块的 hash 时,不包括 ledgerHash 字段;
- block.setLedgerHash(null);
- blockBodyBytes = BinaryProtocol.encode(block, BlockBody.class);
- // 恢复;
- block.setLedgerHash(block.getHash());
- } else {
- blockBodyBytes = BinaryProtocol.encode(block, BlockBody.class);
- }
- HashFunction hashFunc = Crypto.getHashFunction(blockHash.getAlgorithm());
- boolean pass = hashFunc.verify(blockHash, blockBodyBytes);
- if (!pass) {
- throw new RuntimeException("Block hash verification fail!");
- }
+ // verify block hash;
+ byte[] blockBodyBytes = null;
+ if (block.getHeight() == 0) {
+ // 计算创世区块的 hash 时,不包括 ledgerHash 字段;
+ blockBodyBytes = BinaryProtocol.encode(block, BlockBody.class);
+ } else {
+ blockBodyBytes = BinaryProtocol.encode(block, BlockBody.class);
+ }
+ HashFunction hashFunc = Crypto.getHashFunction(blockHash.getAlgorithm());
+ boolean pass = hashFunc.verify(blockHash, blockBodyBytes);
+ if (!pass) {
+ throw new RuntimeException("Block hash verification fail!");
}
// verify height;
@@ -254,9 +245,18 @@ public class LedgerRepositoryImpl implements LedgerRepository {
return block;
}
+ /**
+ * 获取最新区块的账本参数;
+ *
+ * @return
+ */
+ private LedgerSettings getLatestSettings() {
+ return getAdminInfo().getSettings();
+ }
+
@Override
public LedgerAdminInfo getAdminInfo() {
- return getAdminAccount(getLatestBlock());
+ return getAdminInfo(getLatestBlock());
}
private LedgerBlock deserialize(byte[] blockBytes) {
@@ -266,140 +266,169 @@ public class LedgerRepositoryImpl implements LedgerRepository {
@Override
public TransactionSet getTransactionSet(LedgerBlock block) {
long height = getLatestBlockHeight();
- TransactionSet transactionSet = null;
+// TransactionSet transactionSet = null;
if (height == block.getHeight()) {
- // 缓存读;
- LedgerState state = getLatestState();
- transactionSet = state.transactionSet;
- if (transactionSet == null) {
- LedgerAdminInfo adminAccount = getAdminAccount(block);
- transactionSet = loadTransactionSet(block.getTransactionSetHash(),
- adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage,
- versioningStorage, true);
- state.transactionSet = transactionSet;
- }
- return transactionSet;
- }
- LedgerAdminInfo adminAccount = getAdminAccount(block);
+// // 缓存最近一个区块的数据;
+// LedgerState state = getLatestState();
+// transactionSet = state.transactionSet;
+// if (transactionSet == null) {
+// LedgerAdminInfo adminAccount = getAdminInfo(block);
+// transactionSet = loadTransactionSet(block.getTransactionSetHash(),
+// adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage, versioningStorage,
+// true);
+// state.transactionSet = transactionSet;
+// }
+// return transactionSet;
+
+ // 从缓存中返回最新区块的数据集;
+ return latestState.getTransactionSet();
+ }
+ LedgerAdminInfo adminAccount = getAdminInfo(block);
// All of existing block is readonly;
- return loadTransactionSet(block.getTransactionSetHash(),
- adminAccount.getSettings().getCryptoSetting(), keyPrefix, exPolicyStorage,
- versioningStorage, true);
+ return loadTransactionSet(block.getTransactionSetHash(), adminAccount.getSettings().getCryptoSetting(),
+ keyPrefix, exPolicyStorage, versioningStorage, true);
}
@Override
- public LedgerAdminDataset getAdminAccount(LedgerBlock block) {
+ public LedgerAdminDataset getAdminInfo(LedgerBlock block) {
long height = getLatestBlockHeight();
- LedgerAdminDataset adminAccount = null;
+// LedgerAdminDataset adminAccount = null;
if (height == block.getHeight()) {
- // 缓存读;
- LedgerState state = getLatestState();
- adminAccount = state.adminAccount;
- if (adminAccount == null) {
- adminAccount = new LedgerAdminDataset(block.getAdminAccountHash(), keyPrefix, exPolicyStorage,
- versioningStorage, true);
- state.adminAccount = adminAccount;
- }
- return adminAccount;
+// // 缓存读;
+// LedgerState state = getLatestState();
+// adminAccount = state.adminAccount;
+// if (adminAccount == null) {
+// adminAccount = new LedgerAdminDataset(block.getAdminAccountHash(), keyPrefix, exPolicyStorage,
+// versioningStorage, true);
+// state.adminAccount = adminAccount;
+// }
+// return adminAccount;
+
+ return latestState.getAdminDataset();
}
+ return createAdminDataset(block);
+ }
+
+ private LedgerAdminDataset createAdminDataset(LedgerBlock block) {
return new LedgerAdminDataset(block.getAdminAccountHash(), keyPrefix, exPolicyStorage, versioningStorage, true);
}
@Override
public UserAccountSet getUserAccountSet(LedgerBlock block) {
long height = getLatestBlockHeight();
- UserAccountSet userAccountSet = null;
+// UserAccountSet userAccountSet = null;
if (height == block.getHeight()) {
- // 缓存读;
- LedgerState state = getLatestState();
- userAccountSet = state.userAccountSet;
- if (userAccountSet == null) {
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- userAccountSet = loadUserAccountSet(block.getUserAccountSetHash(),
- adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage,
- versioningStorage, true);
- state.userAccountSet = userAccountSet;
- }
- return userAccountSet;
- }
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- return loadUserAccountSet(block.getUserAccountSetHash(), adminAccount.getPreviousSetting().getCryptoSetting(),
- keyPrefix, exPolicyStorage, versioningStorage, true);
+// // 缓存读;
+// LedgerState state = getLatestState();
+// userAccountSet = state.userAccountSet;
+// if (userAccountSet == null) {
+// LedgerAdminDataset adminAccount = getAdminInfo(block);
+// userAccountSet = loadUserAccountSet(block.getUserAccountSetHash(),
+// adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage,
+// versioningStorage, true);
+// state.userAccountSet = userAccountSet;
+// }
+// return userAccountSet;
+
+ return latestState.getUserAccountSet();
+ }
+ LedgerAdminDataset adminAccount = getAdminInfo(block);
+ return createUserAccountSet(block, adminAccount.getSettings().getCryptoSetting());
+ }
+
+ private UserAccountSet createUserAccountSet(LedgerBlock block, CryptoSetting cryptoSetting) {
+ return loadUserAccountSet(block.getUserAccountSetHash(), cryptoSetting, keyPrefix, exPolicyStorage,
+ versioningStorage, true);
}
@Override
public DataAccountSet getDataAccountSet(LedgerBlock block) {
long height = getLatestBlockHeight();
- DataAccountSet dataAccountSet = null;
+// DataAccountSet dataAccountSet = null;
if (height == block.getHeight()) {
- // 缓存读;
- LedgerState state = getLatestState();
- dataAccountSet = state.dataAccountSet;
- if (dataAccountSet == null) {
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- dataAccountSet = loadDataAccountSet(block.getDataAccountSetHash(),
- adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage,
- versioningStorage, true);
- state.dataAccountSet = dataAccountSet;
- }
- return dataAccountSet;
+// // 缓存读;
+// LedgerState state = getLatestState();
+// dataAccountSet = state.dataAccountSet;
+// if (dataAccountSet == null) {
+// LedgerAdminDataset adminAccount = getAdminInfo(block);
+// dataAccountSet = loadDataAccountSet(block.getDataAccountSetHash(),
+// adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage,
+// versioningStorage, true);
+// state.dataAccountSet = dataAccountSet;
+// }
+// return dataAccountSet;
+
+ return latestState.getDataAccountSet();
}
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- return loadDataAccountSet(block.getDataAccountSetHash(), adminAccount.getPreviousSetting().getCryptoSetting(),
- keyPrefix, exPolicyStorage, versioningStorage, true);
+ LedgerAdminDataset adminAccount = getAdminInfo(block);
+ return createDataAccountSet(block, adminAccount.getSettings().getCryptoSetting());
+ }
+
+ private DataAccountSet createDataAccountSet(LedgerBlock block, CryptoSetting setting) {
+ return loadDataAccountSet(block.getDataAccountSetHash(), setting, keyPrefix, exPolicyStorage, versioningStorage,
+ true);
}
@Override
public ContractAccountSet getContractAccountSet(LedgerBlock block) {
long height = getLatestBlockHeight();
- ContractAccountSet contractAccountSet = null;
+// ContractAccountSet contractAccountSet = null;
if (height == block.getHeight()) {
- // 缓存读;
- LedgerState state = getLatestState();
- contractAccountSet = state.contractAccountSet;
- if (contractAccountSet == null) {
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- contractAccountSet = loadContractAccountSet(block.getContractAccountSetHash(),
- adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage,
- versioningStorage, true);
- state.contractAccountSet = contractAccountSet;
- }
- return contractAccountSet;
+// // 缓存读;
+// LedgerState state = getLatestState();
+// contractAccountSet = state.contractAccountSet;
+// if (contractAccountSet == null) {
+// LedgerAdminDataset adminAccount = getAdminInfo(block);
+// contractAccountSet = loadContractAccountSet(block.getContractAccountSetHash(),
+// adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage,
+// versioningStorage, true);
+// state.contractAccountSet = contractAccountSet;
+// }
+// return contractAccountSet;
+
+ return latestState.getContractAccountSet();
}
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- return loadContractAccountSet(block.getContractAccountSetHash(),
- adminAccount.getPreviousSetting().getCryptoSetting(), keyPrefix, exPolicyStorage, versioningStorage,
- true);
+ LedgerAdminDataset adminAccount = getAdminInfo(block);
+ return createContractAccountSet(block, adminAccount.getSettings().getCryptoSetting());
+ }
+
+ private ContractAccountSet createContractAccountSet(LedgerBlock block, CryptoSetting cryptoSetting) {
+ return loadContractAccountSet(block.getContractAccountSetHash(), cryptoSetting, keyPrefix, exPolicyStorage,
+ versioningStorage, true);
}
@Override
- public LedgerDataSet getDataSet(LedgerBlock block) {
+ public LedgerDataset getDataSet(LedgerBlock block) {
long height = getLatestBlockHeight();
- LedgerDataSet ledgerDataSet = null;
+// LedgerDataSet ledgerDataSet = null;
if (height == block.getHeight()) {
- // 缓存读;
- LedgerState state = getLatestState();
- ledgerDataSet = state.ledgerDataSet;
- if (ledgerDataSet == null) {
- ledgerDataSet = innerDataSet(block);
- state.ledgerDataSet = ledgerDataSet;
- }
- return ledgerDataSet;
+// // 缓存读;
+// LedgerState state = getLatestState();
+// ledgerDataSet = state.ledgerDataSet;
+// if (ledgerDataSet == null) {
+// ledgerDataSet = innerDataSet(block);
+// state.ledgerDataSet = ledgerDataSet;
+// }
+// return ledgerDataSet;
+
+ return latestState.getLedgerDataset();
}
// All of existing block is readonly;
- return innerDataSet(block);
+ return innerGetLedgerDataset(block);
}
- private LedgerDataSet innerDataSet(LedgerBlock block) {
- LedgerAdminDataset adminAccount = getAdminAccount(block);
- UserAccountSet userAccountSet = getUserAccountSet(block);
- DataAccountSet dataAccountSet = getDataAccountSet(block);
- ContractAccountSet contractAccountSet = getContractAccountSet(block);
- return new LedgerDataSetImpl(adminAccount, userAccountSet, dataAccountSet, contractAccountSet, true);
+ private LedgerDataset innerGetLedgerDataset(LedgerBlock block) {
+ LedgerAdminDataset adminDataset = createAdminDataset(block);
+ CryptoSetting cryptoSetting = adminDataset.getSettings().getCryptoSetting();
+
+ UserAccountSet userAccountSet = createUserAccountSet(block, cryptoSetting);
+ DataAccountSet dataAccountSet = createDataAccountSet(block, cryptoSetting);
+ ContractAccountSet contractAccountSet = createContractAccountSet(block, cryptoSetting);
+ return new LedgerDataSetImpl(adminDataset, userAccountSet, dataAccountSet, contractAccountSet, true);
}
@Override
@@ -412,9 +441,8 @@ public class LedgerRepositoryImpl implements LedgerRepository {
"A new block is in process, cann't create another one until it finish by committing or canceling.");
}
LedgerBlock previousBlock = getLatestBlock();
- LedgerTransactionalEditor editor = LedgerTransactionalEditor.createEditor(previousBlock,
- getAdminInfo().getSettings(), keyPrefix, exPolicyStorage,
- versioningStorage);
+ LedgerTransactionalEditor editor = LedgerTransactionalEditor.createEditor(previousBlock, getLatestSettings(),
+ keyPrefix, exPolicyStorage, versioningStorage);
NewBlockCommittingMonitor committingMonitor = new NewBlockCommittingMonitor(editor, this);
this.nextBlockEditor = committingMonitor;
return committingMonitor;
@@ -503,12 +531,12 @@ public class LedgerRepositoryImpl implements LedgerRepository {
return transactionSet;
}
- static LedgerDataSetImpl loadDataSet(LedgerDataSnapshot dataSnapshot, String keyPrefix,
+ static LedgerDataSetImpl loadDataSet(LedgerDataSnapshot dataSnapshot, CryptoSetting cryptoSetting, String keyPrefix,
ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage, boolean readonly) {
LedgerAdminDataset adminAccount = new LedgerAdminDataset(dataSnapshot.getAdminAccountHash(), keyPrefix,
ledgerExStorage, ledgerVerStorage, readonly);
- CryptoSetting cryptoSetting = adminAccount.getPreviousSetting().getCryptoSetting();
+// CryptoSetting cryptoSetting = adminAccount.getPreviousSetting().getCryptoSetting();
UserAccountSet userAccountSet = loadUserAccountSet(dataSnapshot.getUserAccountSetHash(), cryptoSetting,
keyPrefix, ledgerExStorage, ledgerVerStorage, readonly);
@@ -597,6 +625,16 @@ public class LedgerRepositoryImpl implements LedgerRepository {
return editor.getBlockHeight();
}
+ @Override
+ public LedgerDataset getLedgerDataset() {
+ return editor.getLedgerDataset();
+ }
+
+ @Override
+ public TransactionSet getTransactionSet() {
+ return editor.getTransactionSet();
+ }
+
@Override
public LedgerTransactionContext newTransaction(TransactionRequest txRequest) {
return editor.newTransaction(txRequest);
@@ -612,7 +650,8 @@ public class LedgerRepositoryImpl implements LedgerRepository {
try {
editor.commit();
LedgerBlock latestBlock = editor.getCurrentBlock();
- ledgerRepo.latestState = new LedgerState(latestBlock);
+ ledgerRepo.latestState = new LedgerState(latestBlock, editor.getLedgerDataset(),
+ editor.getTransactionSet());
} finally {
ledgerRepo.nextBlockEditor = null;
}
@@ -639,20 +678,39 @@ public class LedgerRepositoryImpl implements LedgerRepository {
private final LedgerBlock block;
- private volatile LedgerAdminDataset adminAccount;
+ private final TransactionSet transactionSet;
+
+ private final LedgerDataset ledgerDataset;
+
+ public LedgerState(LedgerBlock block, LedgerDataset ledgerDataset, TransactionSet transactionSet) {
+ this.block = block;
+ this.ledgerDataset = ledgerDataset;
+ this.transactionSet = transactionSet;
+
+ }
- private volatile UserAccountSet userAccountSet;
+ public LedgerAdminDataset getAdminDataset() {
+ return ledgerDataset.getAdminDataset();
+ }
- private volatile DataAccountSet dataAccountSet;
+ public LedgerDataset getLedgerDataset() {
+ return ledgerDataset;
+ }
- private volatile ContractAccountSet contractAccountSet;
+ public ContractAccountSet getContractAccountSet() {
+ return ledgerDataset.getContractAccountset();
+ }
- private volatile TransactionSet transactionSet;
+ public DataAccountSet getDataAccountSet() {
+ return ledgerDataset.getDataAccountSet();
+ }
- private volatile LedgerDataSet ledgerDataSet;
+ public UserAccountSet getUserAccountSet() {
+ return ledgerDataset.getUserAccountSet();
+ }
- public LedgerState(LedgerBlock block) {
- this.block = block;
+ public TransactionSet getTransactionSet() {
+ return transactionSet;
}
}
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java
index a4feb79e..b06721e6 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionContext.java
@@ -13,11 +13,18 @@ import java.util.List;
public interface LedgerTransactionContext {
/**
- * 账本数据;
+ * 账本数据集合;
*
* @return
*/
- LedgerDataSet getDataSet();
+ LedgerDataset getDataset();
+
+ /**
+ * 事务集合;
+ *
+ * @return
+ */
+ TransactionSet getTransactionSet();
/**
* 交易请求;
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionalEditor.java
similarity index 91%
rename from source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java
rename to source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionalEditor.java
index c23d3d5f..e6ad775b 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerTransactionalEditor.java
@@ -1,4 +1,4 @@
-package com.jd.blockchain.ledger.core.impl;
+package com.jd.blockchain.ledger.core;
import java.util.List;
@@ -20,17 +20,14 @@ import com.jd.blockchain.ledger.TransactionContent;
import com.jd.blockchain.ledger.TransactionRequest;
import com.jd.blockchain.ledger.TransactionRollbackException;
import com.jd.blockchain.ledger.TransactionState;
-import com.jd.blockchain.ledger.core.LedgerDataSet;
-import com.jd.blockchain.ledger.core.LedgerEditor;
-import com.jd.blockchain.ledger.core.LedgerTransactionContext;
-import com.jd.blockchain.ledger.core.SettingContext;
-import com.jd.blockchain.ledger.core.TransactionSet;
+import com.jd.blockchain.ledger.core.impl.LedgerBlockData;
+import com.jd.blockchain.ledger.core.impl.LedgerTransactionData;
+import com.jd.blockchain.ledger.core.impl.TransactionStagedSnapshot;
import com.jd.blockchain.storage.service.ExPolicyKVStorage;
import com.jd.blockchain.storage.service.VersioningKVStorage;
import com.jd.blockchain.storage.service.utils.BufferedKVStorage;
import com.jd.blockchain.transaction.SignatureUtils;
import com.jd.blockchain.transaction.TxBuilder;
-import com.jd.blockchain.transaction.TxRequestBuilder;
import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.codec.Base58Utils;
@@ -70,10 +67,8 @@ public class LedgerTransactionalEditor implements LedgerEditor {
private BufferedKVStorage baseStorage;
/**
- * 上一个交易的上下文;
+ * 上一个交易产生的账本快照;
*/
-// private LedgerTransactionContextImpl previousTxCtx;
-
private TxSnapshot previousTxSnapshot;
/**
@@ -81,6 +76,16 @@ public class LedgerTransactionalEditor implements LedgerEditor {
*/
private volatile LedgerTransactionContextImpl currentTxCtx;
+ /**
+ * 最后提交的账本数据集;
+ */
+ private volatile LedgerDataSetImpl latestLedgerDataset;
+
+ /**
+ * 最后提交的交易集合;
+ */
+ private volatile TransactionSet latestTransactionSet;
+
/**
* @param ledgerHash
* @param cryptoSetting
@@ -160,6 +165,10 @@ public class LedgerTransactionalEditor implements LedgerEditor {
private void commitTxSnapshot(TxSnapshot snapshot) {
previousTxSnapshot = snapshot;
+ latestLedgerDataset = currentTxCtx.getDataset();
+ latestLedgerDataset.setReadonly();
+ latestTransactionSet = currentTxCtx.getTransactionSet();
+ latestTransactionSet.setReadonly();
currentTxCtx = null;
}
@@ -181,13 +190,23 @@ public class LedgerTransactionalEditor implements LedgerEditor {
return ledgerHash;
}
+ @Override
+ public LedgerDataset getLedgerDataset() {
+ return latestLedgerDataset;
+ }
+
+ @Override
+ public TransactionSet getTransactionSet() {
+ return latestTransactionSet;
+ }
+
/**
* 检查当前账本是否是指定交易请求的账本;
*
* @param txRequest
* @return
*/
- private boolean isRequestedLedger(TransactionRequest txRequest) {
+ private boolean isRequestMatched(TransactionRequest txRequest) {
HashDigest reqLedgerHash = txRequest.getTransactionContent().getLedgerHash();
if (ledgerHash == reqLedgerHash) {
return true;
@@ -226,7 +245,8 @@ public class LedgerTransactionalEditor implements LedgerEditor {
@Override
public synchronized LedgerTransactionContext newTransaction(TransactionRequest txRequest) {
- if (SettingContext.txSettings().verifyLedger() && !isRequestedLedger(txRequest)) {
+// if (SettingContext.txSettings().verifyLedger() && !isRequestMatched(txRequest)) {
+ if (!isRequestMatched(txRequest)) {
throw new IllegalTransactionException(
"Transaction request is dispatched to a wrong ledger! --[TxHash="
+ txRequest.getTransactionContent().getHash() + "]!",
@@ -234,7 +254,8 @@ public class LedgerTransactionalEditor implements LedgerEditor {
}
// TODO: 把验签和创建交易并行化;
- if (SettingContext.txSettings().verifySignature() && !verifyTxContent(txRequest)) {
+// if (SettingContext.txSettings().verifySignature() && !verifyTxContent(txRequest)) {
+ if (!verifyTxContent(txRequest)) {
// 抛弃哈希和签名校验失败的交易请求;
throw new IllegalTransactionException(
"Wrong transaction signature! --[TxHash=" + txRequest.getTransactionContent().getHash() + "]!",
@@ -262,18 +283,18 @@ public class LedgerTransactionalEditor implements LedgerEditor {
GenesisSnapshot snpht = (GenesisSnapshot) startingPoint;
txDataset = LedgerRepositoryImpl.newDataSet(snpht.initSetting, ledgerKeyPrefix, txBufferedStorage,
txBufferedStorage);
- txset = LedgerRepositoryImpl.newTransactionSet(txDataset.getAdminAccount().getSettings(),
+ txset = LedgerRepositoryImpl.newTransactionSet(txDataset.getAdminDataset().getSettings(),
ledgerKeyPrefix, txBufferedStorage, txBufferedStorage);
} else if (startingPoint instanceof TxSnapshot) {
// 新的区块;
// TxSnapshot; reload dataset and txset;
TxSnapshot snpht = (TxSnapshot) startingPoint;
// load dataset;
- txDataset = LedgerRepositoryImpl.loadDataSet(snpht.dataSnapshot, ledgerKeyPrefix, txBufferedStorage,
- txBufferedStorage, false);
+ txDataset = LedgerRepositoryImpl.loadDataSet(snpht.dataSnapshot, cryptoSetting, ledgerKeyPrefix,
+ txBufferedStorage, txBufferedStorage, false);
// load txset;
- txset = LedgerRepositoryImpl.loadTransactionSet(snpht.txsetHash, this.cryptoSetting, ledgerKeyPrefix,
+ txset = LedgerRepositoryImpl.loadTransactionSet(snpht.txsetHash, cryptoSetting, ledgerKeyPrefix,
txBufferedStorage, txBufferedStorage, false);
} else {
// Unreachable;
@@ -283,11 +304,11 @@ public class LedgerTransactionalEditor implements LedgerEditor {
} else {
// Reuse previous object to optimize performance;
// load dataset;
- txDataset = LedgerRepositoryImpl.loadDataSet(previousTxSnapshot.dataSnapshot, ledgerKeyPrefix,
- txBufferedStorage, txBufferedStorage, false);
+ txDataset = LedgerRepositoryImpl.loadDataSet(previousTxSnapshot.dataSnapshot, cryptoSetting,
+ ledgerKeyPrefix, txBufferedStorage, txBufferedStorage, false);
// load txset;
- txset = LedgerRepositoryImpl.loadTransactionSet(previousTxSnapshot.txsetHash, this.cryptoSetting,
+ txset = LedgerRepositoryImpl.loadTransactionSet(previousTxSnapshot.txsetHash, cryptoSetting,
ledgerKeyPrefix, txBufferedStorage, txBufferedStorage, false);
}
@@ -476,28 +497,6 @@ public class LedgerTransactionalEditor implements LedgerEditor {
}
-// /**
-// * 账本的数据上下文;
-// *
-// * @author huanghaiquan
-// *
-// */
-// private static class LedgerDataContext {
-//
-// protected LedgerDataSetImpl dataset;
-//
-// protected TransactionSet txset;
-//
-// protected BufferedKVStorage storage;
-//
-// public LedgerDataContext(LedgerDataSetImpl dataset, TransactionSet txset, BufferedKVStorage storage) {
-// this.dataset = dataset;
-// this.txset = txset;
-// this.storage = storage;
-// }
-//
-// }
-
/**
* 交易的上下文;
*
@@ -534,10 +533,15 @@ public class LedgerTransactionalEditor implements LedgerEditor {
}
@Override
- public LedgerDataSet getDataSet() {
+ public LedgerDataSetImpl getDataset() {
return dataset;
}
+ @Override
+ public TransactionSet getTransactionSet() {
+ return txset;
+ }
+
@Override
public TransactionRequest getTransactionRequest() {
return txRequest;
@@ -620,8 +624,8 @@ public class LedgerTransactionalEditor implements LedgerEditor {
private TransactionStagedSnapshot takeDataSnapshot() {
TransactionStagedSnapshot txDataSnapshot = new TransactionStagedSnapshot();
- txDataSnapshot.setAdminAccountHash(dataset.getAdminAccount().getHash());
- txDataSnapshot.setContractAccountSetHash(dataset.getContractAccountSet().getRootHash());
+ txDataSnapshot.setAdminAccountHash(dataset.getAdminDataset().getHash());
+ txDataSnapshot.setContractAccountSetHash(dataset.getContractAccountset().getRootHash());
txDataSnapshot.setDataAccountSetHash(dataset.getDataAccountSet().getRootHash());
txDataSnapshot.setUserAccountSetHash(dataset.getUserAccountSet().getRootHash());
return txDataSnapshot;
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleDataSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleDataSet.java
index 30846867..8b94b5a1 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleDataSet.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleDataSet.java
@@ -124,6 +124,10 @@ public class MerkleDataSet implements Transactional, MerkleProvable {
return readonly;
}
+ void setReadonly() {
+ this.readonly = true;
+ }
+
public long getDataCount() {
return merkleTree.getDataCount();
}
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java
index e1a0f567..ba7c5b83 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/OperationHandle.java
@@ -30,8 +30,8 @@ public interface OperationHandle {
*
* @return 操作执行结果
*/
- BytesValue process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext,
- LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService);
+ BytesValue process(Operation op, LedgerDataset newBlockDataset, TransactionRequestContext requestContext,
+ LedgerDataset previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService);
// /**
// * 异步解析和执行操作;
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionSet.java
index 962244e5..c96ce3a2 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionSet.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionSet.java
@@ -153,6 +153,10 @@ public class TransactionSet implements Transactional, MerkleProvable {
public boolean isReadonly() {
return txSet.isReadonly();
}
+
+ void setReadonly() {
+ txSet.setReadonly();
+ }
@Override
public boolean isUpdated() {
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/UserAccountSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/UserAccountSet.java
index d28c15ed..d6100ea6 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/UserAccountSet.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/UserAccountSet.java
@@ -46,6 +46,10 @@ public class UserAccountSet implements Transactional, MerkleProvable {
public boolean isReadonly() {
return accountSet.isReadonly();
}
+
+ void setReadonly() {
+ accountSet.setReadonly();
+ }
@Override
public HashDigest getRootHash() {
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java
index 77cb4e2f..d4b79319 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java
@@ -14,6 +14,8 @@ import com.jd.blockchain.ledger.core.LedgerConsts;
import com.jd.blockchain.ledger.core.LedgerEditor;
import com.jd.blockchain.ledger.core.LedgerManage;
import com.jd.blockchain.ledger.core.LedgerRepository;
+import com.jd.blockchain.ledger.core.LedgerRepositoryImpl;
+import com.jd.blockchain.ledger.core.LedgerTransactionalEditor;
import com.jd.blockchain.storage.service.ExPolicyKVStorage;
import com.jd.blockchain.storage.service.KVStorageService;
import com.jd.blockchain.storage.service.VersioningKVStorage;
@@ -69,7 +71,7 @@ public class LedgerManager implements LedgerManage {
ledgerVersioningStorage);
// 校验 crypto service provider ;
- CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSettings().getCryptoSetting();
+ CryptoSetting cryptoSetting = ledgerRepo.getAdminInfo().getSettings().getCryptoSetting();
checkCryptoSetting(cryptoSetting, ledgerHash);
// 创建账本上下文;
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
index 2433b9d2..af52f39b 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
@@ -44,7 +44,7 @@ public class LedgerQueryService implements BlockchainQueryService {
public LedgerAdminInfo getLedgerAdminInfo(HashDigest ledgerHash) {
LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
LedgerBlock block = ledger.getLatestBlock();
- LedgerAdminInfo administration = ledger.getAdminAccount(block);
+ LedgerAdminInfo administration = ledger.getAdminInfo(block);
return administration;
}
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionContextImpl.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionContextImpl.java
deleted file mode 100644
index c8c09d93..00000000
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionContextImpl.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.jd.blockchain.ledger.core.impl;
-
-import com.jd.blockchain.ledger.TransactionState;
-import com.jd.blockchain.ledger.LedgerTransaction;
-import com.jd.blockchain.ledger.TransactionRequest;
-import com.jd.blockchain.ledger.core.LedgerDataSet;
-import com.jd.blockchain.ledger.core.LedgerTransactionContext;
-import com.jd.blockchain.storage.service.utils.BufferedKVStorage;
-
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java
index aa8fcf93..750020da 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/TransactionBatchProcessor.java
@@ -23,7 +23,7 @@ import com.jd.blockchain.ledger.TransactionResponse;
import com.jd.blockchain.ledger.TransactionRollbackException;
import com.jd.blockchain.ledger.TransactionState;
import com.jd.blockchain.ledger.UserDoesNotExistException;
-import com.jd.blockchain.ledger.core.LedgerDataSet;
+import com.jd.blockchain.ledger.core.LedgerDataset;
import com.jd.blockchain.ledger.core.LedgerEditor;
import com.jd.blockchain.ledger.core.LedgerService;
import com.jd.blockchain.ledger.core.LedgerTransactionContext;
@@ -43,7 +43,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
private LedgerEditor newBlockEditor;
- private LedgerDataSet previousBlockDataset;
+ private LedgerDataset previousBlockDataset;
private OperationHandleRegisteration opHandles;
@@ -61,7 +61,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
* @param previousBlockDataset 新区块的前一个区块的数据集;即未提交新区块之前的经过共识的账本最新数据集;
* @param opHandles 操作处理对象注册表;
*/
- public TransactionBatchProcessor(LedgerEditor newBlockEditor, LedgerDataSet previousBlockDataset,
+ public TransactionBatchProcessor(LedgerEditor newBlockEditor, LedgerDataset previousBlockDataset,
OperationHandleRegisteration opHandles, LedgerService ledgerService) {
this.newBlockEditor = newBlockEditor;
this.previousBlockDataset = previousBlockDataset;
@@ -135,7 +135,7 @@ public class TransactionBatchProcessor implements TransactionBatchProcess {
TransactionState result;
List