【戴嘉樂】基于IPFS和GeoHash構(gòu)建具有地理位置價值服務(wù)的DDApp(理論篇)

作者簡介:戴嘉樂( Mr.Maple ) | 前百度高級研發(fā)工程師 | IPFS應(yīng)用實踐者&布道師|
個人網(wǎng)站:https://www.daijiale.cn
聯(lián)系方式:微信號:daijiale6239。

一痛阻、概述

1.1 項目意義

打造地理位置信息與區(qū)塊鏈的關(guān)系對象模型,建立一套 人->位置->真實世界->傳遞信任->價值轉(zhuǎn)移->位置->人 的生態(tài)模型,實現(xiàn)用區(qū)塊鏈來索引真實世界的愿景。

通過GeoHash算法可以大幅度提高在龐大位置數(shù)據(jù)中的檢索效率漾狼,同時為應(yīng)用提供便捷的緩存機(jī)制。

IPFS&Filecoin技術(shù)則可以保證在一個可信的區(qū)塊鏈網(wǎng)絡(luò)中去大規(guī)模傳遞與海量位置信息相關(guān)聯(lián)的海量文件、數(shù)據(jù)集合肤频,并保證傳遞過程中數(shù)據(jù)的產(chǎn)權(quán)價值谢翎。

1.2 名詞解釋

  • DDApp
    DDApp ( Data Decentered Application ):是一個數(shù)據(jù)去中心化應(yīng)用的概念分别,介于傳統(tǒng)應(yīng)用和去中心化應(yīng)用之間爹耗,解決了DApp不能依賴中心化的API的問題,又保證部分需要去中心化場景下的數(shù)據(jù)艾岂,在與應(yīng)用交互之外顺少,還可以獨立分布部署、P2P傳輸王浴。

  • IPFS
    IPFS全稱InterPlanetary File System脆炎,中文名:星際文件系統(tǒng),是一個旨在創(chuàng)建持久且分布式存儲和共享文件的網(wǎng)絡(luò)傳輸協(xié)議叼耙。它是一種內(nèi)容可尋址的對等超媒體分發(fā)協(xié)議可以讓網(wǎng)絡(luò)更快腕窥、更安全粒没、更開放筛婉。它是一個面向全球的、是一個點對點的分布式版本文件系統(tǒng),試圖將所有具有相同文件系統(tǒng)的計算設(shè)備連接在一起爽撒。

  • GeoHash
    Geohash是由Gustavo Niemeyer發(fā)明的公共域地理編碼系統(tǒng)入蛆,它將一個地理位置編碼成一串字母和數(shù)字。它是一種層次化的空間數(shù)據(jù)結(jié)構(gòu)硕勿,將空間細(xì)分為網(wǎng)格形狀的桶哨毁,是一種被稱為z -階空間填充曲線的應(yīng)用,下圖中就是GeoHash算法中常用的Peano曲線源武,一種四叉樹線性編碼方式扼褪。


    GeoHash數(shù)據(jù)將具有如下3個特點:

  • 1 GeoHash將二維的經(jīng)緯度轉(zhuǎn)換成字符串,比如下圖展示了北京9個區(qū)域的GeoHash字符串粱栖,分別是WX4ER话浇,WX4G2、WX4G3等等闹究,每一個字符串代表了某一矩形區(qū)域幔崖。也就是說,這個矩形區(qū)域內(nèi)所有的點(經(jīng)緯度坐標(biāo))都共享相同的GeoHash字符串渣淤,這樣既可以保護(hù)隱私(只表示大概區(qū)域位置而不是具體的點)赏寇,又比較容易做緩存,比如左上角這個區(qū)域內(nèi)的用戶不斷發(fā)送位置信息請求餐館數(shù)據(jù)价认,由于這些用戶的GeoHash字符串都是WX4ER嗅定,所以可以把WX4ER當(dāng)作key,把該區(qū)域的餐館信息當(dāng)作value來進(jìn)行緩存用踩,而如果不使用GeoHash的話露戒,由于區(qū)域內(nèi)的用戶傳來的經(jīng)緯度是各不相同的,很難做緩存捶箱。


  • 2)字符串越長智什,表示的范圍越精確。如圖所示丁屎,5位的編碼能表示10平方千米范圍的矩形區(qū)域荠锭,而6位編碼能表示更精細(xì)的區(qū)域(約0.34平方千米)。


  • 3)字符串相似的表示距離相近(特殊情況后文闡述)晨川,這樣可以利用字符串的前綴匹配來查詢附近的POI信息证九。如下兩個圖所示,一個在城區(qū)共虑,一個在郊區(qū)愧怜,城區(qū)的GeoHash字符串之間比較相似,郊區(qū)的字符串之間也比較相似妈拌,而城區(qū)和郊區(qū)的GeoHash字符串相似程度要低些拥坛。

    例如蓬蝶,坐標(biāo)對(116.414597,39.955441),位于北京安定門附近猜惋,GeoHash后形成的值為WX4G2丸氛。

    我們已經(jīng)知道現(xiàn)有的GeoHash算法使用的是Peano空間填充曲線,這種曲線會產(chǎn)生突變著摔,造成了編碼雖然相似但距離可能相差很大的問題缓窜,因此在基于個人位置查詢附近Poi信息時,首先篩選GeoHash編碼相似的POI點谍咆,然后進(jìn)行實際距離計算禾锤,來規(guī)避算法突變所造成的誤差。

    當(dāng)然Geohash只是空間索引的一種方式摹察,特別適合POI點數(shù)據(jù)时肿,而對線Link、面數(shù)據(jù)采用R樹索引更有優(yōu)勢港粱。

