专栏名称: Hi区块链
可能是最靠谱不忽悠的区块链资讯平台
目录
相关文章推荐
51好读  ›  专栏  ›  Hi区块链

BTS 交易所对接指南(单节点版)

Hi区块链  · 公众号  ·  · 2017-11-30 11:18

正文


导读

此文目的是协助第三方交易所上线 BTS 交易。此文所述方案为单节点方案。相对于此前另一篇文档描述的双节点方案来说,单节点方案可以节省内存、硬盘和同步时间。


1. 基本概念


1.1 共识


BTS 使用 DPOS 共识机制,由持有 BTS 的人投票产生区块锻造人,标准区块间隔时间是 3 秒。


1.2 账户


1) BTS里,资金是存在账户里的,不像比特币是存在地址里。对交易所来说,需要公开一个账号供用户充值。可以使用网页钱包或者轻钱包注册新账号。


注:对于交易所来说,注册账号请使用钱包模式,而不是账户模式,因为交易所要用到一些高级功能,在账户模式下会存在问题。(如果是官方网页钱包或轻钱包 171102 或以上版本,第一次注册时默认是账户模式,可点击“高级”进入钱包模式)。


不是所有账号都可以免费注册,一般带横杠的或者数字的账号可以免费注册,比如 my-exchange ,或者 myexchange2017 。


在轻钱包账户页面里,账号下面会显示一个数字,这个数字是该账号在 BTS 系统里的内置ID,下面会用到。


注:官方网页钱包或轻钱包 171102 或以上版本,不再显示该数字。可以到区块链浏览器 https://cryptofresh.com/ 输入账号名获取账户 ID ,也可以自建节点同步完成后在钱包里通过命令获取 ID ,获取命令参考“提现目的账号名检查”章节。为了资金安全,交易所可以用一个账号负责充值,另用一个账号负责提现。


2) 用户充值,就是从其他账号转账到交易所的公开的账号。账号名就是收款地址。每笔转账可以带一个备注,交易所通过这个备注来区分是哪个用户的充值。 具体备注与交易所用户关联关系,请交易所自行设定。 备注是加密的,只有拥有发送者或者接收者的备注密钥才可以解密。


3) 用户提现,就是从交易所账号转账到用户账号,目的账号名由用户提供。 由于有用户需要把资金直接从一个交易所转到另一个交易所,而另一个交易所是根据备注入账,所以提现功能最好可以带备注。


4) 使用网页钱包注册的账号是基本账号。可付费升级为终身会员账号,升级后,后续交易手续费节省 80% 。终身会员可以创建新账号。当前手续费费率标准可以在钱包内查看,从界面依次点击 浏览-费率表 进入。


5) 每个账号默认有3对密钥,可以在账户-高级设定-权限页面里查看,分别为:活跃权限、账户权限、备注密钥。

其中,活跃权限密钥用于转账等日常操作;账户权限密钥用于修改密钥;备注密钥用来加密和解密转账备注。

默认情况下,活跃权限密钥与备注密钥相同,但可以修改为不同。

以上 3 对密钥都可以修改。其中,账户权限为最高权限,可以修改所有密钥;使用活跃权限密钥不能修改账户权限密钥,但可以修改其他两个密钥。


1.3 资产


1) BTS 系统里有多种资产,其中,核心资产是 BTS 。交易所上线 BTS 系统内其他资产的方法,与上线核心资产(BTS)的方式类似。


2) 每个账户可以同时拥有多种资产。


1.4 块链结构


每个块有个 ID,即 block_id,该 ID 是块内容的 hash 值;

每个块包含前一块的 ID,存放在 "previous" 字段,因此形成一个链;

每个块里包含多个交易,存放在 "transactions" 字段,按顺序存放;

使用 API 获取块信息时,会同时返回 "transaction_ids" 字段,即交易 ID 清单,是交易(不包含签名)序列化后的 hash 值

每个交易可包含多个操作,存放在 "operations" 字段,按顺序存放;

每个操作也有一个 ID ,是一个全局数字编号,是程序运行中内部产生的,不是 hash 值


2. 基础软硬件需求


独立服务器或者VPS

8G 内存(更多更好)

50G 硬盘


