使用 neon-wallet-db + neon-js + NEO-cli /rpc 搭建轻钱包服务端

本文将搭建一个不具有任何功能的NEO轻钱包,所有的精力都仅集中于成功运行neon-wallet-db项目并搭配全节点的neo-cli /rpc接口为轻钱包客户端提供服务。

首先需要准备几个项目:

  1. neon-wallet-db
  2. neon-js
  3. neo-cli

然后是劝退部分,即笔者完成壮举准备的环境:

  1. 4台debian虚拟机,均运行共识节点
  2. 4台虚拟机中一台作为RPC节点运行提供/rpc接口
  3. 4台虚拟机中另一台运行neon-wallet-db项目
  4. 运行neon-wallet-db项目的前提如下:

    4.1 运行mongodb服务端

    4.2 运行redis服务端

    4.3 安装python环境(笔者为 3.6.3)(建议搭配pyenv+virtualenv)

    4.4 安装heroku cli 后续将使用heroku local运行项目

NEON-WALLET-DB 项目的必要性

neon社区维护的neon轻钱包项目实际上为一个 react + electron 的web项目,内部通过调用neon-js提供的api实现与测试网乃至主网的交互。

然后思考一下轻钱包是如何做到不同步全节点也能进行transaction的。

答案是不可能。这里的轻钱包不过是在远程调用/rpc接口罢了,全节点由远程的neo-cli来维护。

那么问题来了,既然所有操作其实都是在调用/rpc接口,那neon-wallet-db项目又是用来做什么的?这还得从nel-cli都提供了哪些接口说起:

没错就只有这么一些,而一个基于NEO的DAPP要做的事情就是用这么几个接口来搞事情。其中交易如何进行且不说,先关注如何查询交易记录(即区块链技术中广为流传的utxo),毫无疑问这些utxo是包含在区块中并保存在全节点里的,那就需要一个接口来获取区块信息,也就是上面的getblock接口:

如图所示调用方法就是,拿区块索引来查区块信息,那如何实现查询一个地址的余额呢?用上面提供的getbalance接口就想得太美了,此接口得前提是要打开钱包,也就是只能获取这个neo-cli中打开的钱包的余额。真正做法是——遍历所有区块所有utxo自己算。这就是为什么还需要neon-wallet-db的原因,需要它来事先遍历、存储好uxto等数据,那么只要请求其提供的接口,就可以直接获取其处理过的方便使用的数据,而不需要遍历NEO全节点百万计(截至目前的测试网)的区块信息了。

运行私链共识节点

私链的运行比较简单,下载官方的neo-clirelease就可以,运行若出现问题(可能性很大)需要积极浏览官方文档和github README排查。

4个共识节点的protocol.json配置须保持一致,内容为节点ip地址和对应的共识地址公钥,这样才可能建立最小共识进而产生区块。

其中还要选择一个共识节点运行/rpc接口,命令为dotnet neo-cli.dll /rpc,然后实际使用的rpc接口就是http://192.168.1.x:20332(rpc节点ip以及默认端口).

官方的私链搭建文档内容有些跳跃,让人搞不清何时用neo-cli还是neo-gui。其实回归字面共识的达成无非就是4个neo-cli节点达成共识每隔15秒新增一个区块,没有neo-gui什么事儿。实际上NEO的测试网估计也是protocol.json里那几个节点在跑neo-cli,然后广大开发者用cligui去连接。那搭建私链也是一样,4台共识节点必不可少(什么共识后可以减为3台这种话直接忽略)。

笔者这边就是捣鼓了4个linux虚拟机,然后在外部windows下连接上这个私链:

然后就只要保证四个节点的区块数据一致,protocol.json配置一致,就可以任意连接到这个私链,甚至可以删掉全部的区块数据来重置这条私链。

配置 neon-wallet-db 以及 neon-js

共识节点的运行是整条私链的根本了,利用其提供的/rpc接口可以做到所有事情,而neon-wallet-db是用来缓存私链中的区块数据以免除某些需要遍历区块数据的操作(比如查询余额)。