二螃成、系統(tǒng)設(shè)計

2.1 架構(gòu)設(shè)計

2.2 對象模型設(shè)計

Geo Object Model

屬性 類型 備注
geo_id INT 唯一標(biāo)識
geo_address STRING 地址名
geo_lng FLOAT 位置經(jīng)度
geo_lat FLOAT 位置緯度
geo_hash STRING 位置生成的GeoHash值
ipfs_hash STRING 所存數(shù)據(jù)的IpfsHash值
addGeoInfoByParam() FUNCTION 添加位置信息方法
getGeoInfoByParam() FUNCTION 獲取位置信息方法
mixGeoHashByParam() FUNCTION GeoHash生成算法
addIpfsDataByParam() FUNCTION 添加Ipfs數(shù)據(jù)方法
mixIpfsHashByParam() FUNCTION 關(guān)聯(lián)Ipfs數(shù)據(jù)方法

2.3 數(shù)據(jù)庫對象映射

2.3.1 數(shù)據(jù)庫選型

這是網(wǎng)友以 100萬 poi 數(shù)據(jù)查詢范圍 3km 內(nèi)的點(最多取100條)的性能測試統(tǒng)計:

以下是各數(shù)據(jù)庫的對比情況:

數(shù)據(jù)庫 耗時 區(qū)域查詢 多條件支持
redis(3.2.8) 1-10ms 支持 不支持
mongo(3.4.4) 10-50ms 支持 支持
postgreSQL(9.6.2) 3-8ms 支持 支持
mysql(5.7.18) 8-15ms 支持 支持

綜合比較后,個人選擇了MySql 來進(jìn)行后文Demo的支撐數(shù)據(jù)庫:

  • MySql在5.7.4以前版本的童鞋可以通過myISAM引擎提供的Geom內(nèi)置函數(shù)來實現(xiàn)
  • MySql在5.7.4以后版本的童鞋可以舒服的繼續(xù)使用InnoDB引擎查坪,官方對其添加了對空間索引的支持寸宏,感興趣的朋友也可以對比下性能。

PS:

  1. 數(shù)據(jù)庫沒有哪個一定好偿曙,只要適合場景即可氮凝。
  2. 在研究IPFS存儲性能的過程中,由于測試網(wǎng)絡(luò)節(jié)點問題望忆,有很嚴(yán)重的數(shù)據(jù)傳輸瓶頸罩阵,且不穩(wěn)定,短期內(nèi)启摄,很難將需要頻繁更新以及百萬級別數(shù)據(jù)的檢索邏輯事務(wù)放在IPFS這一層中來做稿壁。
  3. 在IPFS節(jié)點網(wǎng)絡(luò)性能目前并不樂觀的情況下,嘗試去尋找能實現(xiàn)具有商業(yè)級別能力IPFS應(yīng)用的過渡方案歉备。

2.3.2 對象模型映射成表結(jié)構(gòu)

