您正在查看: EOS-开发工具 分类下的文章

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投上一票,谢谢。

EOS佳能离线工具

EOS佳能离线工具

工具简介:

EOS佳能离线工具是由EOS佳能主导,为保护数字货币投资者安全交易而开发的工具。

目前工具提供创建账号、质押/解质押、代理/解代理、投票、转账、赎回、购买/出售内存、修改私钥等功能。工具仍在完善中,欢迎提供建议。

免责声明:该工具仅供学习、交流,不对使用过程中产生的收益、损失负责,请知悉。

使用方法:

准备两台设备:离线设备、联网设备

首先:使用离线设备 ("重新build"、"使用已build的文件",选择其中一种方式)
重新build:
  1. 下载项目,打开控制台
  2. cd 项目根目录
  3. npm install
  4. npm start
  5. 在浏览器地址栏输入:http://localhost:3000
  6. 自行打包时,需注意:先将internals/webpack/webpack.base.babel.js中的 “ publicPath: '/' ” 改为:“ publicPath: './' ”,打包完成后,将其改回,避免影响 npm start。
    使用已build的文件:

    1.下载build.zip文件,解压后,使用浏览器打开index.html即可使用。

    然后:使用联网设备
  7. 打开 https://tool.eoscannon.io/
  8. 点击 复制初始化信息 按钮
  9. image
    然后:使用离线设备
  10. 打开http://localhost:3000,选择想要进行的操作页面
  11. 在json字段输入框,输入已复制的初始化信息
  12. image
  13. 按照提示输入生成签名报文所需的字段
  14. 点击 生成签名报文 按钮,生成的签名报文会自动填充在下面的输入框中。
  15. image
  16. 点击 复制签名报文 按钮,或扫描二维码,获取签名报文。
  17. image
    最后:使用联网设备
  18. https://tool.eoscannon.io/页面的发送交易输入框粘贴已复制的签名报文
  19. 点击 发送已签名报文 按钮
  20. image
  21. 根据提示确认是否交易成功

源代码地址:https://github.com/eoscannon/EosCannon-Offline-Tools

编译 ScatterDesktop源代码,生成对应平台安装包

下载源代码

git clone https://github.com/GetScatter/ScatterDesktop.git

Mac系统编译

首先确认下当前机器安装的node的版本为v9.8.0,否则无法编译通过。切换版本,可参考《mac os 安装指定版本 node

开始编译

进入源代码目录,安装依赖

yarn install

编译源码

npm run build

生成对应平台安装包
mac:

npm run release-mac

windows:

npm run release-windows

linux:

npm run release-linux

编译成功

suroudeMacBook-Pro:ScatterDesktop surou$ npm run release-mac

> scatter@9.5.0 release-mac /Users/surou/Documents/github/ScatterDesktop
> electron-builder --mac

  • electron-builder version=20.28.4
  • loaded configuration file=package.json ("build" field)
  • electron-rebuild not required if you use electron-builder, please consider to remove excess dependency from devDependencies

