-
Notifications
You must be signed in to change notification settings - Fork 1k
交易所对接
- 在服务器中部署NEO节点
- 使用 NEO-CLI 的命令完成以下工作
- 创建钱包
- 批量生成地址
- 向数据库中导入NEO地址
- 将NEO地址导入到交易所的数据库中
- 用户充值时将充值地址分配给用户
- 开发程序完成以下功能
- 使用钱包的API(getblock方法)监控新区块
- 根据交易信息完成用户充值
- 存储和交易所有关的交易记录
- 交易所网站上的其它常规对接工作
NEO-CLI 是为开发者提供的命令行客户端(钱包),开发者有两种方式和它进行交互:
- 使用 CLI(命令行界面)的命令,如创建钱包,创建地址等。
- 通过程序的 RPC 请求,如向指定地址转账,获得指定高度的区块信息,获得指定的交易等。
github.com/neo-project/neo-cli/releases
NEO-CLI 有以下三个功能:
1、每个NEO节点都可选的提供了一套API接口,用于从节点获取区块链数据,使得开发区块链应用变得十分方便。接口通过 JSON-RPC 的方式提供,底层使用HTTP/HTTPS协议进行通讯。
- 要启动一个提供 RPC 服务的节点,可运行以下命令启动 RPC 服务,打开 cmd,进入 NEO-CLI 程序所在目录后输入
- dotnet neo-cli.dll /rpc
- NEO-CLI API参考
dotnet AntSharesDaemon.dll
- 查看所有命令:进入 NEO-CLI 程序后输入
help
3、它包含一个共识机制,可以开启 Consensus 与其它节点达成共识
- 开始共识的方式:进入 NEO-CLI 程序后输入
start consensus
- 注:参与共识首先要通过投票选举成为NEO区块链的记账人。
钱包是用来存储账户(包含公钥和私钥)、合约地址等信息,是用户持有资产的最重要的凭证,一定要保管好钱包文件和钱包密码,不要丢失或泄露。
交易所需要一个在线钱包管理用户充值地址,可以用 NEO-CLI 或 NEO-GUI 创建钱包,两个程序创建的钱包文件是通用的。
- 交易所不必为每个地址创建一个钱包,一般是一个在线钱包存储用户所有充值地址。也可以用一个冷钱包(离线钱包)作为更安全的存储方式。
方法:输入命令 create wallet <path> 其中 <path> 为钱包路径及名称,扩展名任意。 如 create wallet mywallet.db3。然后设置钱包密码即可。
程序:NEO-GUI 下载地址
方法:在菜单中,点击“钱包”,“创建钱包数据库”,然后选择钱包文件保存位置,然后设置钱包密码。
其它有关钱包的操作也可以使用 NEO-CLI 或 NEO-GUI 进行。
钱包要一直保持打开状态以便处理用户的提现,为了安全钱包应该运行在单独的服务器上,并配置好防火墙等安全措施。
一个钱包可以存储多个地址,交易所需要为每个用户生成一个充值地址。
充值地址一般的生成方式有两种
- 用户第一次充值(NEO/NEO GAS)时,程序动态创建NEO地址。优点:不用人工定期创建地址;缺点:需要交易所额外开发,工作量比较大。
- 交易所提前创建一批NEO地址,并在用户第一次充值(NEO/NEO GAS)时,给用户分配一个NEO地址。优点:快速对接,不用开发;缺点:当地址不足时需要人工创建NEO地址。
使用 NEO-CLI 批量创建地址的方法:
通过 CLI 的 create address [n] 命令,方括号为可选参数,默认值为 1,如果要一次创建100个地址,需要输入 create address 100
地址会自动导出到 address.txt 文件中,交易所需要将其导入到交易所的数据库中,作为充值地址分配给用户
关于用户充值,交易所需要了解以下内容:
- NEO区块链只有一条主链,没有侧链,不会分叉,也不会有孤立区块。
- 所有记录在NEO区块链中的交易都是不可篡改的,即一个确认就代表充值成功。
- 钱包中的某个地址金额变化不会有通知,钱包暂时没有接口查询某个地址的所有交易。
- 一般来讲交易所的充值地址里的余额并不等于用户在交易所上的余额,因为在转账或提现时NEO钱包会从一个或多个地址中找到即能满足需求又是使用总输入最小的零钱作为本次交易的输入,并不能将指定的地址的零钱作为交易输入(除非交易所重写了NEO钱包的部分代码使其满足自身需求)。还有很多操作可能导致充值地址里的余额不等于用户在交易所上的余额,如交易所将一部分资产转移到交易所的冷钱包等。
- NEO地址中不止NEO和NEO GAS两种资产,可以有 n 多种用户自己发行的资产(如股权、Token等),交易所记录用户充值时要判断充值资产的资产类型,不要把其它资产的充值当成NEO股或NEO币,也不要把NEO和NEO GAS的充值弄混。
- NEO钱包是一个全节点,要保持在线才能同步区块,可以通过 CLI 的 show state 查看区块同步状态,左侧为本地区块高度,右侧为节点区块高度。
- 在交易所内用户之间的转账不应该通过区块链,一般都是直接改数据库中的用户余额,只有充值提现才上链。
交易所需要写代码监控每个区块的每个交易,在数据库中记录下所有和交易所有关的交易。如果有充值交易就要修改数据库中的用户余额。
详细介绍:利用 NEO-CLI 的 API 中的 getblock <index> [verbose] 方法,该方法中的 <index> 为区块索引,[verbose] 默认值为 0,[verbose] 为 0 时返回的是区块的序列化后的信息,用 16 进制字符串表示,如果从中获取详细信息需要反序列化。[verbose] 为 1 时返回的是对应区块的详细信息,用 Json 格式字符串表示。
该区块的区块信息中包含了交易输入和交易输出,交易所需要记录下所有和自己所有关的交易,作为用户充值提现的交易记录,如果发现在交易的输出中有属于交易所的地址,则要修改数据库中 充值地址为该地址的用户 的NEO或NEO GAS的余额。也有的交易所是这样做的:如果发现在交易的输出中有属于交易所的地址,先在数据库中记录下充值记录,待几个确认后再修改用户余额(如果不是为了与其它区块链操作方式统一,其实没必要这么做)。
- 注:getblockcount 返回的是主链中的区块数量,getblock <index> 第一个参数是区块索引,区块索引 = 区块高度 = 区块数量 - 1,如果 getblockcount 返回 1234,然后调用 getblock 1234 是获取不到结果的,要用 getblock 1233 才可以。
- 交易所充值提现交易的交易类型都是 ContractTransaction(无论是充值NEO股还是NEO币),交易所在遍历区块中的所有交易时,只关心 ContractTransaction 就可以了。
- 每个区块第一个交易必定是 MinerTransaction 在遍历交易时第一个交易可以忽略或跳过。
- NEO系统中的一切事务都以交易为单位进行记录。
提现大体上要完成以下几个操作步骤:
- 记录用户提现记录,修改用户账户余额
- (可选)客服处理提现申请
- 向用户提现地址发送交易,并在数据库中记录交易 ID
- 等待区块链确认,确认后将提现记录标志为提现成功
首先先要在 NEO-CLI 中用 open wallet <path> 命令打开钱包(下面的操作要在打开钱包后才可以进行),然后利用 NEO-CLI 的 API 中的 sendtoaddress <asset_id> <address> <value> 方法, 该方法中的 <asset_id> 为资产ID, <address> 为提现地址, <value> 为提现金额。交易发送后会返回 Json 格式的交易详情,可以从中提取到交易 ID 记录在数据库中。
- 注:此处的 <value> 为实际金额,并非乘以10^8后的金额。
- 注:NEO转账金额必须是整数,如果转NEO转了小数后,区块链不会确认,这时钱包里的零钱就不准确了,需要重建钱包索引。重建钱包索引就是根据区块链重新计算钱包里的交易和零钱。
类似充值时对区块链的监控,提现也一样,监控时发现到区块中的某个交易 ID 与提现记录中的交易 ID 相等的话,则该交易已经确认,即提现成功。