-- 表的結(jié)構(gòu) `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) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='geo對象模型';-- Indexes for table `geo_object`ALTER TABLE `geo_object`ADD PRIMARY KEY (`geo_id`),ADD SPATIAL KEY `geo_loc` (`geo_loc`);

三傅是、Demo

有了以上的概念和設(shè)計模型,接下來蕾羊,給大家看一個簡單的Demo實現(xiàn):

3.1 通過IPFS上傳位置數(shù)據(jù)

IPFS單節(jié)點的部署就不詳細(xì)介紹了喧笔,這邊可以參考文章 利用IPFS構(gòu)建自己的去中心化分布式Wiki系統(tǒng) 的實現(xiàn)過程.

官方提供了Curl的API方式,我們可以通過addIpfsDataByParam()方法實現(xiàn)RPC調(diào)用龟再。

curl -F file=@myGeoFile "http://localhost:5001/api/v0/add?recursive=false&quiet=false&hash=sha2-256"

PS:這邊Demo采用的是本地單節(jié)點的數(shù)據(jù)上傳书闸,為了保障服務(wù)的穩(wěn)定性,建議使用ipfs-cluster的節(jié)點集群解決方案利凑,具體方案可以參考IPFS資深大牛(飛向未來)的文章《IPFS家族二》浆劲。

3.2 獲取IPFS網(wǎng)絡(luò)返回值嫌术,并關(guān)聯(lián)數(shù)據(jù)

響應(yīng)體為 ‘multipart/form-data’格式,成功梳侨,會返回如下Body數(shù)據(jù):

{"Name":"myGeoFile""Hash":"QmYftndCvcEiuSZRX7njywX2AGSeHY21Sa7VryCq1mK1Ew""Bytes":"2428803""Size": ""}

拿到Hash值后蛉威,再通過mixIpfsDataByParam()方法關(guān)聯(lián)到我們的Geo位置數(shù)據(jù)上日丹。

3.3 Geo模型預(yù)演

選取第一個基準(zhǔn)位置點(模擬用戶所在定位):

維度lat:39.989049
經(jīng)度lng:116.313658
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(39.989049 116.313658)'),'3W咖啡館','QmYftndCvcEiuSZRX7njywX2A21Sa7VryCq1mK1Ew21')

選取第二個Geo位置點(模擬近點):

維度lat:39.988878
經(jīng)度lng:116.313352
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(39.988878 116.313352)'),'中關(guān)村創(chuàng)業(yè)大街南廣場','WCJIEFSCvcE231233HY21Sa7Vr1Cq1mK1Ew')

選取第三個Geo位置點(模擬遠(yuǎn)點):

維度lat:40.005466
經(jīng)度lng:116.315938
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(40.005466 116.315938)'),'圓明園','KBYftndCvcEiuSZRX7njyw1332Y21Sa723mKASDED')

球面距離圍欄算法

假設(shè)球面圍欄對角點坐標(biāo)A1(x1走哺,y1),B1(x2哲虾,y2):

x1 = lat + distance / ( 111.1 / COS(RADIANS(lng))),  
y1 = lng + distance / 111.1  
x1 = lat - distance / ( 111.1 / COS(RADIANS(lng))),  
y1 = lng - distance / 111.1  
//構(gòu)建一階空間填充曲線
LineString(A1,B1)  

PS:

  1. 赤道上經(jīng)度的每個度大約相當(dāng)于111.1km丙躏,經(jīng)度的每個度的距離從0km到111.1km;
  2. RADIANS()為弧度計算內(nèi)置函數(shù)束凑;
  3. LineString() 為構(gòu)建一階空間填充曲線內(nèi)置函數(shù)晒旅。

3.4 獲取地理區(qū)域內(nèi)的IPFS數(shù)據(jù)服務(wù)

獲取1km以內(nèi)的IPFS數(shù)據(jù):

SELECT  *  FROM    geo_object  WHERE   MBRContains  
(  
LineString  
(  
Point  
(  39.989049 + 1 / ( 111.1 / COS(RADIANS(116.313658))),  116.313658 + 1 / 111.1  ),  
Point  
(  39.989049 - 1 / ( 111.1 / COS(RADIANS(116.313658))),  116.313658 - 1 / 111.1  )   
),  
geo_loc  
)  

如下圖所示,我們拿到了距離3W咖啡館1Km以內(nèi)中關(guān)村大街南廣場附近相關(guān)聯(lián)的IPFS數(shù)據(jù):

獲取10km以內(nèi)的IPFS數(shù)據(jù):

SELECT  *  FROM    geo_object  WHERE   MBRContains  
(  
LineString  
(  
Point  
(  39.989049 + 10 / ( 111.1 / COS(RADIANS(116.313658))),  116.313658 + 10 / 111.1  ),  
Point  
(  39.989049 - 10 / ( 111.1 / COS(RADIANS(116.313658))),  116.313658 - 10 / 111.1  )   
),  
geo_loc  
)  

如下圖所示汪诉,我們拿到了距離3W咖啡館10Km以內(nèi)中關(guān)村大街南廣場附近相關(guān)聯(lián)的IPFS數(shù)據(jù):

PS:
關(guān)于Demo這塊废恋,后續(xù)會另外新開一篇實戰(zhàn)文章【應(yīng)用】基于IPFS和GeoHash構(gòu)建具有地理位置價值服務(wù)的DDApp(實戰(zhàn)篇)來做專門介紹,讓大家也能自己動手編寫一個功能相對完善(可視化界面)DDApp 扒寄。

四鱼鼓、應(yīng)用場景

  • Vevue:一個在選定的區(qū)域內(nèi)街拍可獲得代幣獎勵的DApp,鼓勵用戶分享原創(chuàng)內(nèi)容该编,激勵場景化廣告迄本。
  • 地理位置簽到:只有到達(dá)指定位置坐標(biāo)點,才可取得可信簽到密碼憑證课竣,進(jìn)行核對嘉赎,確認(rèn)地理位置信任問題。(滴滴加班公司打車報銷場景)
  • 到店紅包(糖果):于樟,吸引用戶到達(dá)指定實體店鋪位置公条,通過位置可信核對,分發(fā)代幣糖果憑證/快照迂曲,激勵用戶到店消費赃份,體驗現(xiàn)場活動。
  • 車主停車位產(chǎn)權(quán)保護(hù):經(jīng)過購買的專用停車位實為車主用戶的資產(chǎn)奢米,應(yīng)受到產(chǎn)權(quán)保護(hù)抓韩,且車位的轉(zhuǎn)移、交易需要在一套依賴地理位置的信任體系中進(jìn)行鬓长。
  • 景區(qū)谒拴、名勝古跡、歷史遺跡信息保護(hù):滄海桑田涉波,地轉(zhuǎn)星移英上,也許有一天名勝古跡不復(fù)存在炭序,但它們的電子信息(地理位置、圖像苍日、所屬國家惭聂、歷史文化、視頻相恃、VR全景等信息)將永遠(yuǎn)被保存在區(qū)塊鏈上辜纲,真實且不被篡改,源遠(yuǎn)流長拦耐。
  • 與位置AR游戲結(jié)合:之前很火的Pokémon Go如果再加上Filecoin的獎勵機(jī)制會是一種什么樣的場面耕腾?也可以參考MANA區(qū)塊鏈項目的價值。
  • 物聯(lián)網(wǎng)結(jié)合: 充電樁杀糯,ETC這些具有支付屬性扫俺、位置屬性的智能設(shè)備創(chuàng)新等等。

五固翰、開源計劃

初衷:期望能讓大家看到區(qū)塊鏈的實際應(yīng)用場景狼纬,為區(qū)塊鏈和傳統(tǒng)技術(shù)的結(jié)合做更多預(yù)演、布道骂际、分享疗琉,不去聽幣圈熙熙攘攘的聲音,用技術(shù)創(chuàng)造真實的價值方援,也期待更多和我一樣想法的朋友加入没炒,帶一些正能量給這個圈子。

IPFS-Geo
意義:是一個具有地理位置特征的IPFS智能對象犯戏,其元數(shù)據(jù)具備Geo相關(guān)特性送火,支持千萬級別空間數(shù)據(jù)的快速索引,對象內(nèi)還提供LBS相關(guān)功能的接口服務(wù)先匪。


相關(guān)文章和視頻推薦

【戴嘉樂】利用IPFS構(gòu)建自己的去中心化分布式Wiki系統(tǒng)

圓方圓學(xué)院匯集大批區(qū)塊鏈名師种吸,打造精品的區(qū)塊鏈技術(shù)課程。 在各大平臺都長期有優(yōu)質(zhì)免費公開課呀非,歡迎報名收看坚俗。
公開課地址:https://ke.qq.com/course/345101

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岸裙,隨后出現(xiàn)的幾起案子猖败,更是在濱河造成了極大的恐慌,老刑警劉巖降允,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩闻,死亡現(xiàn)場離奇詭異,居然都是意外死亡剧董,警方通過查閱死者的電腦和手機(jī)幢尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門破停,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尉剩,你說我怎么就攤上這事真慢。” “怎么了理茎?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵黑界,是天一觀的道長。 經(jīng)常有香客問我功蜓,道長园爷,這世上最難降的妖魔是什么宠蚂? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任式撼,我火速辦了婚禮,結(jié)果婚禮上求厕,老公的妹妹穿的比我還像新娘著隆。我一直安慰自己,他們只是感情好呀癣,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布美浦。 她就那樣靜靜地躺著,像睡著了一般项栏。 火紅的嫁衣襯著肌膚如雪浦辨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天沼沈,我揣著相機(jī)與錄音流酬,去河邊找鬼。 笑死列另,一個胖子當(dāng)著我的面吹牛芽腾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播页衙,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼摊滔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了店乐?” 一聲冷哼從身側(cè)響起艰躺,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眨八,沒想到半個月后腺兴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡踪古,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年含长,在試婚紗的時候發(fā)現(xiàn)自己被綠了券腔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡拘泞,死狀恐怖纷纫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陪腌,我是刑警寧澤辱魁,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站诗鸭,受9級特大地震影響染簇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜强岸,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一锻弓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝌箍,春花似錦青灼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悯衬,卻和暖如春弹沽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筋粗。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工策橘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亏狰。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓役纹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親暇唾。 傳聞我的和親對象是個殘疾皇子促脉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容