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

EOS合约内解析json

示例代码

//demo.hpp
#pragma once

#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
#include "json.hpp"
#include <string>

using json = nlohmann::json;
using eosio::contract;
using eosio::multi_index;
using eosio::print;

class[[eosio::contract]] demo : public contract
{
  public:
    using contract::contract;

    [[eosio::action]] void demoaction();
};
//demo.cpp
#include "demo.hpp"
using json = nlohmann::json;

// ACTION
void demo::demoaction()
{
    json demoInfo = R"(
    {
        "demoInfo": {
            "hello": "world"
        }
    }
    )"_json;
    std::string demoInfoString = demoInfo.dump();
    json demoInfoJson = json::parse(demoInfoString);
    print("It worked\n");
}

EOSIO_DISPATCH(demo, (demoaction))

json.hpp从https://github.com/nlohmann/json/releases 下载并将其放在同一目录中demo.hpp。

参考

https://github.com/EOSIO/eosio.cdt/issues/110

Error compiling LLVM and clang with EXPERIMENTAL WASM support

解决方案:

cd /tmp/llvm-compiler/llvm/build
make -j4 install
rm -rf /tmp/llvm-compiler

最终一般会安装在$HOME/opt/wasm
参考地址:https://github.com/EOSIO/eos/issues/1694

更换Ubuntu镜像,解决EOS编译时,相关依赖下载失败

最近更新EOS代码,由于历史上最伟大的发明qiang,导致编译过程中某些依赖下载失败,so..

ubuntu 18.04

Ubuntu 的软件源配置文件是 /etc/apt/sources.list。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用 TUNA 的软件源镜像。

#备份
sudo cp -i /etc/apt/sources.list /etc/apt/sources.list.bak
#编辑
sudo vi /etc/apt/sources.list

将文件内容修改为如下

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

保存后,重新sudo apt-get update后,重新编译

数据来源

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
http://mirrors.ustc.edu.cn/help/ubuntu.html

EOS Encrypt

EOS Encrypt

github: https://github.com/EOS-Nation/eos-encrypt

Allows to encrypt & decypt a message with an EOS key pair using AES shared key encryption mechanism.

Decryption is achieved by combining the receiver's private key and the sender's public key to create the private key necessary to decrypt the message.

This module uses eosjs-ecc to perform the required cryptographic operations.

Install

npm

$ npm install --save eos-encrypt

Usage

import { encrypt, decrypt } from 'eos-encrypt';

const public_key = "EOS6M...DW5CV";
const private_key = "5KQwr...zkvFD3";

const message = "Private Message, shhhh!";
const encrypted = encrypt(private_key, public_key, message);
// => TO DECRYPT: eos-encrypt
// .1167451677...23460624..862584768Q+h1AeLQbjfzZJD1Nsx6kk3U/jSNStwoWstz9uNCadw=

const decrypted = decrypt(private_key, public_key, encrypted);
// => Private Message, shhhh!

API

Table of Contents

encrypt

Encrypt Message

Parameters

  • private_key string EOSIO Private Key
  • public_key string EOSIO Public Key
  • message string Message to Encrypt
  • options object Optional parameters (optional, default {})
    • options.memo string Serialized Memo (optional, default "TO DECRYPT: eos-encrypt\n")
    • options.maxsize number Maximum character message size (optional, default 256)

Examples

const encrypted = encrypt(private_key, public_key, message);

Returns string Encrypted Message

decrypt

Decrypt Message

Parameters

  • private_key string EOSIO Private Key
  • public_key string EOSIO Public Key
  • message string Encrypted Message
  • options object Optional parameters (optional, default {})
    • options.memo string Serialized Memo (optional, default "TO DECRYPT: eos-encrypt\n")

Examples

const decrypted = decrypt(private_key, public_key, message);

Returns string Decrypted Message

setMemo

Set Default Memo

Parameters

Examples

setMemo("TO DECRYPT: my-dapp\n");

Returns void

EosProxyServer 实时汇率,错误代码规范,运营账号

直接黏贴Readme了,项目需要参考里面的EOS错误代码规范,转贴推荐下

ENGLISH VERSION

关于

EosProxyServer是PocketEOS的完整的后端服务器,由OracleChain团队研发。


目录


简介

本仓库为PocketEOS的完整后端代码,大家可以自行编译使用。

本项目提供什么:

 1.接入实时汇率:这里我们主要参考了coinmarketcap,该网站对接了多个交易所,相对来说比较值得信赖;

 2.通用EOS错误代码规范:提供基于错误码的国际化标准,可以较大程度提升用户体验,同时便于教育用户了解EOS底层发生了什么;

 3.服务器中配置公司运营账号,通过接口验证后,发出交易,为用户创建账号。

 4.服务器可以发起交易:可以实现比如创建用户、运营转账、空投、各种合约调用等。


开发和使用环境

如何从源码编译EosProxyServer服务器:

  1. 准备一个redis服务器用于缓存第三方汇率

  2. 安装IntelliJ IDEA + jdk1.8 + maven 4.0.0

  3. 下载
     git clone https://github.com/OracleChain/EosProxyServer.git

  4. 使用IntelliJ IDEA导入到工程

  5. 编辑服务器配置文件 src/main/resources/application.yml.

 host: redis_server_ip

 port: 6379

 password: redis_passwd

  1. 编辑服务器主动交易相关参数 src/main/java/com/oraclechain/eosio/constants/Variables.java.

 public static final String eosAccount = "tx_account_name";

 public static final String eosPrivateKey = "tx_private_key";

  1. 编译运行.

  2. 可以使用POSTMAN或浏览器进行测试:


API使用


异常捕获

为了给客户端提供一个稳定使用环境、平滑的版本切换、统一的错误定位和提示,我们全局捕获了EOS RPC接口中的异常,并且针对各种错误接口调用进行了封装。

