利用IPFS和GeoHash构建具有地理位置价值服务的DDApp(理论篇)
一、概述
1.1项目意义
创建地理位置信息与区块链的关系对象模型,建立一套人-位置-现实世界-信任传递-价值传递-位置-人?基于生态模型,实现了用区块链索引真实世界的设想。
GeoHash算法可以大大提高在海量位置数据中的检索效率,并为应用提供便捷的缓存机制。
IPFSFilecoin技术可以保证与海量位置信息相关联的海量文件和数据集在可信的区块链网络中大规模交付,并保证数据在交付过程中的财产价值。
1.2名词解释
DDApp
DDAPP(数据去中心化应用):是数据去中心化应用的概念,介于传统应用和去中心化应用之间。解决了DAPP无法依赖集中式API的问题,保证了去中心化场景下的部分数据能够与应用交互。
IPFS
IPFS,全称星际文件系统,是一种网络传输协议,旨在创建持久的分布式存储和共享文件。它是一种内容可寻址的对等超媒体分发协议,可以使网络更快、更安全、更开放。它是文件系统的一个全局的、对等的分布式版本,试图用同一个文件系统连接所有的计算设备。
GeoHash
Geohash是Gustavo Niemeyer发明的公共域地理编码系统,它将一个地理位置编码成一系列字母和数字。
它是一种分层的空间数据结构,将空间细分为网格形状的桶。是一个叫z阶空间填充曲线的应用。下图是GeoHash算法(一种四叉树线性编码方法)中常用的Peano曲线。
GeoHash数据会有以下三个特征:
1)GeoHash将二维经纬度转换成字符串。比如下图是北京九个地区的GeoHash字符串,分别是WX4ER、WX4G2、WX4G3等。每个字符串代表一个特定的矩形区域。也就是说,这个矩形区域内的所有点(经纬度坐标)共享同一个geo-hash字符串,这样既能保护隐私(只标明区域的大概位置而非具体点),又更容易缓存。例如,左上角这个区域的用户不断发送位置信息来请求餐馆数据。由于这些用户的geo-hash字符串都是WX4ER,所以WX4ER可以作为一个键。该地区的餐馆信息被缓存为value,但如果不使用GeoHash,则很难缓存,因为来自该地区用户的纬度和经度是不同的。2)字符串越长,范围越精确。如图所示,5位代码可以表示一个范围为10平方公里的矩形区域,而6位代码可以表示更精细的区域(约0.34平方公里)3)字符串的相似性意味着距离较近(特殊情况后面会介绍),这样就可以利用字符串的前缀匹配来查询附近的POI信息。如下两图所示,一个在市区,一个在郊区。市区的GeoHash字符串相似,郊区的GeoHash字符串相似,但市区和郊区的geo hash字符串相似度较低。
例如,坐标对(116.414597,39.955441)位于北京安定门附近,geo-hash后形成的值为WX4G2我们已经知道,现有的geo-hash算法使用阿砣空间填充曲线,而这条曲线会突然发生变化,从而产生代码虽然相似,但距离可能相差较大的问题,因此可以基于个人位置查询附近的poi。 当然,Geohash只是空间索引的一种方式,特别适合POI点数据。对于线连接和表面数据 2,使用R树索引更有利。系统设计2.1架构设计2.2对象模型设计
2.2 GeoObject模型设计属性类型备注geo _ id唯一标识geo_addressSTRING地址名称geo_lngFLOAT位置经度geo_latFLOAT位置纬度geo_hashSTRING位置生成的GeoHash值ipfs_hashSTRING位置存储的数据IpfsHash值addGeoInfoByParam()。函数添加位置信息方法getGeoInfoByParam()函数获取位置信息方法mixgeohashbyparam()函数geohash生成算法addIpfsDataByParam()函数添加Ipfs数据方法mixIpfsHashByParam()。与Ipfs数据方法关联的函数
2.3数据库对象映射2.3.1数据库选择
这是用100万poi数据查询3km以内点的用户的性能测试统计
以下是各种数据库的对比:
数据库耗时区域查询多条件支持REDD。1-10ms支持不支持mongo(3.4.4)10-50ms支持支持postgreSQL(9.6.2)3-8ms支持支持mysql(5.7.18)8-15ms支持支持综合比较后,个人选择mysql作为下面演示的支撑数据库——5 . 7 . 4之前用MySQL的童鞋可以通过myISAM引擎提供的Geom内置函数实现——5.7之后用MySql的童鞋
PS:-1。没有数据库就一定好,只要适合场景就好。-2.在研究IPFS存储性能的过程中,由于测试网络节点的问题,存在严重的数据传输瓶颈,不稳定。在短时间内,很难将需要频繁更新和数百万数据的检索逻辑事务放在IPFS层。-3.在目前IPFS节点网络性能不乐观的情况下,尽量寻找一种能够实现商用级能力的IPFS应用的过渡方案
2.3.2对象模型映射成表结构
-表的结构` geo _ object `- create table ` geo _ object `(` geo _ id ` bigint(20)not null auto _ increment,` geo _ loc` point not null,` geo _ address ` varchar(255)not null,` ipfs _ hash` varchar (255)-表` geo _ object ` alter TABLE ` geo _ object ` ADD PRIMARY KEY(` geo _ id `), ADD SPATIAL KEY ` geo _ loc `( ` geo _ loc `)的索引;三。Demo
有了上面的概念和设计模型,接下来,我给大家展示一个简单的Demo实现:
3.1通过IPFS上传位置数据
IPFS单节点的部署就不详细介绍了。这里可以参考文章【应用】用IPFS构建自己的去中心化分布式Wiki系统?Curl的API方法是在的实现过程中官方提供的,我们可以通过addIpfsDataByParam()方法实现RPC调用。 curl-F file=@ myGeoFile ' http://localhost:5001/API/v 0/add?recursive=false quiet=false hash=sha 2-256 ' PS:这里演示使用本地单节点数据上传。为了保证服务的稳定性,建议使用ipfs-cluster的节点集群解决方案。具体方案请参考IPFS资深大牛(飞向未来)文章《IPFS家族二》3.2获取IPFS网返回值,将数据
关联为' multipart/form-data '格式。成功,将返回如下正文数据:
{ ' name '' mygeofile ' ' Hash '' qmyftndvceiuszrx 7 njywx 2 agsey 21 sa 7 vrycq 1 MK 1 ew ' ' bytes '' 2428803 ' ' size '}得到哈希值后,再通过mixIpfsDataByParam()方法
3.3地理模型预览
选择第一个参考位置点(模拟用户的位置)
[xGeo _ address '' ipfs _ hash ')值(geomfromtext(' point(39.9878 116.313352)''中关村创业大街南广场'wcjefscvce 231233 hy 21 sa 7 VR 1c Q1 MK 1 w ')
选择第三个地理位置点(模拟远地点)Dimension lat:40.005466经度LNG: 116.35938插入' geo _ object' (`geo _ object ')。Geo _ address '' ipfs _ hash ')值(geomfromtext(' point(40.005466 116.315938)''圆明园'kbyftntvceiuszrx 7 njyw 1332y 21 sa 723 mkased ')球面距离栅栏算法
假设球面栅栏的对角线坐标为A1(x1,y1),B1(x2,y2):
x1=LAT distance/(111.1/COS(弧度Y1=LNG距离/1赤道上每度经度大约相当于111.1千米,每度经度的距离从0千米到111.1千米- 2。RADIANS()是弧度计算内置函数-3。LineString()是内置函数3.4获取地理区域内的IPFS数据服务
获取1km内的IPFS数据
SELECT * FROM geo_object其中MBR contains(LineString(Point(39.989049 1/(111.1/COS(弧度(116.313658))),116.313658 1/111.1),Point (39.989049-1/(111 我们从3W Cafe1公里范围内的中关村大街南广场附近获得了相关的IPFS数据我们从Geo _ Object where MBR Containers(Linestring(Point(39.4910/(111.1/COS(弧度(116.313658))),116.313658 10/111.1),Point ( 39.9890)获得了10km
Select *范围内的IPFS数据49 - 10 / ( 111.1 / COS(RADIANS(116.313658))), 116.313658 - 10 / 111.1 ) ), geo_loc )如下图所示,我们拿到了距离3W咖啡馆10Km以内圆明园附近相关联的IPFS数据
PS:关于Demo这块,后续会另外新开一篇实战文章【应用】基于IPFS和GeoHash构建具有地理位置价值服务的DDApp(实战篇)来做专门介绍,让大家也能自己动手编写一个功能相对完善(可视化界面)DDApp 。四、应用场景Vevue:一个在选定的区域内街拍可获得代币奖励的蓑衣网小编2023DApp,鼓励用户分享原创内容,激励场景化广告。地理位置签到:只有到达指定位置坐标点,才可取得可信签到密码凭证,进行核对,确认地理位置信任问题。(滴滴加班公司打车报销场景)到店红包(糖果):,吸引用户到达指定实体店铺位置,通过位置可信核对,分发代币糖果凭证/快照,激励用户到店消费,体验现场活动。车主停车位产权保护:经过购买的专用停车位实为车主用户的资产,应受到产权保护,且车位的转移、交易需要在一套依赖地理位置的信任体系中进行。景区、名胜古迹、历史遗迹信息保护:沧海桑田,地转星移,也许有一天名胜古迹不复存在,但它们的电子信息(地理位置、图像、所属国家、历史文化、视频、VR全景等信息)将永远被保存在区块链上,真实且不被篡改,源远流长。与位置AR游戏结合:之前很火的Pokémon Go如果再加上Filecoin的奖励机制会是一种什么样的场面?也可以参考MANA区块链项目的价值。物联网结合:?充电桩,ETC这些具有支付属性、位置属性的智能设备创新等等。
五、开源计划初衷:期望能让大家看到区块链的实际应用场景,为区块链和传统技术的结合做更多预演、布道、分享,不去听币圈熙熙攘攘的声音,用技术创造真实的价值,也期待更多和我一样想法的朋友加入,带一些正能量给这个圈子。
IPFS-Geo
意义:是一个具有地理位置特征的IPFS智能对象,其元数据具备Geo相关特性,支持千万级别空间数据的快速索引,对象内还提供LBS相关功能的接口服务。
开源地址:将在利用IPFS和GeoHash构建具有地理位置价值服务的DDApp(实战篇)中放出欢迎更多对这块感兴趣,志同道合的朋友一起探讨,后续将拉专项群?,联系方式在最下方特别鸣谢天一哥(飞向未来 IPFS指南公众号作者)与ipfser.org早期在IPFS大量的布道工作,才有了博主结合IPFS与传统应用的场景想法,期望更多和我们一样对这个领域感兴趣的朋友能加入进来。