Docs

Docs

  • 文档
  • github

›HVM 智能合约

概述

  • HVM简介
  • HVMD安装
  • 快速开始

HVM 智能合约

  • 合约简介
  • 合约规范
  • 内置类型
  • 注意事项

开始开发

  • 合约模板
  • 应用模板
  • 合约编译
  • SDK使用
  • FAQ

内置类型

为了更好的将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 >> HyperMapHashMap >> HyperMap
插入HyperMap > HashMapHyperMap > HashMap
读取HyperMap > HashMapHyperMap = HashMap
删除HyperMap > HashMapHyperMap > HashMap
遍历HyperMap > HashMapHashMap >> HyperMap
持久化HashMap >> HyperMapHashMap >> 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 >> HyperListArrayList >> HyperList
插入HyperList > ArrayListHyperList > ArrayList
读取HyperList > ArrayListHyperList = ArrayList
删除HyperList > ArrayListHyperList > ArrayList
遍历HyperList > ArrayListArrayList >> HyperList
持久化ArrayList >> HyperListArrayList >> 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六种日志等级,且日志级别依次由高到低,日志输出结果会输出到平台的日志文件中。

← 合约规范注意事项 →
  • HyperMap
  • HyperList
  • 内置变量
  • 合约日志
QTechGitHub
Copyright © 2025 Hyperchain Co., Ltd.