To ensure your native dependencies are always matched electron version, simply add script `"postinstall": "electron-builder install-app-deps" to your `package.json`
  • writing effective config file=release/builder-effective-config.yaml
  • rebuilding native production dependencies platform=darwin arch=x64
  • packaging       platform=darwin arch=x64 electron=2.0.11 appOutDir=release/mac
  • skipped macOS application code signing reason=cannot find valid "Developer ID Application" identity or custom non-Apple code signing certificate, see https://electron.build/code-signing allIdentities=
                                                  0 identities found

                                               Valid identities only
                                                  0 valid identities found
  • building        target=macOS zip arch=x64 file=release/mac-scatter-9.5.0.zip
  • building        target=DMG arch=x64 file=release/mac-scatter-9.5.0.dmg
  • building block map blockMapFile=release/mac-scatter-9.5.0.dmg.blockmap

常见问题

-cannot find specified resource "static/icons/icon.png
cannot find specified resource "static/icons/icon.png", nor relative to "/Users/surou/Documents/github/ScatterDesktop/build", neither relative to project dir ("/Users/surou/Documents/github/ScatterDesktop"),
手动将build/icon.png复制到static/icons

Windows系统编译

  • 下载安装:
    node v9.8.0
    yarn-1.9.4
  • 安装windows编译工具
    npm install --global windows-build-tools
  • 安装项目依赖
    yarn install
  • 开始编译,打包
    npm run build
    npm run release-win

常见错误

  • iojs.lib : fatal error LNK1106
    c:\users\surou\desktop\scatterdesktop\node_modules\keccak\src\libkeccak\KeccakSponge.h : warning C4819: ���ļ����������ڵ�ǰ����ҳ(936)�б�ʾ���ַ����뽫���ļ�����Ϊ Unicode ��ʽ�Է�ֹ���ݶ�ʧ (����Դ�ļ� ..\src\libkeccak\KeccakSponge.c) [C:\Users\Surou\Desktop\ScatterDesktop\node_modules\keccak\build\keccak.vcxproj]
    C:\Users\Surou\.electron-gyp\.node-gyp\iojs-2.0.11\x64\iojs.lib : fatal error LNK1106: �ļ���Ч���������: �޷����ҵ� 0x29851C [C:\Users\Surou\Desktop\ScatterDesktop\node_modules\keccak\build\keccak.vcxproj]
    gyp ERR! build error
    gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe` failed with exit code: 1
    gyp ERR! stack     at ChildProcess.onExit (C:\Users\Surou\Desktop\ScatterDesktop\node_modules\node-gyp\lib\build.js:262:23)
    gyp ERR! stack     at ChildProcess.emit (events.js:180:13)
    gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:209:12)
    gyp ERR! System Windows_NT 10.0.16299
    gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\Surou\\Desktop\\ScatterDesktop\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--target=2.0.11" "--arch=x64" "--dist-url=https://atom.io/download/electron" "--build-from-source"
    gyp ERR! cwd C:\Users\Surou\Desktop\ScatterDesktop\node_modules\keccak
    gyp ERR! node -v v9.8.0
    gyp ERR! node-gyp -v v3.8.0

    解决方案:删除 C:\Users\Surou\.electron-gyp
    参考:https://github.com/electron/electron-rebuild/issues/163

  • app-builder.exe exited with code 1
    Error: C:\Users\Surou\Desktop\ScatterDesktop\node_modules\app-builder-bin\win\x64\app-builder.exe exited with code 1
      at ChildProcess.childProcess.once.code (C:\Users\Surou\Desktop\ScatterDesktop\node_modules\builder-util\src\util.ts:254:14)
      at Object.onceWrapper (events.js:272:13)
      at ChildProcess.emit (events.js:180:13)
      at maybeClose (internal/child_process.js:936:16)
      at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5)

    解决方案:删除node_modules,重新yarn install
    参考:https://github.com/electron-userland/electron-builder/issues/2002

  • .bin\babylon: Error: ENOENT: no such file or directory
    Cannot read file C:\Users\Surou\Desktop\ScatterDesktop\node_modules\babylon\.bin\babylon: Error: ENOENT: no such file or directory, open 'C:\Users\Surou\Desktop\ScatterDesktop\node_modules\babylon\.bin\babylon'
      at w (C:\Users\Surou\Desktop\ScatterDesktop\node_modules\app-builder-lib\src\asar\asarUtil.ts:201:11)
      at writeStream.write (C:\Users\Surou\Desktop\ScatterDesktop\node_modules\app-builder-lib\src\asar\asarUtil.ts:203:43)
      at afterWrite (_stream_writable.js:473:3)
      at onwrite (_stream_writable.js:464:7)
      at fs.write (fs.js:2252:5)-win: `electron-builder --win`
      at FSReqWrap.wrapper [as oncomplete] (fs.js:707:5)

    解决方案:安装yarn-1.9.4版本
    参考:https://github.com/GetScatter/ScatterDesktop/issues/165

  • 编译完,运行,界面空白
    经过反编译app.asar,发现缺少dist
    解决方案:先运行npm run build,在运行npm run release-win

