内置类型
为了更好的将Java合约的编写更加的适应区块链,我们提供了两种内置的类型
HyperMap
和HyperList
来更好的操作账本。
HyperMap
HyperMap是HVM内部定义的一种类型,与HashMap类似,都实现了Map接口。而与HashMap不同的是在账本的操作上,HashMap一直是以整个map对象为单位修改账本的,而HyperMap可以做到对于单个key,value的修改,只会涉及到单个key,value在账本中的操作,而不会涉及到整个map对象
HyperMap的定义如下:
public class HyperMap<K, V> extends HyperCollection<K> implements Map<K, V> {
// write cache includes update, delete and insert operations
private HashMap<K, Node<K, V>> writeCache;
// read cache include latest data
private HashMap<K, V> readCache;
......
}
HyperMap的主要结构就是两个map,一个是写入map,一个是读取缓存map,我们将需要新增或者更改的数据写入到writeCache和readCache中,每次读取的时候先从readCache读取,如果缓存没有命中再从账本中获取。
我们对HashMap和HyperMap在HVM上的测试数据如下:
测试操作 | ||
---|---|---|
初始化 | HashMap >> HyperMap | HashMap >> HyperMap |
插入 | HyperMap > HashMap | HyperMap > HashMap |
读取 | HyperMap > HashMap | HyperMap = HashMap |
删除 | HyperMap > HashMap | HyperMap > HashMap |
遍历 | HyperMap > HashMap | HashMap >> HyperMap |
持久化 | HashMap >> HyperMap | HashMap >> HyperMap |
注: >> 表示远大于
使用场景推荐:HashMap适合小数据量,且变动不频繁的数据,HyperMap适合会持续增长的大数据量,一般情况下都使用HyperMap
HyperList
HyperList是HVM内部定义的一种与ArrayList类似的类型,它是一个有序的JAVA合约账本数据集合,实现了JAVA的List接口,数据以懒加载的形式,减少了内存的使用,提高了更新账本的插入效率。
HyperList的定义如下:
public class HyperList<E> extends HyperCollection<Integer> implements List<E>, Persistable {
// dirty data
private HashMap<Long, E> writeMap;
// cache data
private HashMap<Long, E> cacheMap;
......
}
他的实现原理和hyperMap类似,也是基于两个cache来实现接口功能。
我们对HashMap和HyperMap在HVM上的测试数据如下:
测试操作 | ||
---|---|---|
初始化 | ArrayList >> HyperList | ArrayList >> HyperList |
插入 | HyperList > ArrayList | HyperList > ArrayList |
读取 | HyperList > ArrayList | HyperList = ArrayList |
删除 | HyperList > ArrayList | HyperList > ArrayList |
遍历 | HyperList > ArrayList | ArrayList >> HyperList |
持久化 | ArrayList >> HyperList | ArrayList >> HyperList |
注: >> 表示远大于
使用场景推荐:HashList适合小数据量,且变动不频繁的数据,HyperList适合会持续增长的大数据量,一般情况下都使用HyperList
内置变量
合约内部提供了一些内置方法来获取一些内置的属性值。
sender
:合约方法调用者的地址(当且仅当存在跨合约调用时值会与orgin不同),通过getSender()方法获得。txHash
:当前交易的哈希,通过getTxHash()方法获得。origin
:合约调用者的地址,通过getOrigin()方法获得。blockTimestamp
:交易所在区块的时间戳,通过getBlockTimestamp()方法获得。blockNumber
:交易所在区块,通过getBlockNumber()方法获得。
未来还会提供更多的内置方法。
合约日志
在合约中输出日志的方式如下:
Logger logger = Logger.getLogger(SBank.class);
logger.debug("debug");
logger.info("info");
logger.notice("notice");
logger.warning("warning");
logger.error("error");
logger.critical("critical");
我们提供critical
,error
,warning
,notice
,info
,debug
六种日志等级,且日志级别依次由高到低,日志输出结果会输出到平台的日志文件中。