BCSkill (Block chain skill )
区块链中文技术社区

只讨论区块链底层技术
遵守一切相关法律政策!

根据公钥生成账户名

/**
 * @module AccountName
 */
import * as bs58 from 'bs58';

import * as Long from 'long';

const { PublicKey } = require('./ecc');

/**
    Hashes a public key to a valid FIOIO account name.
    @arg {string} pubkey
    @return {string} valid FIOIO account name
*/
export function accountHash(pubkey : string) : string {
    if(!PublicKey.isValid(pubkey, 'EOS')) {
        throw new TypeError('invalid public key');
    }

    pubkey = pubkey.substring('EOS'.length, pubkey.length);

    const decoded58 = bs58.decode(pubkey);
    const long = shortenKey(decoded58);

    const output = stringFromUInt64T(long);
    return output;
}

function shortenKey(key : [number]) : any {
  var res = Long.fromValue (0, true);
  var temp = Long.fromValue (0, true);
  var toShift = 0;
  var i = 1;
  var len = 0;

  while (len <= 12) {
      //assert(i < 33, "Means the key has > 20 bytes with trailing zeroes...")
      temp = Long.fromValue(key[i], true).and(len == 12 ? 0x0f : 0x1f);
      if (temp == 0) {
          i+=1
          continue
      }
      if (len == 12){
        toShift = 0;
      }
      else{
        toShift = (5 * (12 - len) - 1);
      }
      temp = Long.fromValue(temp, true).shiftLeft(toShift);

      res = Long.fromValue(res, true).or(temp);
      len+=1
      i+=1
  }

  return res;
}

function stringFromUInt64T(temp : any) : string{
  var charmap = ".12345abcdefghijklmnopqrstuvwxyz".split('');

  var str = new Array(13);
  str[12] = charmap[Long.fromValue(temp, true).and(0x0f)];

  temp = Long.fromValue(temp, true).shiftRight(4);
  for (var i = 1; i <= 12; i++) {
      var c = charmap[Long.fromValue(temp, true).and(0x1f)];
      str[12 - i] = c;
      temp = Long.fromValue(temp, true).shiftRight(5);
  }
  var result = str.join('');
  if (result.length > 12) {
      result = result.substring(0, 12);
  }
  return result;
}

测试

describe('accountname', () => {
    it('matches', () => {
        const samplekey = "EOS7isxEua78KPVbGzKemH4nj2bWE52gqj8Hkac3tc7jKNvpfWzYS";
        const accountHash = AccountName.accountHash(samplekey);
        expect(accountHash).toEqual('p4hc54ppiofx');
    })
})

激活 ACTION_RETURN_VALUE

激活动作返回值协议

cleos push action eosio activate '["c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071"]'

查询是否已开启

curl -X POST http://localhost:8888/v1/producer/get_supported_protocol_features | jq -r
...
{                                                                                                                                      
    "feature_digest": "c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071",
    "subjective_restrictions": {
      "enabled": true,
      "preactivation_required": true,
      "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"
    },
    "description_digest": "69b064c5178e2738e144ed6caa9349a3995370d78db29e494b3126ebd9111966",
    "dependencies": [],
    "protocol_feature_type": "builtin",
    "specification": [
      {
        "name": "builtin_feature_codename",
        "value": "ACTION_RETURN_VALUE"
      }
    ]
  }
...

EOS 链mongo 节点数据分片shard key 选取

由于目前旧链还是基于链mongo同步节点存储数据,mongo服务使用的阿里云云数据库 MongoDB,单片存储已经接近最大存储值(2T),所以需要做分片扩容。
主要的注意点有

  1. 每个表 shard key的选择,以及如何设置
  2. 检查各片均衡同步是否正常

shard key选择

每个表shard key的选择要查看链源码mongo插件源码中的upsert(true)所对应的update_one的查询索引进行一致设置,否则会报错

codeName" : "ShardKeyNotFound", "errmsg" : "Failed to target upsert by query :: could not extract exact shard key"

upsert = true, 是说使用update_one代替insert_one,这样方便去重,如果不存在则insert,存在则update。
对于mongo分片集合建立的索引要与各表upsert=trueupdate_one所需的查询索引一致。

对于upsert=true 各表索引如下

account_controls
  1. controlled_account
  2. controlled_permission
  3. controlling_account
accounts
  1. name
action_traces

block_states
  1. block_id

如果开启了mongodb-update-via-block-num

  1. block_num
blocks
  1. block_id

如果开启了mongodb-update-via-block-num

  1. block_num
pub_keys
  1. account
  2. public_key
  3. permission
transaction_traces

transactions
  1. trx_id

设置shard key

参考: https://helpcdn.aliyun.com/document_detail/99411.html

所在的数据库启用分片功能

sh.enableSharding("EOS")

transactions