安装 64 位 Ubuntu 16.04 LTS (推荐) ,或者 Ubuntu 14.04 LTS ,或者 Windows Server 。


3. 程序准备


要对接 BTS 系统,需要运行这几个程序:普通节点 witness_node 、命令行钱包 cli_wallet 。


3.1 架构说明


witness_node 通过 P2P 方式连接到 BTS 网络,从网络接收最新区块,向网络广播本地签署的交易包;

witness_node 通过 websocket + http rpc 的方式提供 API 供其他程序调用(以下称为节点 API)。


cli_wallet 通过 websocket 方式连接到 witness_node 。

cli_wallet 管理钱包文件,钱包文件里包含经过加密的用户私钥,一个钱包文件可以包含多个私钥。

可以同时运行多个 cli_wallet 进程,同时连到 witness_node ,用来同时管理多个钱包文件。

cli_wallet 提供交易签名功能,签名后通过 witness_node 向外广播。

cli_wallet 通过 http rpc 的方式提供 API 供其他程序调用(以下称为钱包 API)。


推荐交易所使用一个 cli_wallet 来监测用户充值,使用另一个 cli_wallet 来处理用户提现请求。



3.2 Windows


Github 上提供编译好的 Windows 可执行文件下载。

下载页面在 https://github.com/bitshares/bitshares-core/releases/latest ,

文件为 BitShares-Core-2.0.xxxxxx-x64-cli-tools.zip ,解开即可,里面包含 3 个 exe 文件和两个 dll 文件。


3.3 Linux


如果使用 Linux 系统,需要自行编译几个上述程序。推荐使用 Ubuntu 16.04 LTS ,编译步骤如下:


sudo apt-get update

sudo apt-get install autoconf cmake git libboost-all-dev libssl-dev doxygen g++ libcurl4-openssl-dev


git clone https://github.com/bitshares/bitshares-core.git

cd bitshares-core

git checkout

git submodule update --init --recursive

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE=Release ..

make witness_node cli_wallet


注:上述步骤中,请将 替换成最新发布版本号,编写本文时,最新版本号是 2.0.171105a


编译完成后,得到两个可执行程序分别是:

* build/programs/witness_node/witness_node

* build/programs/cli_wallet/cli_wallet


上述程序可以拷贝到其他目录或者其他服务器执行。以下默认认为程序在当前目录。


注:拷贝到其他服务器执行时,如果服务器操作系统或其他软硬件环境有差异,则可能不能使用。


如果使用 Ubuntu 14.04 LTS ,则需要先编译安装 Boost 库,然后再执行上述步骤。

请注意,目前只支持 1.57.0 到 1.60.0 的 Boost 库。

编译安装 Boost 库的步骤为:


sudo apt-get install cmake make libbz2-dev libdb++-dev libdb-dev libssl-dev openssl libreadline-dev autoconf libtool git autotools-dev build-essential g++ libbz2-dev libicu-dev python-dev doxygen


wget -c 'http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.tar.bz2/download' -O boost_1_57_0.tar.bz2

tar xjf boost_1_57_0.tar.bz2

cd boost_1_57_0

./bootstrap.sh

sudo ./b2 install


使用其他 Linux 发行版也可以编译,不在本文说明范围。



4. 环境准备


要保证系统正常运行,需要保证服务器系统时间正确。时间不正确会导致块链无法同步、资金发送失败等各种问题。


Ubuntu 系统推荐安装 NTP 服务端,方法是


sudo timedatectl set-ntp false

sudo apt-get install ntp


根据部署环境不同,可能需要修改默认的 ntp 服务器地址,请参阅相关文档。


如果是 Windows 系统,请设置好系统时间同步。



5. 同步数据


由于需要同时运行多个程序, Ubuntu 下推荐在 screen 或者 tmux 里启动程序。


以下描述主要针对 Ubuntu ,所以命令前都带 ./ 。对于 Windows ,在命令行界面 cd 到程序目录之后,执行时不需要 ./ 。



5.1 witness_node


可使用 ./witness_node --help 来查看命令参数。


5.1.1 初次执行:


./witness_node -d witness_node_data_dir


然后按 Ctrl+C 结束它。


这样会在当前目录生成一个数据目录 witness_node_data_dir ,里面包含 blockchain 目录是数据存储,以及一个 config.ini 配置文件。

