AE中国

Aeternity交易所与开发者对接参考(社区版)

liuyang 发布于 05月23日 阅读 503 本文共5746个字,预计阅读时间需要15分钟。

作者:刘洋@aeknow.org;欢迎转载传播,保持文章的完整性即可。

在微信群林峰的提议下,本文尝试简要描述Aeternity的全节点部署、转账、代币转账等操作的实施过程;供交易所、aepp开发者等开发者参考。由于成文仓促,很多地方可能不够细致甚至出现错漏,请不吝指教交流!在github提交issue或者其他任何可联系我的地方交流均可。

一、部署Aeternity全节点并同步区块数据

虽然用官方或者其他公共节点,也可以进行转账等操作,但对资金操作安全要求较高的话,还是建议专业用户自建一个aeternity全节点。在官方文档中提到全节点的安装流程;这里以Ubuntu18.04为例:

1、安装全节点运行依赖:

sudo apt-get install libsodium23 libssl1.0.0

2、下载发行版二进制文件解压缩运行。到https://github.com/aeternity/aeternity/releases 选择最新版本,下载,解压缩。

3、在解压缩目录下创建aeternity.yaml文件作为启动配置文件,详细的配置文件说明可以参考https://github.com/jdgcs/aedoc/blob/master/basics/aeternity_full.yaml 。一份简单可用的配置如:https://github.com/jdgcs/aedoc/blob/master/basics/aeternity.yaml ,这里需要特别注意的是:修改配置文件的话,请注意缩进为两个空格,而不是tab键。

配置完成后可以通过bin/aeternity check_config aeternity.yaml 来检测配置文件是否有错,显示OK说明配置文件正确。运行 bin/aeternity start 即可运行aeternity全节点,如果需要观察运行情况,可以通过bin/aeternity attach 来进入控制台,CTRL+D 组合键可退出控制台。节点正常运行后,通过 curl http://127.0.0.1:3013/v2/blocks/top 命令可获取当前区块高度等数据同步信息,当区块高度(height)与区块浏览器网站 https://www.aeknow.org 所显示的当前区块高度一致,说明区块数据同步完成;此时控制台中应该显示 Sync done (according to "pp_vxK2ikV...cxBfncU")类似信息。

如果需要编译源代码安装全节点,请参考:https://github.com/aeternity/aeternity/blob/master/docs/build.md

二、 钱包(充值地址)的批量生成与维护

Aeternity的公钥私钥基于ed25199的数字签名算法,全节点命令行只能生成二进制公钥私钥文件作为钱包,后续操作不如keystore文件格式的钱包方便;因此推荐直接用sdk生成keystore文件格式的钱包,keystore钱包格式参见:https://github.com/jdgcs/aeknow/wiki/Aeternity-keystore-file-format。目前aeternity官方的sdk支持三种语言,Nodejs:https://github.com/aeternity/aepp-sdk-js ; Python: https://github.com/aeternity/aepp-sdk-python 以及Golang:https://github.com/aeternity/aepp-sdk-go 。其中,Nodejs版本的sdk完成度最高,python的次之,golang的再次之。在创建钱包的操作上,三个sdk均可胜任。 另外,ae社区开发者还贡献了java的SDK:https://github.com/kryptokrauts/aepp-sdk-java

Python SDK为例,下载安装完成后,运行 ./aecli account create 即为创建账号文件命令,如:./aecli account create mywalletname --password mypasswd即可创建文件名为mywalletname的钱包文件,密码为mypasswd;创建成功后返回消息如下:

<account>
  Address ___________________________________________ ak_qHCWPAK6AoRSA2Fb9yzDrALXQnNcp6uG5h2QTvZMREC7YkqRJ
  Path ______________________________________________ /home/aedev/ae/aepy/venv/bin/mywalletname
</account>

三、主网币转账操作

Aeternity的交易类型比较多,如AENS、预言机等操作,均为主网上交易;主网币转账的交易类型为SpendTX。一个tx(交易)的完成过程大概可以分为三步:建立一个tx、对tx签名、广播tx;广播成功即为交易成功;使用SDK的话,可以省去分步操作。 官方转账API文档对转账有一个简要的描述:https://github.com/aeternity/protocol/blob/master/node/api/spend_api_usage.md 。实际转账过程中,结合需求来选择直接用SDK还是自定义tx。

还是以Python SDK为例,为了默认直接使用本地节点转账,修改./venv/lib/python3.6/site-packages/aeternity/__main__.py中 https://sdk-mainnet.aepps.com 为本地节点http://127.0.0.1:3013,执行 ./aecli account spend mywalletname ak_2Vpk2GAXwCfMNVMrE1zNrT6ASMY14dMtujHKN6P74CozMSSy4C 20000 --password mypasswd 即可转账:往地址ak_2Vpk2GAXwCfMNVMrE1zNrT6ASMY14dMtujHKN6P74CozMSSy4C 转出20000 aettos,也就是20000×10^-18 ae。执行成功返回为:

