您正在查看: Surou 发布的文章

EOS nodeos api 中继模式

今天EOSIO官方开发提交的(New options for api nodes - 2.0) 审核通过了。

配置新增加配置

p2p-accept-transactions

允许评估通过p2p 网络接收的事务(如果有效)
默认值true

api-accept-transactions

允许评估和中继API事务(如果有效)
默认值true

配合read-mode一起使用

speculative

在“投机”模式下:数据库包含区块链中的交易状态变化,直到头块以及尚未包含在区块链中的某些交易。

head

数据库仅通过区块链中直到头部的交易包含状态更改; 如果有效,将中继节点接收到的事务。

配合配置
p2p-accept-transactions = false
api-accept-transactions = true

read-only

数据库仅包含区块链中直到主块的事务的状态更改;
通过P2P网络接收到的交易不会被中继,并且无法通过链API推送交易。
(不推荐使用此模式:可使用 p2p-accept-transactions和api-accept-transactions同为false代替)

irreversible

数据库仅包含区块链中直到最后一个不可逆块的事务的状态更改;
通过P2P网络接收到的交易不会被中继,并且无法通过链API推送交易。

配合配置
p2p-accept-transactions = false
api-accept-transactions = false

注意点

read-onlyirreversible模式下,api-accept-transactionsp2p-accept-transactions会强制修改为false.

更新支持

此时 2.0.4 以支持此更新
https://github.com/EOSIO/eos/releases/tag/v2.0.4

在read-only该选项read-mode的参数nodeos已被弃用。这是可能实现与相同的行为read-mode = head,p2p-accept-transactions = false和api-accept-transactions = false

使用read-mode = irreversiblenow需要进行设置p2p-accept-transactions = false并api-accept-transactions = false避免在启动时进行断言

EOS 2.0之VM改进和参数设置

从EOS 2.0发布到现在有段时间了,今天单独研究下EOS VM的改进,以及相关的参数配置

引用官方介绍

借助EOSIO 2,我们将发布一个名为EOS VM的新WASM引擎,该引擎由三个组件组成,每个组件都有自己的功能并提供特定的性能增强。
区块链WebAssembly执行的强大组件三重奏

EOS VM Interpreter (eos-vm)

EOS VM解释器是一个WebAssembly解释器,提供了极快的解析/加载,确定性和高效的时限执行。从头开始设计解释器,使我们能够为将来对智能合约的调试支持腾出空间。

EOS VM Just In Time Compiler (JIT) (eos-vm-jit)

EOS VM即时(JIT)编译器是一种WebAssembly编译器,它采用WASM并即时生成本机代码。与WABT,Binaryen和EOS VM解释器之类的解释器相比,该体系结构能够非常快速地执行WASM智能合约,并提供显着的性能优势。这种JIT解决方案的绝对速度使我们能够在区块链上使用它,而无需其他解决方案进行较长的块编译时间。

EOS VM Optimized Compiler (eos-vm-oc-enable)

EOS VM Optimized编译器是EOS VM的第三个组件,它使用了利用多遍编译架构的专用编译器框架(LLVM)。通过优化编译器生成的本机代码通常比在WABT,Binaryen,EOS VM解释器和EOS VM JIT中执行的相同代码快一个数量级。最重要的是,它甚至比现有的WAVM引擎还要快,但是与WAVM不同,它可以利用我们的分层设计在区块链上安全使用。

参数配置

开启eos-vm-jit

wasm-runtime = eos-vm-jit

对于wasm-runtime还支持以下选项

  • wabt
  • eos_vm
  • eos_vm_jit
  • eos_vm_oc //EOS VM OC is a tier-up compiler and works in conjunction with the configured base WASM runtime. Enable EOS VM OC via 'eos-vm-oc-enable' option

开启 eos-vm-oc-enable

eos-vm-oc-enable = true

还可修改其他参数

  • eos-vm-oc-cache-size-mb // Maximum size (in MiB) of the EOS VM OC code cache
  • eos-vm-oc-compile-threads // eos-vm-oc-compile-threads must be set to a non-zero value

对于出块节点来说,官方意思EOS VM Optimized编译器还没有足够的实际场景测试,防止各BP节点部分开启与未开启的行为之间可能存在差异的风险,官方建议是在生产节点上不使用eos-vm-oc-enable = true 只单独使用eos-vm-jit
并且由于节点开启后处理会更快,也就是TPS会增加很多,将导致每个块的数据猛增,会导致查询慢,以及可能的稳定因素影响。官方建议先不要使用,等待官方更新支持。
可看此贴 https://github.com/EOSIO/eos/issues/8620

参考

https://eos.io/news/introducing-eosio-2/

EOS Bancor 算法测试

为了实际项目中,解决相对有限资源,异步动态价格交换的问题,测试下Bancor 算法

从EOS系统合约中,抽离出测试代码如下

#include <iostream>
#include <cmath>
#include <list>

typedef double real_type;
int64_t supply_amount = 10000000000000ll;                         // RAMCORE

