From e68e4996357b7cde5c438b18187a561e397a91d8 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Thu, 8 Aug 2019 11:27:46 +0800 Subject: [PATCH] Implements storage that separates LedgerSetting from LedgerMetadata; --- .../ledger/core/LedgerAdminAccount.java | 149 ++++++++++++------ .../ledger/core/LedgerConfiguration.java | 6 +- .../core/impl/LedgerRepositoryImpl.java | 2 +- .../core/impl/LedgerTransactionalEditor.java | 4 +- .../blockchain/ledger/LedgerMetaDataTest.java | 6 +- .../jd/blockchain/ledger/LedgerMetadata.java | 58 ++++--- .../blockchain/ledger/LedgerMetadata_V2.java | 27 ++++ ...LedgerSetting.java => LedgerSettings.java} | 2 +- 8 files changed, 178 insertions(+), 76 deletions(-) create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata_V2.java rename source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/{LedgerSetting.java => LedgerSettings.java} (95%) diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java index c22a4ad2..89e1bc77 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java @@ -1,7 +1,7 @@ package com.jd.blockchain.ledger.core; import com.jd.blockchain.ledger.LedgerMetadata; -import com.jd.blockchain.ledger.LedgerSetting; +import com.jd.blockchain.ledger.LedgerSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,9 +29,11 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { public static final String LEDGER_META_PREFIX = "MTA" + LedgerConsts.KEY_SEPERATOR; public static final String LEDGER_PARTICIPANT_PREFIX = "PAR" + LedgerConsts.KEY_SEPERATOR; - public static final String LEDGER_PRIVILEGE_PREFIX = "PVL" + LedgerConsts.KEY_SEPERATOR; + public static final String LEDGER_SETTING_PREFIX = "SET" + LedgerConsts.KEY_SEPERATOR; + public static final String LEDGER_PRIVILEGE_PREFIX = "PRL" + LedgerConsts.KEY_SEPERATOR; private final Bytes metaPrefix; + private final Bytes settingPrefix; private final Bytes privilegePrefix; private LedgerMetadata origMetadata; @@ -44,19 +46,26 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { *
* 对 LedgerMetadata 修改的新配置不能立即生效,需要达成共识后,在下一次区块计算中才生效; */ - private LedgerSetting previousSetting; + private LedgerSettings previousSettings; + + private HashDigest previousSettingHash; /** * 账本的参与节点; */ private ParticipantDataSet participants; + /** + * 账本参数配置; + */ + private LedgerSettings settings; + // /** // * 账本的全局权限设置; // */ // private PrivilegeDataSet privileges; - private ExPolicyKVStorage settingsStorage; + private ExPolicyKVStorage storage; private HashDigest adminAccountHash; @@ -80,7 +89,7 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { * 只在新建账本时调用此方法; * * @param ledgerSeed - * @param setting + * @param settings * @param partiList * @param exPolicyStorage * @param versioningStorage @@ -88,6 +97,7 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { public LedgerAdminAccount(LedgerInitSetting initSetting, String keyPrefix, ExPolicyKVStorage exPolicyStorage, VersioningKVStorage versioningStorage) { this.metaPrefix = Bytes.fromString(keyPrefix + LEDGER_META_PREFIX); + this.settingPrefix = Bytes.fromString(keyPrefix + LEDGER_SETTING_PREFIX); this.privilegePrefix = Bytes.fromString(keyPrefix + LEDGER_PRIVILEGE_PREFIX); ParticipantNode[] parties = initSetting.getConsensusParticipants(); @@ -108,15 +118,15 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { this.metadata = new LedgerMetadataImpl(); this.metadata.setSeed(initSetting.getLedgerSeed()); // 新配置; - this.metadata.setting = new LedgerConfiguration(initSetting.getConsensusProvider(), - initSetting.getConsensusSettings(), initSetting.getCryptoSetting()); - this.previousSetting = new LedgerConfiguration(initSetting.getConsensusProvider(), - initSetting.getConsensusSettings(), initSetting.getCryptoSetting()); + this.settings = new LedgerConfiguration(initSetting.getConsensusProvider(), initSetting.getConsensusSettings(), + initSetting.getCryptoSetting()); + this.previousSettings = new LedgerConfiguration(settings); + this.previousSettingHash = null; this.adminAccountHash = null; // 基于原配置初始化参与者列表; String partiPrefix = keyPrefix + LEDGER_PARTICIPANT_PREFIX; - this.participants = new ParticipantDataSet(previousSetting.getCryptoSetting(), partiPrefix, exPolicyStorage, + this.participants = new ParticipantDataSet(previousSettings.getCryptoSetting(), partiPrefix, exPolicyStorage, versioningStorage); for (ParticipantNode p : parties) { @@ -124,20 +134,23 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { } // 初始化其它属性; - this.settingsStorage = exPolicyStorage; + this.storage = exPolicyStorage; this.readonly = false; } public LedgerAdminAccount(HashDigest adminAccountHash, String keyPrefix, ExPolicyKVStorage kvStorage, VersioningKVStorage versioningKVStorage, boolean readonly) { this.metaPrefix = Bytes.fromString(keyPrefix + LEDGER_META_PREFIX); + this.settingPrefix = Bytes.fromString(keyPrefix + LEDGER_SETTING_PREFIX); this.privilegePrefix = Bytes.fromString(keyPrefix + LEDGER_PRIVILEGE_PREFIX); - this.settingsStorage = kvStorage; + this.storage = kvStorage; this.readonly = readonly; - this.origMetadata = loadAndVerifySettings(adminAccountHash); + this.origMetadata = loadAndVerifyMetadata(adminAccountHash); this.metadata = new LedgerMetadataImpl(origMetadata); + this.settings = loadAndVerifySettings(metadata.getSettingsHash()); // 复制记录一份配置作为上一个区块的原始配置,该实例仅供读取,不做修改,也不会回写到存储; - this.previousSetting = new LedgerConfiguration(metadata.getSetting()); + this.previousSettings = new LedgerConfiguration(settings); + this.previousSettingHash = metadata.getSettingsHash(); this.adminAccountHash = adminAccountHash; // this.privileges = new PrivilegeDataSet(metadata.getPrivilegesHash(), // metadata.getSetting().getCryptoSetting(), @@ -151,23 +164,49 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { // PrefixAppender.prefix(LEDGER_PARTICIPANT_PREFIX, versioningKVStorage), // readonly); String partiPrefix = keyPrefix + LEDGER_PARTICIPANT_PREFIX; - this.participants = new ParticipantDataSet(metadata.getParticipantsHash(), previousSetting.getCryptoSetting(), + this.participants = new ParticipantDataSet(metadata.getParticipantsHash(), previousSettings.getCryptoSetting(), partiPrefix, kvStorage, versioningKVStorage, readonly); } - private LedgerMetadata loadAndVerifySettings(HashDigest adminAccountHash) { - // String base58Hash = adminAccountHash.toBase58(); - // String key = encodeMetadataKey(base58Hash); + private LedgerSettings loadAndVerifySettings(HashDigest settingsHash) { + if (settingsHash == null) { + return null; + } + Bytes key = encodeSettingsKey(settingsHash); + byte[] bytes = storage.get(key); + HashFunction hashFunc = Crypto.getHashFunction(adminAccountHash.getAlgorithm()); + if (!hashFunc.verify(adminAccountHash, bytes)) { + String errorMsg = "Verification of the hash for ledger setting failed! --[HASH=" + key + "]"; + LOGGER.error(errorMsg); + throw new LedgerException(errorMsg); + } + return deserializeSettings(bytes); + } + + private LedgerSettings deserializeSettings(byte[] bytes) { + return BinaryProtocol.decode(bytes); + } + + private byte[] serializeSetting(LedgerSettings setting) { + return BinaryProtocol.encode(setting, LedgerSettings.class); + } + + private LedgerMetadata loadAndVerifyMetadata(HashDigest adminAccountHash) { Bytes key = encodeMetadataKey(adminAccountHash); - byte[] bytes = settingsStorage.get(key); + byte[] bytes = storage.get(key); HashFunction hashFunc = Crypto.getHashFunction(adminAccountHash.getAlgorithm()); if (!hashFunc.verify(adminAccountHash, bytes)) { - LOGGER.error("The hash verification of ledger settings fail! --[HASH=" + key + "]"); - throw new LedgerException("The hash verification of ledger settings fail!"); + String errorMsg = "Verification of the hash for ledger metadata failed! --[HASH=" + key + "]"; + LOGGER.error(errorMsg); + throw new LedgerException(errorMsg); } return deserializeMetadata(bytes); } + private Bytes encodeSettingsKey(HashDigest settingsHash) { + return settingPrefix.concat(settingsHash); + } + private Bytes encodeMetadataKey(HashDigest metadataHash) { // return LEDGER_META_PREFIX + metadataHash; // return metaPrefix + metadataHash; @@ -188,12 +227,12 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { * 返回原来的账本配置; * *
- * 此方法总是返回从上一个区块加载的账本配置,即时调用 {@link #setLedgerSetting(LedgerSetting)} 做出了新的更改; + * 此方法总是返回从上一个区块加载的账本配置,即时调用 {@link #setLedgerSetting(LedgerSettings)} 做出了新的更改; * * @return */ - public LedgerSetting getPreviousSetting() { - return previousSetting; + public LedgerSettings getPreviousSetting() { + return previousSettings; } /** @@ -201,8 +240,8 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { * * @return */ - public LedgerSetting getSetting() { - return metadata.getSetting(); + public LedgerSettings getSetting() { + return settings; } /** @@ -210,11 +249,12 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { * * @param ledgerSetting */ - public void setLedgerSetting(LedgerSetting ledgerSetting) { + public void setLedgerSetting(LedgerSettings ledgerSetting) { if (readonly) { throw new IllegalArgumentException("This merkle dataset is readonly!"); } - metadata.setSetting(ledgerSetting); + settings = ledgerSetting; + updated = true; } @Override @@ -259,14 +299,34 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { if (!isUpdated()) { return; } + // 计算并更新参与方集合的根哈希; participants.commit(); - metadata.setParticipantsHash(participants.getRootHash()); + HashFunction hashFunc = Crypto.getHashFunction(previousSettings.getCryptoSetting().getHashAlgorithm()); + + // 计算并更新参数配置的哈希; + if (settings == null) { + throw new LedgerException("Missing ledger settings!"); + } + byte[] settingsBytes = serializeSetting(settings); + HashDigest settingsHash = hashFunc.hash(settingsBytes); + metadata.setSettingsHash(settingsHash); + if (previousSettingHash == null || !previousSettingHash.equals(settingsHash)) { + Bytes settingsKey = encodeSettingsKey(settingsHash); + boolean nx = storage.set(settingsKey, settingsBytes, ExPolicy.NOT_EXISTING); + if (!nx) { + String base58MetadataHash = settingsHash.toBase58(); + // 有可能发生了并发写入冲突,不同的节点都向同一个存储服务器上写入数据; + String errMsg = "Ledger metadata already exist! --[MetadataHash=" + base58MetadataHash + "]"; + LOGGER.warn(errMsg); + throw new LedgerException(errMsg); + } + } + // 基于之前的密码配置来计算元数据的哈希; byte[] metadataBytes = serializeMetadata(metadata); - HashFunction hashFunc = Crypto - .getHashFunction(previousSetting.getCryptoSetting().getHashAlgorithm()); + HashDigest metadataHash = hashFunc.hash(metadataBytes); if (adminAccountHash == null || !adminAccountHash.equals(metadataHash)) { // update modify; @@ -274,14 +334,13 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { // String metadataKey = encodeMetadataKey(base58MetadataHash); Bytes metadataKey = encodeMetadataKey(metadataHash); - boolean nx = settingsStorage.set(metadataKey, metadataBytes, ExPolicy.NOT_EXISTING); + boolean nx = storage.set(metadataKey, metadataBytes, ExPolicy.NOT_EXISTING); if (!nx) { + String base58MetadataHash = metadataHash.toBase58(); // 有可能发生了并发写入冲突,不同的节点都向同一个存储服务器上写入数据; - // throw new LedgerException( - // "Ledger metadata already exist! --[LedgerMetadataHash=" + base58MetadataHash - // + "]"); - // LOGGER.warn("Ledger metadata already exist! --[MetadataHash=" + - // base58MetadataHash + "]"); + String errMsg = "Ledger metadata already exist! --[MetadataHash=" + base58MetadataHash + "]"; + LOGGER.warn(errMsg); + throw new LedgerException(errMsg); } adminAccountHash = metadataHash; @@ -311,17 +370,20 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { private byte[] seed; - private LedgerSetting setting; +// private LedgerSetting setting; private HashDigest participantsHash; + private HashDigest settingsHash; + public LedgerMetadataImpl() { } public LedgerMetadataImpl(LedgerMetadata metadata) { this.seed = metadata.getSeed(); - this.setting = metadata.getSetting(); +// this.setting = metadata.getSetting(); this.participantsHash = metadata.getParticipantsHash(); + this.settingsHash = metadata.getSettingsHash(); } @Override @@ -330,8 +392,8 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { } @Override - public LedgerSetting getSetting() { - return setting; + public HashDigest getSettingsHash() { + return settingsHash; } @Override @@ -343,9 +405,8 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { this.seed = seed; } - public void setSetting(LedgerSetting setting) { - // copy a new instance; - this.setting = new LedgerConfiguration(setting); + public void setSettingsHash(HashDigest settingHash) { + this.settingsHash = settingHash; } public void setParticipantsHash(HashDigest participantsHash) { diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java index 5605003c..e727c5ad 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java @@ -1,10 +1,10 @@ package com.jd.blockchain.ledger.core; import com.jd.blockchain.ledger.CryptoSetting; -import com.jd.blockchain.ledger.LedgerSetting; +import com.jd.blockchain.ledger.LedgerSettings; import com.jd.blockchain.utils.Bytes; -public class LedgerConfiguration implements LedgerSetting { +public class LedgerConfiguration implements LedgerSettings { private String consensusProvider; @@ -16,7 +16,7 @@ public class LedgerConfiguration implements LedgerSetting { this.cryptoSetting = new CryptoConfig(); } - public LedgerConfiguration(LedgerSetting origSetting) { + public LedgerConfiguration(LedgerSettings origSetting) { if (origSetting != null) { this.consensusProvider = origSetting.getConsensusProvider(); this.consensusSetting = origSetting.getConsensusSetting(); 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/impl/LedgerRepositoryImpl.java index 1fe559b7..9505aaad 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/impl/LedgerRepositoryImpl.java @@ -478,7 +478,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { return newDataSet; } - static TransactionSet newTransactionSet(LedgerSetting ledgerSetting, String keyPrefix, + static TransactionSet newTransactionSet(LedgerSettings ledgerSetting, String keyPrefix, ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { // TransactionSet transactionSet = new // TransactionSet(ledgerSetting.getCryptoSetting(), 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/impl/LedgerTransactionalEditor.java index c4b696c0..1f63302f 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/impl/LedgerTransactionalEditor.java @@ -13,7 +13,7 @@ import com.jd.blockchain.ledger.IllegalTransactionException; import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerDataSnapshot; import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.LedgerSetting; +import com.jd.blockchain.ledger.LedgerSettings; import com.jd.blockchain.ledger.LedgerTransaction; import com.jd.blockchain.ledger.OperationResult; import com.jd.blockchain.ledger.TransactionContent; @@ -115,7 +115,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { * @param verifyTx 是否校验交易请求;当外部调用者在调用前已经实施了验证时,将次参数设置为 false 能够提升性能; * @return */ - public static LedgerTransactionalEditor createEditor(LedgerBlock previousBlock, LedgerSetting ledgerSetting, + public static LedgerTransactionalEditor createEditor(LedgerBlock previousBlock, LedgerSettings ledgerSetting, String ledgerKeyPrefix, ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { // new block; HashDigest ledgerHash = previousBlock.getLedgerHash(); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java index 401c5de2..7fbef523 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java @@ -8,7 +8,7 @@ import static org.junit.Assert.assertTrue; import java.util.Random; import com.jd.blockchain.ledger.LedgerMetadata; -import com.jd.blockchain.ledger.LedgerSetting; +import com.jd.blockchain.ledger.LedgerSettings; import org.junit.Before; import org.junit.Test; @@ -119,8 +119,8 @@ public class LedgerMetaDataTest { LedgerConfiguration ledgerConfiguration = new LedgerConfiguration(consensusProvider, new Bytes(csSettingsBytes), cryptoConfig); - byte[] encodeBytes = BinaryProtocol.encode(ledgerConfiguration, LedgerSetting.class); - LedgerSetting deLedgerConfiguration = BinaryProtocol.decode(encodeBytes); + byte[] encodeBytes = BinaryProtocol.encode(ledgerConfiguration, LedgerSettings.class); + LedgerSettings deLedgerConfiguration = BinaryProtocol.decode(encodeBytes); // verify start assertTrue(ledgerConfiguration.getConsensusSetting().equals(deLedgerConfiguration.getConsensusSetting())); assertEquals(ledgerConfiguration.getCryptoSetting().getAutoVerifyHash(), diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java index 4d7a57b0..6ab04c89 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java @@ -6,31 +6,45 @@ import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.crypto.HashDigest; -@DataContract(code = DataCodes.METADATA) +/** + * 账本的元数据; + * + * @author huanghaiquan + * + */ +@DataContract(code = DataCodes.METADATA, name = "LEDGER-METADATA") public interface LedgerMetadata { - /** - * 账本的初始化种子; - * - * @return - */ - @DataField(order = 1, primitiveType = PrimitiveType.BYTES) - byte[] getSeed(); + /** + * 账本的初始化种子; + * + * @return + */ + @DataField(order = 1, primitiveType = PrimitiveType.BYTES) + byte[] getSeed(); - /** - * 共识参与方的默克尔树的根; - * - * @return - */ - @DataField(order = 2, primitiveType = PrimitiveType.BYTES) - HashDigest getParticipantsHash(); + /** + * 共识参与方的默克尔树的根; + * + * @return + */ + @DataField(order = 2, primitiveType = PrimitiveType.BYTES) + HashDigest getParticipantsHash(); - /** - * 账本配置; - * - * @return - */ - @DataField(order = 3, refContract = true) - LedgerSetting getSetting(); +// /** +// * 账本配置; +// * +// * @return +// */ +// @DataField(order = 3, refContract = true) +// LedgerSetting getSetting(); + + /** + * 账本配置的哈希; + * + * @return + */ + @DataField(order = 3, primitiveType = PrimitiveType.BYTES) + HashDigest getSettingsHash(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata_V2.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata_V2.java new file mode 100644 index 00000000..1fbe075e --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata_V2.java @@ -0,0 +1,27 @@ +package com.jd.blockchain.ledger; + +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.crypto.HashDigest; + +/** + * {@link LedgerMetadata_V2} 是 {@link LedgerMetadata} 的升级版本,新增加了 + * {@link #getPrivilegeHash()} 属性; + * + * @author huanghaiquan + * + */ +@DataContract(code = DataCodes.METADATA, name = "LEDGER-METADATA-V2") +public interface LedgerMetadata_V2 extends LedgerMetadata { + + /** + * 加入新的版本; + * + * @return + */ + @DataField(order = 4, primitiveType = PrimitiveType.BYTES) + HashDigest getPrivilegeHash(); + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSetting.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSettings.java similarity index 95% rename from source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSetting.java rename to source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSettings.java index 1a0441bd..76e2ad2c 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSetting.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSettings.java @@ -8,7 +8,7 @@ import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.utils.Bytes; @DataContract(code = DataCodes.METADATA_LEDGER_SETTING) -public interface LedgerSetting { +public interface LedgerSettings { @DataField(order=0, primitiveType=PrimitiveType.TEXT) String getConsensusProvider();