# eos-light-node **Repository Path**: eoslh/eos-light-node ## Basic Information - **Project Name**: eos-light-node - **Description**: based on https://github.com/eosforce/eos-light-node we add function that blocknum and blockid are saved in Elasticsearch database for query - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-10 - **Last Updated**: 2021-11-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EOS Light Node ## 0. 介绍 `EOS Light Node`是一个完全基于golang开发的[eosio](https://github.com/EOSIO/eos)节点实现, 与基于nodeos启动的eosio全节点不同, eos-light-node启动的节点仅仅验证eosio链的区块头, 不会执行区块中action, 这样轻节点对运行环境的要求很低. ## 1. 动机 EOSIO的区块头结构支持轻量级的节点,但是当前EOSIO社区中并没有一个可靠的轻量级节点实现。在EOSIO网络中,一个全节点对于机器性能、网络和运维的要求是非常高的,目前EOSIO网络中可用的全节点很少, 这意味着当前EOSIO网络结构强烈的中心化, 对整个网络的稳定性产生了很大影响, 同时这也提高了链上应用的开发和部署难度。 虽然EOSIO的插件式架构可以允许节点拓展功能, 但是节点对机器性能的要求较高, 同时基于C++开发插件需要较高的开发门槛, 因此EOSIO的拓展工具很少, 这也间接提高了DAPP的开发难度. 目前公链发展的一个重要方向是跨链功能的支持, EOSIO支持基于IBC来添加侧链, 目前IBC需要基于全节点以使用户可以获取基于`merkle tree`的证明数据, 但是由于搭建一个全节点的成本过高,即使要求少数验证者和钓鱼者启动全节点也是一件不现实的事,这会使得某些理论上的支持方案从经济成本上不成立,如果跨链的运行仅仅依赖于少数的全节点提供的服务, 那么整个系统将会十分脆弱。 综合以上问题, 我们需要一个足够轻量级的EOSIO节点实现, 轻节点在保证对区块的验证同时, 应当易于拓展和二次开发. ## 2. 设计 EOSIO对节点高需求的一个主要原因即使其内存(RAM)状态,这些状态十分庞大且没有在区块中验证,所以任何一个想要获取任意状态的节点都需要完整的重放一遍EOSIO的区块,虽然可以通过快照功能复原节点,但即使对于保持同步的节点,一旦出现故障其复原时间也比较漫长。同时由于EOSIO链上的事务比较繁忙,峰值时可达4000 TPS左右,同步实时的EOSIO区块也会对机器的要求较高。 综合以上考虑,EOS轻节点不会处理每一个事务,而仅仅验证区块与区块头的有效性,同时确认其区块不可逆。 不处理每一个事务意味轻节点的大部分工作可以并行完成,而且也可以从任意区块高度开始同步,在目前的原型实现中,轻节点只需占用很少的计算资源即可完成验证。 不处理每一个事务虽然允许轻节点占用很少的资源,但是也使得轻节点无法提供EOS的内存(RAM)状态,而在EOS中几乎所有的状态都在内存中,一些操作(EOS称之为Action)也需要通过执行事务来触发,这就需要一些断言机制来保证节点仅仅基于区块数据就可以可信的获得EOS的状态,这可以通过EOS状态断言合约和状态静态断言合约来实现。 根据EOS轻节点所负担的角色的不同,我们将EOS轻节点分为区块节点和区块头节点,前者包含全部或部分EOS区块,后者只包括EOS区块头数据。 考虑到EOSIO还在不断的发展中, EOS轻节点也需要跟随其进行迭代, 所以EOS轻节点的设计应该尽可能的和eosio保持同构, 其API与操作也应该尽可能与nodeos保持统一, 当然, 轻节点不含内存状态, 所以一些API, 如`get table`等. 轻节点基于golang开发, 这可以使得轻节点能够很容易在多种环境下运行, 同时golang在后端开发中应用很多, 也适合基于轻节点开发数据服务等应用. ## 3. Getting Start EOSIO轻节点基于golang开发, 首先可以参照[golang](https://golang.org/dl/)安装golang环境 ### 3.1 编译 ```bash git clone xxxx cd eos-light-node go build ``` ### 3.2 启动 这里假设 eosio 可用的 p2p url 为 `127.0.0.1:9001`, chain-id 为 `1c6ae7719a2a3b4ecb19584a30ff510ba1b6ded86e1fd8b8fc22f1179c622a32` ```bash ./eos-light-node -v -genesis "./eosio/config/genesis.json" -chain-id "1c6ae7719a2a3b4ecb19584a30ff510ba1b6ded86e1fd8b8fc22f1179c622a32" -p2p "127.0.0.1:9001" \ -es 127.0.0.1:9200 -bind 0.0.0.0:8080 ``` es:elasticsearch的地址 bind: 查询API服务地址 > *注意* : 由于当前可用的eosio p2p地址很少, 所以可以基于eosio的boot脚本启动本地测试网测试. ### 3.3 查询 ``` curl http://127.0.0.1:8080/v1/chain/get_block?block_num=块号 curl http://127.0.0.1:8080/v1/chain/get_block?block_id=块id ``` ## 4. docker部署 ### 4.1 Dockerfile ```dockerfile FROM golang:latest AS git ENV GOPROXY=https://goproxy.cn,direct WORKDIR /app RUN git clone https://gitee.com/eoslh/eos-light-node.git FROM golang:alpine AS builder ENV GOPROXY=https://goproxy.cn,direct WORKDIR /app/eos-light-node COPY --from=git /app/eos-light-node /app/eos-light-node RUN go build . FROM alpine:latest AS runner WORKDIR /app/eos-light-node COPY --from=builder /app/eos-light-node/eos-light-node /app/eos-light-node/eos-light-node EXPOSE 8080 ENTRYPOINT ./eos-light-node $0 $@ ``` ### 4.2 docker启动命令 ```bash docker run -itd -v /root/eos-light-node:/data/eos-light-node -p 8080:8080 --name eos-light-node eos-light-node:v1.0.0 -v -genesis="/data/eos-light-node/genesis.json" -chain-id="adbde9c4f0dab8924d67970248cde248194bb39447a270c95afd422075b94ad8" -p2p="10.0.42.57:3922" -es="10.0.42.61:39200" -bind="0.0.0.0:8080" ``` ## 5. TODOs 目前EOSIO轻节点还在开发中, 未来将会完成以下功能: - 完善区块存储实现, 兼容nodeos的block db - 实现与nodos一致的不可逆块判定算法 - 支持其他节点从轻节点同步区块与事务 - 完善API接口以尽可能兼容nodeos - 优化并发计算能力, 加速同步过程 - 支持eos-vm以实现部分Action的执行