首先直接克隆这两个项目:

git clone https://github.com/CityOfZion/neon-js.git

git clone https://github.com/CityOfZion/neon-wallet-db.git

neon-js的修改

neon-js默认会设置几个远程的/rpc服务端以及运行着neon-wallet-db的服务端。

这里直接修改src/api/neonDB.js以及src/api/neoscan.js中的这个方法:

这个地址就是之后运行neon-wallet-db项目的地址了。

neon-wallet-db的修改

neon-wallet-db 很厉害,使用heroku来搭建,一个命令heroku local搞定,然后就是要在一个干净的linux系统下解决报的错了。

首先劝退,这东西在windows下安装比linux下要麻烦一些,因为涉及了pythonheroku以及几个非关系型数据库。

  1. 保证安装了heroku cli
  2. 安装MongoDB,全都使用默认配置,运行服务即可
  3. 安装Redis,使用默认配置,运行服务即可
  4. 可以再安装Memcache,不过笔者不想再挑战多一个数据库了,直接忽略也可以
  5. 安装python 3,笔者为3.6.3,搭配了pyenv + virtualenv

准备完毕后保证neon-wallet-db目录下的python环境为3.6.3,然后

pip install -r requirements.txt

修改api/util.py:

修改api/db.py:

禁用memcache:

疑问:

代码中涉及到os.environ.get方法的操作会抛出异常,这受限于笔者对python项目的理解不足,所以直接全都删掉,写死了配置。

下一步操作是手动同步一下区块,新建一个rebuild.py:

from apscheduler.schedulers.blocking import BlockingScheduler
from rq import Queue
from api import redis_db as conn
from api.blockchain import storeLatestBlockInDB, getBlockCount, blockchain_db, storeBlockInDB, checkSeeds, get_highest_node

for i in range(0,5) :
  storeBlockInDB(i)

其中的 range(0, 5) 为想要遍历的高度,也就是,手动把 1~5 的区块数据给存储下来,直接执行python rebuild.py即可。对于区块中又大量数据的,可以这么做先自行存储数据,然后运行整个项目时再从已存储高度继续。为了做到这一步还得把项目里几个地方的区块高度值都对应起来:

然后可以做什么

一切顺利的情况下执行heroku local,应该就会看见三种颜色的log在不停跳动了。然后确保log中没有错误,并尝试访问接口/v2/block/height,如果高度跟私链中真实高度一致,那就完美了。

至此我们拥有了三个神器:

  1. /rpc节点服务端(neo-cli)
  2. 区块数据服务端(neon-wallet-db)
  3. neon-js

他们之间的关系用一张图来表达就是:

其中黄色部分为底层节点以及接口,绿色部分为定期从/rpc更新数据的缓存接口,粉色部分就是轻钱包客户端,自身不保存区块数据,实则保存在缓存接口中。

至于如何进行轻钱包开发,也就是用轻钱包做到交易转账、合约调用这些有实际意义的事情,还有很多篇幅可以讲 : )

原文地址:https://www.cnblogs.com/yitim/p/how-to-connect-neon-js-tp-private-net.html

时间: 2024-12-10 11:40:06

使用 neon-wallet-db + neon-js + NEO-cli /rpc 搭建轻钱包服务端的相关文章

JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言

作者:李宁老师 东北大学计算机专业硕士.曾任沈阳东软股份项目经理.51CTO学院签约讲师.从事软件研究和开发超过20年.长久以来一直从事Java.Android.iOS.C++.Swift.Objective-C以及跨平台游戏引擎(Cocos2d-x.Unity3D等)的开发和技术指导工作.对国内外相关领域的技术.理论和实践有很深的理解和研究. 主要著作包括<Cocos2d-x实战游戏开发指南>(即将出版).<Swift权威指南>.<Android深度探索 卷1和卷2>

Nuxt.js服务端渲染实践,从开发到部署