对于交易所,推荐对 config.ini 配置文件作一些修改。


1) 可关闭 p2p 日志,以减小硬盘存储压力,方法是找到 filename=logs/p2p/p2p.log 行,在行首添加 # 号

或者将 [logger.p2p] 下面的 level=info 修改为 level=error


2) 可考虑将控制台日志同时保存到文件,方法是将下述章节


[logger.default]

level=info

appenders=stderr


修改为


[log.file_appender.default]

filename=logs/default/default.log


[logger.default]

level=info

appenders=stderr,default


这样之后, witness_node_data_dir/logs/default/ 目录下会同步保留最近24小时的控制台日志。


3) 以下参数会减少运行需要的内存,原理是不保存 BTS 内置交易引擎的历史成交记录索引,因为交易所一般用不到这个数据。


history-per-size = 0


如果是 2.0.171105a 及以后版本,则需要设置这个参数:


plugins = witness account_history


注:

* config.ini 里默认 plugins 前有个“#”符号,需要删除;

* 默认的 plugins 配置是 “witness account_history market_history”,这里实际是去掉“market_history”;

* 如果 config.ini 里没找到该配置项,比如从老版本升级上来时不会更新已有配置文件,

* 可以在 config.ini 最前面添加一行(不要加在文件最后面),

* 也可以另外找个空目录生成一个 config.ini 文件再拷过来修改。


4) 以下参数表示每账号保留多少条历史记录供查询,默认值是 1000 。

对交易所来说,如果充值、提现记录较多,可考虑设置成一个较大的值,比如


max-ops-per-account = 1000


修改为


max-ops-per-account = 1000000


则会保留一百万条数据。更早的数据会从内存中被删除而无法快速查询(但仍然记录在链上)。


5) 以下两个参数会大量减少运行需要的内存,原理是不保存与交易所账户无关的历史数据索引。


track-account = "1.2.12345"

partial-operations = true


请将 12345 替换成你的账户数字 ID 。数字前的 "1.2." 表示类型是账户。


注: config.ini 里默认 track-account 前面有个“#”符号,需要删除。


如果需要监控多个账户,则使用多个 track-account 配置,如:


track-account = "1.2.12345"

track-account = "1.2.12346"

partial-operations = true


注:

目前存在一个 BUG ,配置多个 track-account 会导致上面的日志修改不生效。

绕过这个问题的方法,是不动 config.ini ,而是启动 witness_node 的时候,在命令行后面添加 --track-account 参数。


比如:


./witness_node --track-account "\"1.2.12345\"" --track-account "\"1.2.12346\""


注:

* 参数首尾双引号需要保留,所以使用 \ 进行转义。 Linux 下可以使用双引号外加一层单引号的方式,则不需要转义。

* 如果需要增加、修改、删除追踪账号,修改后,需要重建索引才能生效。方法是按 Ctrl + C 结束程序,然后加 --replay-blockchain 参数重新启动。


比如:


./witness_node -d witness_node_data_dir --track-account "\"1.2.12345\"" --track-account "\"1.2.12346\"" --replay-blockchain



5.1.2 重新执行


再次启动 witness_node ,开始同步数据。根据网络条件、服务器硬件条件不同,初次同步可能需要花几个小时到几天时间。


./witness_node -d witness_node_data_dir --rpc-endpoint 127.0.0.1:8090 --track-account "\"1.2.12345\"" --track-account "\"1.2.12346\"" --partial-operations true --max-ops-per-account 1000000 --replay-blockchain


上述命令中,使用 --rpc-endpoint 开启节点 API 服务,这样就可以使用 cli_wallet 和其他程序连接使用。


注:以后再需要重新启动 witness_node 时,一般不要加 --replay-blockchain 参数,否则启动会很慢。



5.2 运行一个 cli_wallet 用于处理提现


./cli_wallet -w wallet_for_withdrawal.json -s ws://127.0.0.1:8090 -H 127.0.0.1:8091


上述命令使用 -w 参数指定钱包文件, -s 参数连接到 witness_node , -H 参数开启钱包 API 服务,监听端口 8091。


注:

cli_wallet 与 witness_node 间通信的数据不包含私密数据,一般不需加密,也不需要对节点 RPC 端口作刻意保护(加一层保护也未尝不可)。

