@@ -1,62 +1,74 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!--日志级别以及优先级排序: 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"> | |||
<!--先定义所有的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> |
@@ -8,7 +8,7 @@ | |||
<!--这个输出控制台的配置--> | |||
<console name="Console" target="SYSTEM_OUT"> | |||
<!--控制台只输出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"/> | |||
</console> | |||
@@ -45,6 +45,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||
private boolean committed = false; | |||
// private BufferedKVStorage baseStorage; | |||
private BufferedKVStorage bufferedStorage; | |||
/** | |||
@@ -65,6 +66,17 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||
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, | |||
LedgerBlock previousBlock, String ledgerKeyPrefix, ExPolicyKVStorage ledgerExStorage, | |||
VersioningKVStorage ledgerVerStorage) { | |||
@@ -82,6 +94,15 @@ public class LedgerTransactionalEditor implements LedgerEditor { | |||
ledgerKeyPrefix, txStagedStorage); | |||
} | |||
/** | |||
* 创建创世区块的编辑器; | |||
* | |||
* @param initSetting | |||
* @param ledgerKeyPrefix | |||
* @param ledgerExStorage | |||
* @param ledgerVerStorage | |||
* @return | |||
*/ | |||
public static LedgerTransactionalEditor createEditor(LedgerInitSetting initSetting, String ledgerKeyPrefix, | |||
ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { | |||
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.net.NetworkAddress; | |||
public class LedgerEditerTest { | |||
public class LedgerEditorTest { | |||
private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(), | |||
SMCryptoService.class.getName() }; |
@@ -8,7 +8,7 @@ | |||
<!--这个输出控制台的配置--> | |||
<console name="Console" target="SYSTEM_OUT"> | |||
<!--控制台只输出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"/> | |||
</console> | |||
@@ -10,37 +10,6 @@ import com.jd.blockchain.utils.Bytes; | |||
*/ | |||
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> | |||
* 如果“键”不存在,则返回 null; | |||
@@ -19,65 +19,6 @@ import com.jd.blockchain.utils.Bytes; | |||
*/ | |||
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; | |||
* | |||