通过返回完全可靠的错误代码,客户端就可以根据欧链定制的错误代码集,进行国际化,并且和EOS升级前后版本进行兼容。

EOS代码中,异常主要分为三层:

第一层为FC layer,主要处理graphene FC工具类产生的异常。

第二层为CHAIN layer,主要处理EOS逻辑代码中的异常。

第三层为contract layer,可在合约中形成规范,除了给用户提供统一的错误代码外,还可定制一些适用于特定合约的特定错误代码。如果你定制了合约层错误,可以在我们的统一错误错误抓取类中解析合约错误.

另外,我们发起了一个EOS错误码的国际化项目,提供给客户端使用:EOSIO API ERROR CODE SPECIFICATION。如果你对维护这个项目感兴趣,可以通过telegram联系我们.

FC层异常

EOS的底层框架使用的是graphene,而graphene抛出的错误被统一定制到了FC exceptions文件中。

我们这里为了把错误码统一起来,对FC error code进行了统一偏移.

链层异常

EOS中的主要错误都是CHAIN exception,这里我们对错误代码进行了直接引用


对接新币种

对接新币种

下面以oraclechain token为例,合约地址为octtothemoon,货币符号为OCT

1.修改dto/AccountAssetInfo.java实体,用于下面的接口返回:

private String oct_balance;
private String oct_balance_usd;
private String oct_balance_cny;
private String oct_price_usd;
private String oct_price_cny;
private String oct_price_change_in_24h;
private String oct_market_cap_usd;
private String oct_market_cap_cny;

2.修改controller/QueryTabController.java中的接口get_account_asset,以支持返回更多币种和相应市场汇率等参数:

//获取用户余额,此处传入
BigDecimal oct_balance = blockServiceEos.getBalance(
    Variables.eosChainUrl,
    "octtothemoon",
    "OCT",
    "octgenerator");

//获取第三方汇率,并且加入缓存(此处缓存的刷新方式比较简单粗暴,大家可以在流量更大之后修改)
redis_key = Variables.redisKeyPrefixBlockchain+ Variables.redisKeyEosCoinmarketcapMid+ "oct";
CoinMarketTicker coinMarketTicker_oct = redisService.get(redis_key, CoinMarketTicker.class);
if(coinMarketTicker_oct == null){
    try{
        req_url.append(Variables.COINMARKETCAP_TICKER).append("oct").append("?convert=CNY");
        result = HttpClientUtils.get(req_url.toString(), "UTF-8");
        coinMarketTicker_oct  = JSON.parseArray(result, CoinMarketTicker.class).get(0);
        redisService.set(redis_key, coinMarketTicker_oct, Variables.redisCacheTimeout);
    }
    catch (Exception e)
    {
        throw new ExceptionsChain(ErrorCodeEnumChain.unknown_market_id_exception);
    }
}

//接下来设置需要返回的用户余额
BigDecimal oct_usd_price = new BigDecimal(coinMarketTicker.getPrice_usd());
BigDecimal oct_cny_price = new BigDecimal(coinMarketTicker.getPrice_cny());
double oct_price_change_in_24h = Double.valueOf(coinMarketTicker.getPercent_change_24h());//.doubleValue();
asset_info.setOct_balance(oct_balance.setScale(Variables.precision, RoundingMode.DOWN).toPlainString());
asset_info.setOct_balance_usd(oct_balance.multiply(oct_usd_price).setScale(Variables.precision, RoundingMode.DOWN).toPlainString());
asset_info.setOct_balance_cny(oct_balance.multiply(oct_cny_price).setScale(Variables.precision, RoundingMode.DOWN).toPlainString());
asset_info.setOct_price_usd(oct_usd_price.toString());
asset_info.setOct_price_cny(oct_cny_price.toString());
asset_info.setOct_price_change_in_24h(Double.toString(oct_price_change_in_24h));
asset_info.setOct_market_cap_usd(coinMarketTicker.getMarket_cap_usd());
asset_info.setOct_market_cap_cny(coinMarketTicker.getMarket_cap_cny());

创建自发交易

自发交易

我们可以在src/main/java/com/oraclechain/eosio/constants/Variables.java中指定一个服务器自发交易的用户名和对应active私钥。

然后可以使用push_action/create_account/create_vip_account接口发起交易请求。


有关欧链

OracleChain(欧链)作为全球第一个直面区块链生态Oracle(预言机)需求的基础应用,将区块链技术服务和现实生活中的多种需求场景直接高效对接,深耕这个百亿美金估值的巨大市场。

OracleChain是一个多区块链的去中心化Oracle技术平台,采用自主的PoRD机制,将现实世界数据引入区块链,并将此作为基础设施为其他区块链应用提供服务。
OracleChain将在区块链内提供现实世界数据的Oracle服务,同时还可以提供跨链数据的Oracle服务。基于OracleChain除了能实现Augur、Gnosis等预测市场(Prediction Market)应用的功能之外,还能支撑对链外数据有更高频率访问需求的智能合约业务,比如智能投顾等场景。

OracleChain将改变当前区块链应用的开发模式,建立全新的生态圈,服务于真正能改变现实世界的区块链应用。

OracleChain的使命是“让世界与区块链互联”,立志成为链接现实世界与区块链世界的基础设施,通过把外部数据引入区块链来实现链内链外的数据互通,OracleChian将是未来区块链世界中最高效的获取链外数据的服务提供平台。

版权

发布于 GNU/LGPL Version 3 许可证书下

感谢

椭圆曲线算法及签名工具:EOSCommander,感谢PLAYERONE.ID团队的贡献。

如果您觉得我们的开源项目对您有帮助,请为oraclegogogo投上一票,谢谢。