@@ -1,62 +1,74 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> | <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> | ||||
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> | |||||
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> | |||||
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 --> | |||||
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 --> | |||||
<configuration status="WARN" monitorInterval="60"> | <configuration status="WARN" monitorInterval="60"> | ||||
<!--先定义所有的appender--> | |||||
<appenders> | |||||
<!--这个输出控制台的配置--> | |||||
<console name="Console" target="SYSTEM_OUT"> | |||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> | |||||
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<!--输出日志的格式--> | |||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> | |||||
</console> | |||||
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用--> | |||||
<File name="log" fileName="../logs/test.log" append="false"> | |||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> | |||||
</File> | |||||
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> | |||||
<RollingFile name="PeerRollingInfo" fileName="../logs/peer.out.info.log" | |||||
filePattern="../logs/$${date:yyyy-MM}/peer.out.info-%d{yyyy-MM-dd}-%i.log"> | |||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> | |||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> | |||||
<Policies> | |||||
<TimeBasedTriggeringPolicy/> | |||||
<SizeBasedTriggeringPolicy size="100 MB"/> | |||||
</Policies> | |||||
</RollingFile> | |||||
<RollingFile name="PeerRollingWarn" fileName="../logs/peer.out.warn.log" | |||||
filePattern="../logs/$${date:yyyy-MM}/peer.out.warn-%d{yyyy-MM-dd}-%i.log"> | |||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> | |||||
<Policies> | |||||
<TimeBasedTriggeringPolicy/> | |||||
<SizeBasedTriggeringPolicy size="100 MB"/> | |||||
</Policies> | |||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --> | |||||
<DefaultRolloverStrategy max="20"/> | |||||
</RollingFile> | |||||
<RollingFile name="PeerRollingError" fileName="../logs/peer.out.error.log" | |||||
filePattern="../logs/$${date:yyyy-MM}/peer.out.error-%d{yyyy-MM-dd}-%i.log"> | |||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> | |||||
<Policies> | |||||
<TimeBasedTriggeringPolicy/> | |||||
<SizeBasedTriggeringPolicy size="100 MB"/> | |||||
</Policies> | |||||
</RollingFile> | |||||
</appenders> | |||||
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--> | |||||
<loggers> | |||||
<!--过滤掉spring的一些DEBUG信息--> | |||||
<logger name="org.springframework" level="INFO"></logger> | |||||
<root level="all"> | |||||
<appender-ref ref="Console"/> | |||||
<appender-ref ref="PeerRollingInfo"/> | |||||
<appender-ref ref="PeerRollingWarn"/> | |||||
<appender-ref ref="PeerRollingError"/> | |||||
</root> | |||||
</loggers> | |||||
<!--先定义所有的appender --> | |||||
<appenders> | |||||
<!--这个输出控制台的配置 --> | |||||
<console name="Console" target="SYSTEM_OUT"> | |||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> | |||||
<ThresholdFilter level="error" onMatch="ACCEPT" | |||||
onMismatch="DENY" /> | |||||
<!--输出日志的格式 --> | |||||
<PatternLayout | |||||
pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" /> | |||||
</console> | |||||
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用 --> | |||||
<File name="log" fileName="../logs/test.log" append="false"> | |||||
<PatternLayout | |||||
pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" /> | |||||
</File> | |||||
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> | |||||
<RollingFile name="PeerRollingInfo" | |||||
fileName="../logs/peer.out.info.log" | |||||
filePattern="../logs/$${date:yyyy-MM}/peer.out.info-%d{yyyy-MM-dd}-%i.log"> | |||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> | |||||
<ThresholdFilter level="info" onMatch="ACCEPT" | |||||
onMismatch="DENY" /> | |||||
<PatternLayout | |||||
pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" /> | |||||
<Policies> | |||||
<TimeBasedTriggeringPolicy /> | |||||
<SizeBasedTriggeringPolicy size="100 MB" /> | |||||
</Policies> | |||||
</RollingFile> | |||||
<RollingFile name="PeerRollingWarn" | |||||
fileName="../logs/peer.out.warn.log" | |||||
filePattern="../logs/$${date:yyyy-MM}/peer.out.warn-%d{yyyy-MM-dd}-%i.log"> | |||||
<ThresholdFilter level="warn" onMatch="ACCEPT" | |||||
onMismatch="DENY" /> | |||||
<PatternLayout | |||||
pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" /> | |||||
<Policies> | |||||
<TimeBasedTriggeringPolicy /> | |||||
<SizeBasedTriggeringPolicy size="100 MB" /> | |||||
</Policies> | |||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --> | |||||
<DefaultRolloverStrategy max="20" /> | |||||
</RollingFile> | |||||
<RollingFile name="PeerRollingError" | |||||
fileName="../logs/peer.out.error.log" | |||||
filePattern="../logs/$${date:yyyy-MM}/peer.out.error-%d{yyyy-MM-dd}-%i.log"> | |||||
<ThresholdFilter level="error" onMatch="ACCEPT" | |||||
onMismatch="DENY" /> | |||||
<PatternLayout | |||||
pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" /> | |||||
<Policies> | |||||
<TimeBasedTriggeringPolicy /> | |||||
<SizeBasedTriggeringPolicy size="100 MB" /> | |||||
</Policies> | |||||
</RollingFile> | |||||
</appenders> | |||||
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> | |||||
<loggers> | |||||
<!--过滤掉spring的一些DEBUG信息 --> | |||||
<logger name="org.springframework" level="INFO"></logger> | |||||
<root level="all"> | |||||
<appender-ref ref="Console" /> | |||||
<appender-ref ref="PeerRollingInfo" /> | |||||
<appender-ref ref="PeerRollingWarn" /> | |||||
<appender-ref ref="PeerRollingError" /> | |||||
</root> | |||||
</loggers> | |||||
</configuration> | </configuration> |
@@ -8,7 +8,7 @@ | |||||
<!--这个输出控制台的配置--> | <!--这个输出控制台的配置--> | ||||
<console name="Console" target="SYSTEM_OUT"> | <console name="Console" target="SYSTEM_OUT"> | ||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> | <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> | ||||
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<!--输出日志的格式--> | <!--输出日志的格式--> | ||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> | <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> | ||||
</console> | </console> | ||||
@@ -45,6 +45,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||||
private boolean committed = false; | private boolean committed = false; | ||||
// private BufferedKVStorage baseStorage; | |||||
private BufferedKVStorage bufferedStorage; | private BufferedKVStorage bufferedStorage; | ||||
/** | /** | ||||
@@ -65,6 +66,17 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||||
this.stagedSnapshots.push(startingPoint); | this.stagedSnapshots.push(startingPoint); | ||||
} | } | ||||
/** | |||||
* 创建账本新区块的编辑器; | |||||
* | |||||
* @param ledgerHash | |||||
* @param ledgerSetting | |||||
* @param previousBlock | |||||
* @param ledgerKeyPrefix | |||||
* @param ledgerExStorage | |||||
* @param ledgerVerStorage | |||||
* @return | |||||
*/ | |||||
public static LedgerTransactionalEditor createEditor(HashDigest ledgerHash, LedgerSetting ledgerSetting, | public static LedgerTransactionalEditor createEditor(HashDigest ledgerHash, LedgerSetting ledgerSetting, | ||||
LedgerBlock previousBlock, String ledgerKeyPrefix, ExPolicyKVStorage ledgerExStorage, | LedgerBlock previousBlock, String ledgerKeyPrefix, ExPolicyKVStorage ledgerExStorage, | ||||
VersioningKVStorage ledgerVerStorage) { | VersioningKVStorage ledgerVerStorage) { | ||||
@@ -82,6 +94,15 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||||
ledgerKeyPrefix, txStagedStorage); | ledgerKeyPrefix, txStagedStorage); | ||||
} | } | ||||
/** | |||||
* 创建创世区块的编辑器; | |||||
* | |||||
* @param initSetting | |||||
* @param ledgerKeyPrefix | |||||
* @param ledgerExStorage | |||||
* @param ledgerVerStorage | |||||
* @return | |||||
*/ | |||||
public static LedgerTransactionalEditor createEditor(LedgerInitSetting initSetting, String ledgerKeyPrefix, | public static LedgerTransactionalEditor createEditor(LedgerInitSetting initSetting, String ledgerKeyPrefix, | ||||
ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { | ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { | ||||
LedgerBlockData genesisBlock = new LedgerBlockData(0, null, null); | LedgerBlockData genesisBlock = new LedgerBlockData(0, null, null); | ||||
@@ -39,7 +39,7 @@ import com.jd.blockchain.utils.Bytes; | |||||
import com.jd.blockchain.utils.io.BytesUtils; | import com.jd.blockchain.utils.io.BytesUtils; | ||||
import com.jd.blockchain.utils.net.NetworkAddress; | import com.jd.blockchain.utils.net.NetworkAddress; | ||||
public class LedgerEditerTest { | |||||
public class LedgerEditorTest { | |||||
private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(), | private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(), | ||||
SMCryptoService.class.getName() }; | SMCryptoService.class.getName() }; |
@@ -8,7 +8,7 @@ | |||||
<!--这个输出控制台的配置--> | <!--这个输出控制台的配置--> | ||||
<console name="Console" target="SYSTEM_OUT"> | <console name="Console" target="SYSTEM_OUT"> | ||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> | <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> | ||||
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> | |||||
<!--输出日志的格式--> | <!--输出日志的格式--> | ||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> | <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> | ||||
</console> | </console> | ||||
@@ -10,37 +10,6 @@ import com.jd.blockchain.utils.Bytes; | |||||
*/ | */ | ||||
public interface ExPolicyKVStorage extends BatchStorageService{ | public interface ExPolicyKVStorage extends BatchStorageService{ | ||||
// /** | |||||
// * 返回“键”对应的“值”;<br> | |||||
// * 如果“键”不存在,则返回 null; | |||||
// * | |||||
// * @param key | |||||
// * @return | |||||
// */ | |||||
// byte[] get(String key); | |||||
// | |||||
// /** | |||||
// * 如果满足指定的存在性策略,则创建/更新指定的“键-值”; | |||||
// * | |||||
// * @param key | |||||
// * 键; | |||||
// * @param value | |||||
// * 值; | |||||
// * @param ex | |||||
// * 如果指定 {@link ExPolicy#EXISTING} ,则只有键存在时才更新; <br> | |||||
// * 如果指定 {@link ExPolicy#NOT_EXISTING} ,则只有键不存在时才更新/创建; | |||||
// * @return 如果符合存在性策略,并执行了创建/更新操作,则返回 true,否则返回 false; | |||||
// */ | |||||
// boolean set(String key, byte[] value, ExPolicy ex); | |||||
// | |||||
// /** | |||||
// * 指定的 key 是否存在; | |||||
// * | |||||
// * @param key | |||||
// * @return | |||||
// */ | |||||
// boolean exist(String key); | |||||
/** | /** | ||||
* 返回“键”对应的“值”;<br> | * 返回“键”对应的“值”;<br> | ||||
* 如果“键”不存在,则返回 null; | * 如果“键”不存在,则返回 null; | ||||
@@ -19,65 +19,6 @@ import com.jd.blockchain.utils.Bytes; | |||||
*/ | */ | ||||
public interface VersioningKVStorage extends BatchStorageService { | public interface VersioningKVStorage extends BatchStorageService { | ||||
// /** | |||||
// * Return the latest version entry associated the specified key; | |||||
// * | |||||
// * If the key doesn't exist, then return -1; | |||||
// * | |||||
// * @param key | |||||
// * @return | |||||
// */ | |||||
// long getVersion(String key); | |||||
// | |||||
// /** | |||||
// * Return the specified verson's entry;<br> | |||||
// * | |||||
// * It will return the latest one if the version is -1; <br> | |||||
// * | |||||
// * It will return null if the key or version not exist. | |||||
// * | |||||
// * @param key | |||||
// * @param version | |||||
// * @return | |||||
// */ | |||||
// VersioningKVEntry getEntry(String key, long version); | |||||
// | |||||
// /** | |||||
// * Return the specified verson's value; <br> | |||||
// * | |||||
// * If the specified version of key doesn't exist, then return null;<br> | |||||
// * | |||||
// * If the version is specified to -1, then return the latest version's | |||||
// * value;<br> | |||||
// * | |||||
// * @param key | |||||
// * @param version | |||||
// * @return | |||||
// */ | |||||
// byte[] get(String key, long version); | |||||
// | |||||
// /** | |||||
// * Update the value of the key;<br> | |||||
// * | |||||
// * If key exist, and the specified version equals to latest , then the value is | |||||
// * updated and version is increased by 1;<br> | |||||
// * If key not exist, and the specified version is -1, then the value will be | |||||
// * created and initialized it's version by 0; <br> | |||||
// * | |||||
// * @param key | |||||
// * the key; | |||||
// * @param value | |||||
// * the new value to update if expected version match the actual | |||||
// * version; | |||||
// * @param version | |||||
// * the latest version expected; | |||||
// * @return The latest version entry after setting. <br> | |||||
// * If the version checking fail, or concurrent confliction occur, then | |||||
// * return -1 as indication. <br> | |||||
// */ | |||||
// long set(String key, byte[] value, long version); | |||||
// | |||||
/** | /** | ||||
* Return the latest version entry associated the specified key; | * Return the latest version entry associated the specified key; | ||||
* | * | ||||