<spend transaction>
  <data>
    Tag _____________________________________________ 12
    Vsn _____________________________________________ 1
    Sender id _______________________________________ ak_24jcHLTZQfsou7NvomRJ1hKEnjyNqbYSq2Az7DmyrAyUHPq8uR
    Recipient id ____________________________________ ak_2Vpk2GAXwCfMNVMrE1zNrT6ASMY14dMtujHKN6P74CozMSSy4C
    Amount __________________________________________ 20000
    Fee _____________________________________________ 16780000000000
    Ttl _____________________________________________ 0
    Nonce ___________________________________________ 19202
    Payload _________________________________________ 
  </data>
  Metadata
  Tx ________________________________________________ tx_+J8LAfhCuEAff7IaDZFtlc7VKv2yvbsH0Upcst5tkIUSpRymCUb0dF0xRVQMliZWPL65bFOXG0XANhJNFPAlUdFoWPpVOSQLuFf4VQwBoQGMLQ+rxnBMerzaTwAOr+5ACVJdLKmw7Rtz3WXTBaip66EBxSR965r0/OrkKyuAbQ5KZaOhls5dTvKOG8Eiy9CisFyCTiCGD0Ll8HgAAIJLAoCFa5LN
  Hash ______________________________________________ th_qYLBGTKJCB6cHXsEF2GECLmD2bMqcLYA1NUa4s9uoNujM5CWL
  Signature _________________________________________ sg_581r7KWnxPJaeb7f4Xr5sdQdRCFMoLvqqwimmJRLMaN5G8PrhvoY91izszrZfpd3fkgshnXTHYvTZjfy64tUDMYvvJbUr
  Network id ________________________________________ ae_mainnet
</spend transaction>

然后在区块浏览器aeknow可以根据tx hash查看交易细节:https://www.aeknow.org/block/transaction/th_qYLBGTKJCB6cHXsEF2GECLmD2bMqcLYA1NUa4s9uoNujM5CWL

通过sdk成功广播tx之后,一般通过tx的区块高度来判断是否成功,如果tx hash信息不存在,说明没有广播;如果tx 高度为-1,说明tx广播出去到交易池(mempool)但未能成功打包;如果tx 高度为正整数,说明成功交易,等待一定的区块高度之后,即可认为安全交易。

如果需要自己逐步构建tx然后广播的话,可以参考https://github.com/jdgcs/aedoc/blob/master/basics/tx.php 的PHP展示代码以及https://github.com/aeternity/protocol/blob/master/node/api/spend_api_usage.md 的文档;注意PHP代码通过api生成tx后,用的是golang sdk对tx进行签名。官方提供了一个交易检测工具:https://goggles.aepps.com/ ,可以检测tx的有效性,并报告问题tx的具体问题。

3.1 用户充值及提现

交易所以及aepp等开发中,用户充值是最常见的开发需求。Aeternity的充值,可能采取两种充值模式:一种是单地址,通过类似memo的payload标识用户id来确认充值账号;一种是批量生成多地址,每个用户对应一个充值地址。不同操作各有利弊,开发者结合自己的需求来选择。如果未来业务涉及Aeternity代币(token)的话,建议为每个用户创建一个地址。

在处理用户充值的过程中,可以通过api获取账号余额等信息,如 curl http://127.0.0.1:3013/v2/accounts/ak_2Vpk2GAXwCfMNVMrE1zNrT6ASMY14dMtujHKN6P74CozMSSy4C 获取的信息如:{"balance":3964069320000000106180,"id":"ak_2Vpk2GAXwCfMNVMrE1zNrT6ASMY14dMtujHKN6P74CozMSSy4C","nonce":3}。其中,balance为账号余额,Aeternity默认小数点后18位有效数。可以通过实时抓取最新交易来触发更新账户余额,相关api参见:http://aeternity.com/api-docs/?config=https://raw.githubusercontent.com/aeternity/aeternity/master/apps/aehttp/priv/swagger.json

在用户提现的过程中,即使成功广播交易,还有存在挖矿分叉导致tx打包废弃,重新打包失败的情况;因此建议在tx广播成功后1-2个区块高度,再次读取txhash,确认是否成功广播;仍然成功状态的话,就可以认为提现成功。

3.2 获取交易历史

由于Aeternity账户本身无法查看交易,因此需要将交易抓取后存入数据库,或者通过第三方api来获取交易历史。这里有个api列表:http://aeternity.com/api-docs/?config=https://raw.githubusercontent.com/aeternity/aeternity/master/apps/aehttp/priv/swagger.json#/
大概思路就是顺着区块高度通过/key-blocks/height/{height}获取prev_hash,如果prev_hash是微块hash的话(mh_开头),那么里面就包含交易,然后抓取微块的交易 /micro-blocks/hash/{hash}/transactions,就可以获取txhash了,/transactions/{hash}获取的是交易细节。自建数据库存储历史tx可以参考https://github.com/aeternity/aepp-middleware ,调用第三方api可以参考:https://github.com/jdgcs/aedoc/wiki/Aeknow-api#transaction-history-of-an-account

四、Aeternity 链上 ERC20代币转账操作(智能合约调用)

4.1 转换地址格式

4.2 调用智能合约(代币转账)

五、鸣谢

  • 感谢林峰提出撰写本文档的建议,并提供指导资料
  • 感谢Jeremy(@theL4)讨论提出PHP版本示例
  • 感谢社区管理员Mark的平台与支持
如果你喜欢这篇文章,可在网站底部地址捐赠AE

喜欢 0
or

相关文章

更多

切换注册

登录

忘记密码 ?

切换登录

注册