但 cli_wallet 与充提程序间的通信是明文,可能需要包含密码,如果部署为多机架构,需要注意加密,可采用 SSH 隧道的方式。

并且, cli_wallet 处于解锁状态时,通过 RPC 端口可以转移钱包内账户资金,需要注意防止非授权访问,强烈不建议钱包 RPC 直接开放公网访问。

为 cli_wallet 的 RPC 配置证书或者密码的做法,本人没有研究过,故此不作描述。


执行成功会显示:


new >>>


首先需要为钱包文件设置一个密码


new >>> set_password my_password_1234


执行成功会显示:


locked >>>


然后解锁钱包


locked >>> unlock my_password_1234


解锁成功会显示:


unlocked >>>


使用 info 命令可以查看当前同步情况


unlocked >>> info

info

{

"head_block_num": 17249870,

"head_block_id": "0107364e2bf1c4ed1331ece4ad7824271e563fbb",

"head_block_age": "23 seconds old",

"next_maintenance_time": "31 minutes in the future",

"chain_id": "4018d7844c78f6a6c41c6a552b898022310fc5dec06da467ee7905a8dad512c8",

"participation": "96.87500000000000000",

...

}


5.3 运行另一个 cli_wallet 用于处理充值


./cli_wallet -w wallet_for_deposit.json -s ws://127.0.0.1:8090 -H 127.0.0.1:8093


这个 cli_wallet 也开启钱包 API 服务,监听端口 8093


请参考前面的章节设置密码及解锁。


6. 账户设置


考虑到安全性,可以使用两个账号分别处理充值和提现,这里假设 deposit-account 用于充值,withdrawal-account 用于提现。


6.1 修改充值账户的备注密钥


在上述任何一个 cli_wallet 中执行 suggest_brain_key ,会得到一对密钥,示例如下:


unlocked >>> suggest_brain_key

suggest_brain_key

{

"brain_priv_key": ".....",

"wif_priv_key": "5JxyJx2KyDmAx5kpkMthWEpqGjzpwtGtEJigSMz5XE1AtrQaZXu",

"pub_key": "BTS69uKRvM8dAPn8En4SCi2nMTHKXt1rWrohFbwaPwv2rAbT3XFzf"

}


在轻钱包里,账户权限 页面,将备注密钥修改为上述结果中的 pub_key 。


注:

1. 修改过后请注意备份轻钱包,否则轻钱包里可能无法解密修改前的备注。

2. 修改过后,如果仍需要使用轻钱包进行带备注的转账、或者读取新的转入/转出转账备注,则需要将上述 wif_priv_key 导入到轻钱包,导入步骤参考如下教程中的第二步: http://btsabc.org/article-761-1.html 。导入后可以做个新的备份。

3. 这个方法也可以用来修改账户的活跃权限密钥和账户权限密钥,有需要时可以使用。


6.2 将充值账户的备注密钥导入到连接到负责充值的 cli_wallet


如果钱包已锁定,需要先用 unlock 命令解锁。


这里需用到上述 suggest_brain_key 结果中的 wif_priv_key :


unlocked >>> import_key deposit-account 5JxyJx2KyDmAx5kpkMthWEpqGjzpwtGtEJigSMz5XE1AtrQaZXu


导入时 cli_wallet 会自动生成一个或者两个备份文件,可删除。


这时可按 Ctrl + D 退出钱包,对钱包文件 wallet_for_deposit.json 进行备份,然后重新启动 cli_wallet 。


退出时会报个错,不用管它。


如果编译时没有引入 readline 库,则需要用 Ctrl + C 退出


由于没有导入活跃权限密钥,负责处理充值的 cli_wallet 无法动用充值账户的资金,只能查看历史记录。


6.3 从轻钱包中取得提现账户的活跃权限密钥


参考 http://btsabc.org/article-761-1.html


6.4 将提现账户的活跃权限密钥导入到负责提现的 cli_wallet


unlocked >>> import_key withdrawal-account 5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


同样可以对钱包文件作个备份。


注:检查一下提现账户的活跃权限密钥和备注密钥是否一样,如果不一样,则需要将备注密钥也导入,否则无法处理带备注的提现。







请到「今天看啥」查看全文