感悟 经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,也成功说服了公司新项目采用前后端分离的解决方案,当SEO不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,Nuxt.js官方还是很给力的,提issue后很积极的给予帮助,再次感谢Nuxt.js的开发团队. 解决的问题 路由鉴权 第一个拦路虎就是登陆时候的鉴权问题,如何把token保存到本地.官方使用express-session解决这个问题,但是这样做后端也需要使用nodejs,而我们公司使用的PHP.转念一想

Server Side JavaScript Code Injection Attack服务端js注入攻击

今天扫描器误报了这个漏洞,我觉着是误报了. 趁机了解一下, 好像是针对nosql与nodejs的服务端, 我觉着可能是js对于nodejs就是可执行的代码, 也就是任意代码执行, 这么一个攻击. stackoverflow上有一个http://stackoverflow.com/questions/27879131/server-side-javascript-code-injection-attack 巧了,看来我和他用了同款扫描工具,有了同样的问题. 看回答,大意竟是赞同他aspx可能有这个

Vue CLI 3搭建vue+vuex 最全分析

一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue serve .vue ui 等命令) CLI 服务:@vue/cli-service是一个开发环境依赖.构建于 webpack 和 webpack-dev-server 之上(提供 如:serve.build 和 inspect 命令) CLI 插件:给Vue 项目提供可选功能的 npm 包 (如

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca

《Node.js入门》Windows 7下Node.js Web开发环境搭建笔记

近期想尝试一下在IBM Bluemix上使用Node.js创建Web应用程序.所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是Windows下的搭建方法,使用CentOS 的小伙伴请參考:<Node.js入门>CentOS 6.5下Node.js Web开发环境搭建笔记 Node.js是什么? 我们看看百科里怎么说的? JavaScript是一种执行在浏览器的脚本,它简单,轻巧.易于编辑,这样的脚本通经常使用于浏览器的前端编程.可是一位开发人员Ryan有一天发现这样的前端式

Node.js, Express的服务器搭建过程的问题

Node.js, Express的服务器搭建过程的问题 Express : node.js 的框架,根据2012年BYvoid的说法,是node.js官方唯一推荐的框架 怎么搭建项目? - 安装nodejs->npm->express - express 的问题: 2017年, express-generator已经被独立成命令行工具了,所以要用 npm install express-generator 这样才能用express命令 怎么启动项目? 启动服务器可以用node app.js,因

号召大伙完善一个IM系统---------C#+JS (二)-------服务端封装Redis

这个IM的服务端,使用的是Redis作为数据库 我一开始使用的redis的SDK是ServiceStack.Redis,但是据说它是收费的,测试版的一个小时内只能发送1000个请求?? 后来,我改成使用StackExchange.Redis作为Sdk,并根据它的特点进行了一些封装.下面,介绍一下 为什么这样封装以及封装的内容. 我们先看一下封装后,是如何调用的(最终的目的就是要这样) 使用关系型数据库(mysql,sqlserver..)时,我们都是有一个DAL层的,dal层的每个类,对应的是一

服务端Json数据+js表单数据提交的 表单交互插件(base-form.js)

我们在做表单的查看.编辑里涉及两个点: 点1,提交Form表单到服务器,保存到数据库 点2,页面显示Form表单里的所有字段 如果表单的字段很多,这两个点会有两个问题: 1,提交Form时,如何少量代码.快速获取表单的所有数据? 2,页面显示Form表单时,如何自动给表单的所有字段自动赋值,而不要一个一个属性地写代码? 针对这两个问题,我有一个推荐的做法,下面以Demo举例: 1)index.html或index.jsp里写一个form表单,引入jquery.js: <srcript type=

Node.js开发入门—使用AngularJS内置服务

在上一篇,"AngularJS简单示例"中演示了一个非常简单的使用Angular的小demo,那篇已经太长,原本要介绍的一些内容只好单另开篇了.这些内容,就是如何使用Angular服务. 我们还是基于"AngularJS简单示例"中的示例来改造一下.新的示例,能从Node.js+Express构造的服务器上获取管理菜单.为了实现这个,需要做几部分改造: 服务器提供adminMenu的下载功能,需要修改app.js,处理路由 修改Angular实现的控制器x-cont