BitShares API 服务器架设指南 - 个人篇
bitshares·@boombastic·
0.000 HBDBitShares API 服务器架设指南 - 个人篇
# BitShares API 服务器架设指南 - 个人篇 受 [@abit](https://steemit.com/@abit) 的[交易所对接指南](https://steemit.com/bitshares/@abit/bitshares)启发,也写一篇关于API服务器搭建的指南。希望可以帮助到有需要的人。以下示例均在 linux 或者 mac 操作系统上测试运行通过,但没有在 windows 下进行过测试,但是原理是相同的,至多是具体路径写法略有差别,请 windows 用户自行调整。 我们这里谈到的 API 服务器,实际上有以下几种用法,不同的用法,硬件要求及配置上有很大不同: 1. 个人使用 主要是个人用户在使用轻钱包或者网页钱包时,使用运行在本地,独占使用的API服务器。现代的个人电脑配置基本就足够了。 2. 公共 API 服务器 提供一个公共的API服务器,向公众开放服务。一般需要是托管在IDC的服务器或者从云服务提供商那里租赁的VPS,对配置带宽都有一定要求。 写着写着发现篇幅很长,所以分成 2 篇独立的文章,一篇讲个人设置,一篇讲公共API服务器的搭建。 ## 配置供个人使用的API服务器 在自己的本地服务器上运行一个`witness_node`节点,并侦听本地端口。该节点仅供用户个人使用,所以速度飞快。 ### **硬件要求** 8G 内存(越多越好) 50G 硬盘 ### **安装相关依赖并下载BitShares源码编译** Mac OSX上的方法 ```bash # Mac OSX 操作系统上 # 来源: https://github.com/bitshares/bitshares-core/wiki/Building-on-OS-X # 安装 brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew doctor brew update # 安装编译需要的依赖 brew install boost cmake git openssl autoconf automake brew link --force openssl # 下载 BitShares 源码并编译 # 这里,我们假设将目的地目录设置在 /path/to/bts_source,可根据需要修改 cd /path/to/bts_source # 获取源码 git clone https://github.com/bitshares/bitshares-core cd bitshares-core # 获取依赖的子模块代码 git submodule update --init --recursive cmake . # 编译witness_node程序,如果make后面不加参数,则编译所有预设程序,也包括了cli_wallet, delayed_node 等程序,这现在场景下不需要 make witness_node ``` 编译完成后`witness_node`程序在 `programs/witness_node/` 目录下可以找到。这个程序可以复制到其他目录也可以独立运行。 - 关于Mac下的安装详细说明,[看这里](https://github.com/bitshares/bitshares-core/wiki/Building-on-OS-X). - 关于Windows下的安装说明,[看这里](https://github.com/bitshares/bitshares-core/wiki/BUILD_WIN32). - 关于Ubuntu下的安装说明,[看这里](https://github.com/bitshares/bitshares-core/wiki/BUILD_UBUNTU). ### **启动witness_node节点** **时间校准** `witness_node`节点的运行要求当前的机器校准时间,如果是桌面操作系统,无论是 mac 或是 windows,请确认系统时间已自动同步,linux 系统安装 `ntp`服务实现。 ``` sudo apt-get install ntp ``` **配置并启动** 我们先来看一下`witness_node`启动时需要配置哪些参数 ``` # 注意我们的下载和编译路径 cd /path/to/bts_source/programs/witness_node # -h 参数返回witness_node程序启动时支持的运行参数 ./witness_node -h # 其中这几条是我们关心的 -d [ --data-dir ] arg (="witness_node_data_dir") 指定数据及配置文件存储的目录,默认witness_node_data_dir. --replay-blockchain 重发所有已下载的区块并重建索引,非常耗时。当意外中断后重启会强制进行,所以尽量不要强制中断,按了Ctrl+C之后稍等一会儿等程序完成收尾工作后优雅退出。 --resync-blockchain 删除所有已下载数据,重新同步区块链。 --rpc-endpoint [=arg(=127.0.0.1:8090)] RPC侦听地址及端口 Options for plugin account_history: --track-account arg 追踪指定Account ID的交易历史(可多次设置) ``` `-d`参数设置数据及配置存储的目录。 `--track-account` 参数的意思是我们只关心特别指定的账户的历史交易信息,其他账户的历史交易信息我不需要。这样就可以大大节省内存开支。 既然是本地API只为我一个人服务,那只需要追踪我自己的账户就好了。因为我有2个账户,所以设置了2遍,如果你只有一个或者更多,则可以相应调整该参数。那么这个ID从哪里来呢,你可以从网页钱包中快速找到,比如我的账户名叫 `mr.agsexplorer`,访问网页钱包 https://bitshares.dacplay.org/account/mr.agsexplorer/overview,在账户下面有个#ID。  在前面加上固定的`1.2.`,`mr.agsexplorer`的完整的Account ID就有了`1.2.10285`。后面的另一个ID也是同样的道理,是属于 `mrs.agsexplorer`。你可以试一试,看看她的ID是不是`10286`。 `--partial-operations`这个参数是最近在代码库中的增加的,`-h`里还没有显示。这个参数指示只需要部分的数据,配合`track-account`参数一起使用可以大大降低本机内存负荷。如果不加这两个参数,目前情况下内存需求大约在24G左右,实际上如果内存不足,无法运行;如果使用了这2个参数,内容负荷最少可达到1.4G。 `track-account`可以重复多次以追踪多个账户。 `--rpc-endpoint`这个参数设置我们的本地API服务器为客户端提供数据的地址和设置,默认的设置是 `127.0.0.1:8090` 也就是只在本地的`8090`端口提供服务,我们就采用这个默认设置。 `--rpc-endpoint`后面不填内容,就使用默认值;但是`--rpc-endpoint`必须要写,否则节点启动后就不开放`Websocket RPC`服务了。 所以,我们最终的启动命令看上去是这样的 ```bash # 进入工作目录 cd /path/to/bts_source/witness_node # 启动命令及参数 ./witness_node -d ./node_data --partial-operations true --track-account '"1.2.10285"' --track-account '"1.2.10286"' --rpc-endpoint ``` 综合上面的说明,这段启动命令的大意就是:把数据和配置文件放在当前目录下的`node_data`子目录中,启动节点后只追踪`1.1.10285`和`1.2.10286`这2个账户,其他的不关心,并用默认设置开放`Websocket RPC`服务。 节点启动后,就需要耐心等待区块同步。在未完成同步之前,如果尝试使用客户端进行连接,也能连,但是会出现“区块数据陈旧或时钟不准”的错误提示。 为了每次启动时不需要输入这么多命令,我喜欢创建一个脚本 `run.sh`,把具体命令写在里面,以后只需要运行该脚本就可以了。 ```bash #!/usr/bin/env bash ./witness_node -d ./node_data --partial-operations true --track-account '"1.2.10285"' --track-account '"1.2.10286"' --rpc-endpoint ``` 上面是 `run.sh` 脚本文件的内容,把`run.sh`文件放置在 `witness_node` 同一个目录就可以了,注意要给 `run.sh` 可执行权限。 ```bash chmod +x run.sh ``` 以后每次要启动时,我就这样 ```bash cd /path/to/bts_source/programs/witness_node ./run.sh ``` 节点启动后,我们可以尝试通过命令行来测试连接 ```bash # 使用curl命令来测试,向localhost:8090发出请求,获取#1号block摘要 curl http://localhost:8090 -d '{"jsonrpc": "2.0", "method": "get_block", "params": [1], "id": 1}' # 应该返回一个JSON结构体 {"id":1,"jsonrpc":"2.0","result":{"previous":"0000000000000000000000000000000000000000","timestamp":"2015-10-13T14:12:24","witness":"1.6.8","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"1f53542bb60f1f7a653bac70d6b1613e73b9adc952031e30e591e601dd60d493ba5c9a832e155ff0c40ea1dd53512e9f93bf65a8191497ea67d701bc2502f93af7","transactions":[]}} # 这就表示我们的节点能够正常提供数据服务了 ``` ### **客户端的连接** 这里的客户端泛指数据消费端,表现形式不一,但是都包含一个数据源指向的设置,即从哪里获得数据,在我们的例子里,数据源的设置就是 `ws://localhost:8090`, `ws`开头表示使用`websocket`协议。 客户端的形态包括: **提供网页钱包的网站**,如 - 官方钱包:[https://bitshares.org/wallet](https://bitshares.org/wallet/?r=boombastic) - Transwiser支持钱包: [https://bts.transwiser.com](https://bts.transwiser.com/?r=boombastic) - DACPLAY支持钱包:[https://bitshares.dacplay.org](https://bitshares.dacplay.org/?r=boombastic) - 比特帝国支持钱包:[https://bit.btsabc.org](https://bit.btsabc.org/?r=boombastic) - OpenLedger支持钱包:[https://bitshares.openledger.info](https://bitshares.openledger.info/?r=boombastic)  请注意选择第二行的`Locally hosted(ws://127.0.0.1:8090)`,这里需要说明一下 `127.0.0.1`就是`localhost`两者是等价的。选择完毕后,界面会重新刷新下,就可以享受本地独占API服务了,速度又快又好。 **轻钱包** - 可以下载后独立运行的钱包UI程序,[官方地址](https://github.com/bitshares/bitshares-core/releases) - 设置方法同上 **命令行钱包** - cli_wallet: `./cli_wallet -s localhost:8090` **其他各种程序** - curl: `curl -d '{"jsonrpc": "2.0", "method": "info", "params": [], "id": 1}' http://localhost:8090 http://127.0.0.1:8093/rpc` - 比如alt的[btsbot](https://github.com/pch957/btsbots-demo-2016) ## 总结 在本机运行个人API服务,为自己的客户端提供本地的(网络延迟几乎可忽略)、独占的(不和其他用户分享)的API数据源,会让你对钱包的体验更进一层。但是每次使用客户端前,需要手动启动`witness_node`并等待它和网络同步数据,如果使用频率比较高,那么同步很快完成,如果距上次同步有段时间了,比如几个月,那需要等个几分钟到几十分钟也能迅速同步完毕。 这篇是 **BitShares API 服务器架设指南** 文章系列中的第一篇,个人篇。后面还会 **公共API服务器** 的搭建指南。 如果你喜欢这篇教程,请为我的见证人投票,在 BitShares 网络上,我的见证人叫 `mr.agsexplorer`,我同时维护着一个公共网页钱包 `https://bitshares.dacplay.org` 以及一组公共 API 服务器 `wss://bitshares.dacplay.org/ws`。
👍 boombastic, cutegirl, jojovdm, forever-gala, epixar, summerxxx, corvuscoraxx, stomatolog2, praz735u5, m8586, inchonbitcoin, fiona777, ubg, gatmi, lemooljiang, oflyhigh, tinytaruen, myfirst, birds90, elfkitchen, imyao, mrgreen, barrie, muddasir, itzmetong, adm, digitalking, kaylinart, cleateles, geoffrey, allyouneedtoknow, da-dawn, sureshraw23, runridefly, invisionary, tuck-fheman, bue-witness, boy, bue, mini, healthcare, bunny, moon, daniel.pan, helen.tan, craigslist, aaronthegoat, roadscape, cm-steem, fusan, noodles.pan, fractalnode, scisan, mrstaf, madlenfox, nezaigor, tellall, cardinalkpatrick, soi-green, azazqwe, deanliu, abit, yaoyeguard, yongkaijing, jtstreetman, chitnaingoo, aarkay, brimax, abdouni92, bledarus, angelsalais, rivalhw, kuwala313, viguamu, oneboredhero, mrjohnson, dobro88888888, gogo.tattoo, emag, wahyusaputra, auliaturrahman, lulita, sherinrosita, frankintaiwan, iyuta, slon21veka, tumutanzi, ideagenerator, zhuqiankun, signer, fahrullah, qipashuo, youngju, elshan, shaiya, hi2rajiv, mikisolus, zhijun, vahidrazavi, gellany, nigulax, ericagavriila, aboeluosr, elmaghrabi, elena-ge, qjwang, bappask, walidsalah, cryptochindian, johnnyzhou, vandadream, xiaoshancun, yasein, tianqi, kanchana, chrislo2004, jacoblayan, yusufshuaib, supersaiyanbear, pauloferreira, j-alhomestudio, tonypolac, klassendivic, digiccydigger, ifeng,