struct connector {
    int64_t balance;
    double weight = .5;
};

int64_t convert_from_exchange( connector& reserve, const int64_t& tokens_amount )
{
    const double R0 = reserve.balance;
    const double S0 = supply_amount;
    const double dS = -tokens_amount; // dS < 0, tokens are subtracted from supply
    const double Fi = double(1) / reserve.weight;

    double dR = R0 * ( std::pow(1. + dS / S0, Fi) - 1. ); // dR < 0 since dS < 0
    if ( dR > 0 ) dR = 0; // rounding errors
    reserve.balance -= int64_t(-dR);
    supply_amount   -= tokens_amount;
    return int64_t(-dR);
}

int64_t convert_to_exchange( connector& reserve, const int64_t& tokens_amount )
{
    const double S0 = supply_amount;
    const double R0 = reserve.balance;
    const double dR = tokens_amount; // dS < 0, tokens are subtracted from supply
    const double F =  reserve.weight;

    double dS = S0 * ( std::pow(1. + dR / R0, F) - 1. );
    if ( dS < 0 ) dS = 0; // rounding errors
    reserve.balance += tokens_amount;
    supply_amount   += int64_t(dS);
    return int64_t(dS);
}

// RAM / EOS
int main() {
    struct connector base;           // RAM
    base.balance = 90091267903;
    struct connector quote;
    quote.balance = 56842445020ll;   // EOS

    int64_t ram_byte = 0;
    int64_t tokens_amount = 10000000000;
    int64_t total_tokens_amount = 0;
    int64_t total_ram_byte = 0;
    int total_num = 10;                 // 测试循环次数
    std::list <int64_t > list_ram_byte;
    // Buy EOS->RAM
    int64_t tmp = 0;
    for (int i = 0; i < total_num; ++i) {
        tmp = convert_to_exchange( quote, tokens_amount );
        ram_byte = convert_from_exchange( base, tmp );
        total_ram_byte += ram_byte;
        list_ram_byte.push_back(ram_byte);
        total_tokens_amount += tokens_amount;
        std::cout << "Buy EOS->RAM " << ram_byte << std::endl;
    }

    for (int i = 0; i < total_num; ++i) {
        tmp = convert_to_exchange( base, list_ram_byte.back() );
        list_ram_byte.pop_back();
        tokens_amount = convert_from_exchange( quote, tmp );
        std::cout << "One Sell RAM->EOS " << tokens_amount << std::endl;
    }
    // Sell RAM->EOS
    //tmp = convert_to_exchange( base, total_ram_byte );
    //tokens_amount = convert_from_exchange( quote, tmp );
    //std::cout << "One Sell RAM->EOS " << tokens_amount << std::endl;

    return 0;
}

测试结果如下

Buy EOS->RAM 13478152673
Buy EOS->RAM 9970155844
Buy EOS->RAM 7674007724
Buy EOS->RAM 6089163862
Buy EOS->RAM 4949324006
Buy EOS->RAM 4102144882
Buy EOS->RAM 3455335389
Buy EOS->RAM 2950326086
Buy EOS->RAM 2548490488
Buy EOS->RAM 2223515894


Sell RAM->EOS 9999999996
Sell RAM->EOS 10000000000
Sell RAM->EOS 9999999999
Sell RAM->EOS 10000000000
Sell RAM->EOS 9999999998
Sell RAM->EOS 10000000000
Sell RAM->EOS 9999999999
Sell RAM->EOS 10000000000
Sell RAM->EOS 10000000000
Sell RAM->EOS 10000000001

符合预期,剩余资源越少,价格越高的需求

参考

https://zhuanlan.zhihu.com/p/40162089

Windows10 WSL 开启 ssh,CLion远程调试

由于Linux代码调试需要,如果当前开发系统是windows的话,可以选择使用CLion 远程链接 WSL。
所以需要子系统开启ssh

安装 ssh

sudo apt-get install openssh-server

Linux 开启密码登录

sudo vim /etc/ssh/sshd_config

找到passwordAuthentication项,修改成yes
重启ssh服务

sudo service sshd restart

查看服务状态

service ssh status
# * sshd is running  显示此内容则表示启动正常

如果提示 sshd error: could not load host key 则需要重新生成 key

dpkg-reconfigure openssh-server

如需密码设置

sudo passwd user-name

如果启动sshd时,报“Could not load host key”

Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

查看下文件是否存在

ll /etc/ssh/

解决方法,重新生成密钥文件

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

Clion中子系统配置请参考《Clion Windows Linux子系统

如果启动报 ssh:unrecognized service

sudo /etc/init.d/ssh restart
sudo /etc/init.d/ssh start

ubuntu 安装 gdb

sudo apt update
sudo apt install gdb

参考

https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#WSL
https://www.cnblogs.com/netonline/p/7410586.html
https://blog.csdn.net/zhouzme/article/details/81087837
http://www.gdbtutorial.com/tutorial/how-install-gdb