其他

  • 反编译asar
    npm install -g asar
    asar extract app.asar ./

EOS开发库收集(持续更新)

开发语言

C Sharp

  • https://github.com/GetScatter/eos-sharp

    Eos eos = new Eos(new EosConfigurator()
    {    
      HttpEndpoint = "https://nodes.eos42.io", //Mainnet
      ChainId = "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906",
      ExpireSeconds = 60,
      SignProvider = new DefaultSignProvider("myprivatekey")
    });
  • https://github.com/eosnewyork/EOSDotNet

      var chainAPI = new ChainAPI("https://api.eosnewyork.io");
    
      string  _code  =  "eosio.token", _action  =  "transfer", _memo  =  "";
      TransferArgs  _args  =  new  TransferArgs(){ from  =  "account1", to  =  "account2", quantity  =  "1.0000 EOS", memo  =  _memo };
    
      //called asynchronously
      var abiJsonToBinAsync = await chainAPI.GetAbiJsonToBinAsync(_code, _action, _args);
      //called synchronously
      var abiJsonToBinSync = chainAPI.GetAbiJsonToBin(_code, _action, _args);

    Go

  • https://github.com/eoscanada/eos-go

      api := eos.New("http://testnet1.eos.io")
    
      infoResp, _ := api.GetInfo()
      accountResp, _ := api.GetAccount("initn")
      fmt.Println("Permission for initn:", accountResp.Permissions[0].RequiredAuth.Keys)

Python

  • https://github.com/EvaCoop/eosjs_python

      from eosjs_python import Eos
    
      eos = Eos({
          'http_address': 'http://172.18.0.1:8888',
          'key_provider': '5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3'
      })
    
      eos.newaccount({
          'creator': 'eosio',
          'name': 'mytestacc13',
          'owner_public_key': 'EOS7vTHtMbZ1g9P8BiyAGD7Ni7H6UALVLVCW13xZrXT4heCBke3it',
          'active_public_key': 'EOS8KKKYBBdwrmXRRynDXSxTX2qoT9TA4agahXXF4ccUgRCy81RNc',
          'buyrambytes_bytes': 8192,
          'delegatebw_stake_net_quantity': '100.0000 SYS',
          'delegatebw_stake_cpu_quantity': '100.0000 SYS',
          'delegatebw_transfer': 0
      })
  • https://github.com/eosnewyork/eospy

      # Get chain information
      pycleos --url https://api.eosnewyork.io get info
    
      # get information about a block
      pycleos --url https://api.eosnewyork.io get block 447
    
      # Retrieve an account from the blockchain
      pycleos --url https://api.eosnewyork.io get account --account eosio
    
      # Retrieve the code and ABI for an account
      pycleos --url https://api.eosnewyork.io get code --account eosio

PHP

  • https://github.com/zyq20130111/eos_php

      /* Create the rest client */
      EosApiRestClient eosApiRestClient = EosApiClientFactory.newInstance("http://127.0.0.1:8888").newRestClient();
    
      /* Create the json array of arguments */
      Map<String, String> args = new HashMap<>(4);
      args.put("from", "currency");
      args.put("to", "eosio");
      args.put("quantity", "44.0000 CUR");
      args.put("memo", "My First Transaction");
      AbiJsonToBin data = eosApiRestClient.abiJsonToBin("currency", "transfer", args);```
    
      /* Get the head block */
      Block block = eosApiRestClient.getBlock(eosApiRestClient.getChainInfo().getHeadBlockId());

Java

Dapp js 相关