db.transactions.createIndex({trx_id:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.transactions",{"trx_id":1}) // 对集合设置数据分片。
trx_id 不存在添加shard key出错
"message" : "There are documents which have missing or incomplete shard key fields ({ : null }). Please ensure that all documents in the collection include all fields from the shard key.",

将没有trx_id的记录删掉,此记录为无效数据

db.transactions.deleteMany({trx_id: {$exists: false}})
generic server error

由于空交易块,会不存在trx_id,导致upsert失败,所以将空块排除
config增加

mongodb-filter-out = eosio:onblock:

blocks

db.blocks.createIndex({block_id:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.blocks",{"block_id":1}) // 对集合设置数据分片。

block_states

db.block_states.createIndex({block_id:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.block_states",{"block_id":1}) // 对集合设置数据分片。

account_controls

db.account_controls.createIndex({controlled_account:1})                // 对片键的字段建立索引
db.account_controls.createIndex({controlled_permission:1})             // 对片键的字段建立索引
db.account_controls.createIndex({controlling_account:1})               // 对片键的字段建立索引

sh.shardCollection("EOS.account_controls",{"controlled_account":1})    // 对集合设置数据分片。

accounts

db.accounts.createIndex({name:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.accounts",{"name":1}) // 对集合设置数据分片。

pub_keys

db.pub_keys.createIndex({account:1})                // 对片键的字段建立索引
db.pub_keys.createIndex({public_key:1})             // 对片键的字段建立索引
db.pub_keys.createIndex({permission:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.pub_keys",{"account":1})    // 对集合设置数据分片。
sh.shardCollection("EOS.pub_keys",{"public_key":1}) // 对集合设置数据分片。
sh.shardCollection("EOS.pub_keys",{"permission":1}) // 对集合设置数据分片。

其他表

对于其他表,并没有用到upsert=true,所以可以根据需要做处理

action_traces
db.action_traces.createIndex({trx_id:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.action_traces",{"trx_id":1}) // 对集合设置数据分片。
transaction_traces
db.transaction_traces.createIndex({id:1})             // 对片键的字段建立索引
sh.shardCollection("EOS.transaction_traces",{"id":1}) // 对集合设置数据分片。

操作细节

买好阿里的云数据库 MongoDB,再附加买一个分片,此时查看db.stats()
能看到2个分片存储

{
    "raw" : {
        "mgset-40806644/..." : {
            "db" : "EOS",
            ...
            "ok" : 1.0
        },
        "mgset-40806643/..." : {
            "db" : "EOS",
            ...
            "ok" : 1.0
        }
    },
    "objects" : 767319,
    ...
}

配置好同步节点,先往数据库推送链数据
此时看到,只有mgset-40806643在增加数据,因为我们还没有让数据库做分片处理

设置分片

细节就是执行上面的设置shard key
每增加一个shardCollection,发现"mgset-40806644中的collections会对应的增加(需要数量到一定级别(2个chunk以上,1个chunk默认是64MB,sh.status()查看chunk数量)才会做均衡,第一次均衡后新加的分片才会创建对应的集合)
添加shardCollection后,对应集合的索引会自动同步过去
查看对应表的stats,比如db.action_traces.stats(),能看到sharded = true

注意

对于上面的操作,大部分索引已经默认添加,无需重复操作,但是对于用到upsert=true的表shardCollection必须与插件一致,否则报ShardKeyNotFound

参考

https://docs.mongodb.com/manual/core/sharding-shard-key/?spm=a2c4g.11186623.2.25.544e1d8d2ORfYO#choosing-a-shard-key
https://help.aliyun.com/document_detail/100658.html?spm=a2c4g.11186623.6.762.5b3155f12yRKuU
https://helpcdn.aliyun.com/document_detail/99411.html

HFish 一个最便捷的蜜罐平台

https://hfish.io/

什么是 HFish

HFish 是一款基于 Golang 开发的跨平台多功能主动诱导型开源蜜罐框架系统,为了企业安全防护做出了精心的打造,全程记录黑客攻击手段,实现防护自主化。

  • 多功能 不仅仅支持 HTTP(S) 蜜罐,还支持 SSH、SFTP、Redis、Mysql、FTP、Telnet、暗网
  • 扩展性 提供 API 接口,使用者可以随意扩展蜜罐模块 ( WEB、PC、APP )
  • 便捷性 使用 Golang + SQLite 开发,使用者可以在 Win + Mac + Linux 上快速部署一套蜜罐平台

什么是蜜罐

蜜罐 技术本质上是一种对攻击方进行 欺骗的技术,通过布置一些作为 诱饵的主机、网络服务 或者 信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行 捕获 和 分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。

蜜罐 好比是 情报收集系统。蜜罐好像是故意让人攻击的目标,引诱黑客前来攻击。所以攻击者入侵后,你就可以知道他是如何得逞的,随时了解针对服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系,收集黑客所用的种种工具,并且掌握他们的社交网络。

基于Python的开源量化交易系统开发框架

开源地址: https://github.com/vnpy/vnpy

功能特点

  1. 全功能量化交易平台(vnpy.trader),整合了多种交易接口,并针对具体策略算法和功能开发提供了简洁易用的API,用于快速构建交易员所需的量化交易应用。

  2. 覆盖国内外所有交易品种的交易接口(vnpy.gateway):

    • 国内市场

      • CTP(ctp):国内期货、期权

      • CTP Mini(mini):国内期货、期权

      • CTP证券(sopt):ETF期权

      • 飞马(femas):国内期货

      • 恒生UFT(uft):国内期货、ETF期权

      • 飞创证券(sec):ETF期权

      • 宽睿(oes):国内证券(A股)、ETF期权

      • 中泰XTP(xtp):国内证券(A股)、ETF期权

      • 恒生期权(hsoption):ETF期权

      • 华鑫奇点(tora):国内证券(A股)、ETF期权

      • 飞鼠(sgit):黄金TD、国内期货

      • 金仕达黄金(ksgold):黄金TD

      • 鑫管家(xgj):期货资管

      • 融航(rohon):期货资管

      • 中汇亿达(comstar):银行间市场

    • 海外市场

      • 富途证券(futu):港股、美股

      • 老虎证券(tiger):全球证券、期货、期权、外汇等

      • Interactive Brokers(ib):全球证券、期货、期权、外汇等

      • 易盛9.0外盘(tap):全球期货

      • 直达期货(da):全球期货

      • MetaTrader 5(mt5):外汇、CFD、期货、股票

      • Alpaca(alpaca):美股(零佣金)

      • 佳兆业投资(kasia):港股

    • 数字货币

      • BitMEX(bitmex):数字货币期货、期权、永续合约

      • Bybit(bybit):数字货币永续合约

      • 币安(binance):数字货币现货

      • 币安永续(binances):数字货币永续合约

      • OKEX(okex):数字货币现货

      • OKEX永续(okexs):数字货币永续合约

      • OKEX期货(okexf):数字货币期货

      • OKEX期权(okexo):数字货币期权

      • 火币(huobi):数字货币现货

      • 火币期货(huobif):数字货币期货

      • 火币永续(huobis):数字货币永续

      • 火币期权(huobio):数字货币期权

      • Gate.io永续(gateios):数字货币永续合约

      • Deribit(deribit),数字货币期权、永续合约

      • Bitfinex(bitfinex):数字货币现货

      • Coinbase(coinbase):数字货币现货

      • Bitstamp(bitstamp):数字货币现货

      • 1Token(onetoken):数字货币券商(现货、期货)

    • 特殊应用

      • RPC服务(rpc):跨进程通讯接口,用于分布式架构
  3. 开箱即用的各类量化策略交易应用(vnpy.app):

    • cta_strategy:CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)

    • cta_backtester:CTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面直接进行策略回测分析、参数优化等相关工作

    • spread_trading:价差交易模块,支持自定义价差,实时计算价差行情和持仓,支持半自动价差算法交易以及全自动价差策略交易两种模式

    • option_master:期权交易模块,针对国内期权市场设计,支持多种期权定价模型、隐含波动率曲面计算、希腊值风险跟踪等功能

    • portfolio_strategy:组合策略模块,面向同时交易多合约的量化策略(Alpha、期权套利等),提供历史数据回测和实盘自动交易功能

    • algo_trading:算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、Iceberg、BestLimit等,支持对接外部智能算法交易服务(如金纳算法)

    • script_trader:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能

    • market_radar:市场雷达模块,允许用户基于自定义的公式实时计算任意合约组合数据,公式支持标准Python运算语法以及内置函数

    • paper_account:模拟交易模块,纯本地化实现的模拟交易功能,基于交易接口获取的实时行情进行委托撮合,提供委托成交推送以及持仓记录

    • chart_wizard:K线图表模块,基于RQData数据服务(期货)或者交易接口(数字货币)获取历史数据,并结合Tick推送显示实时行情变化

    • portfolio_manager:投资组合模块,面向各类基本面交易策略,以独立的策略子账户为基础,提供交易仓位的自动跟踪以及盈亏实时统计功能

    • rpc_service:RPC服务模块,允许将某一VN Trader进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统

    • data_manager:历史数据管理模块,通过树形目录查看数据库中已有的数据概况,选择任意时间段数据查看字段细节,支持CSV文件的数据导入和导出

    • data_recorder:行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化

    • excel_rtd:Excel RTD(Real Time Data)实时数据服务,基于pyxll模块实现在Excel中获取各类数据(行情、合约、持仓等)的实时推送更新

    • risk_manager:风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能