一种基于区块链的对等、可信的开放数据索引命名标识符--ODIN(Open Data Index Name) -- PPk开放技术社区 ( PPk Public Group ) 2020-05-05 http://ppkpub.org/ 1、ODIN 简介 ODIN是Open Data Index Name即“开放数据索引命名”的缩写。广义上,ODIN 是指在对等网络环境下标识和交换数据内容索引的一种开放性系统,它遵从URI(统一资源标识符) 规范,并为基于数字加密货币区块链(Blockchain)的自主开放、安全可信的数据内容管理和价值权益管理提供了一个可扩展的框架。它包括4 个组成要素:标识符、解析系统、 元数据和规则(Policies) 。狭义上,ODIN 是指对等、可信地标识任何数据内容对象的一种永久性标识符。 ODIN可以被形象地理解为“数据时代的自主域名”。 2、ODIN 的主要特性和功能  ODIN 系统具有以下显著特性和功能: a. 自主性。ODIN 标识符基于对等的区块链技术由申请者自主生成并管理,其生成和管理规则是完全开放的,没有中心化的控制机构。除了拥有管理密钥的申请者之外,其他组织和个人都无权控制和篡改。 b. 安全性。每一个ODIN 标识符的拥有者都对应拥有一对非对称加密技术的公私钥,可以通过私钥对自主发布的数据内容进行签名,而公钥是通过ODIN标识机制关联存放在区块链上,接受数据内容的个体可以通过区块链获得可信的公钥进行验证,以确保收到的数据是来源可信和不被篡改的。 c. 唯一性。采用ODIN协议能依靠区块链技术确保产生唯一标识,并开放索引到任意数据内容对象(如文本、图片、声音、数据、影像、软件等) ,使数据内容对象能被人们准确地识别和提取。 d. 持久性。ODIN 标识符一旦生成会持久存储在区块链上,不需要定期缴纳类似年费来维持其长期存在,不随其所标识的数据内容对象的持有者或存储地址等属性的变更而改变。 e. 兼容性。它可以与现有的一些标识符(如国际标准书号ISBN、国际标准刊号ISSN、国际标准文本代码ISTC、出版者标识符PII 等) 相互兼容。 f. 灵活性。遵循通用的URI协议标准,ODIN标识符可以灵活映射到各种URI资源地址上,比如Dat/IPFS等分布式存储、以太坊/EOS等公链上的智能合约应用,也可以是传统的HTTP网站。。 3、ODIN 的运行机制 PPkPub(PPk Public Group,即非营利的PPk开放技术社区)定义并发起建立了一套完全开放的ODIN运行机制, 包括基础系统(PPk ODIN system)和扩展应用方面。PPk ODIN system 是一个基于区块链的分布式数据内容索引命名与标识系统,它保证数据内容的自主性、安全性、唯一性、永久性、可扩展性。 首先,每个有意开放数据的数据生产者(Data Producer)可以通过开源的ODIN注册客户端来自主注册获得一个ODIN标识(成为ODIN注册者,即ODIN Register),以此为前缀可以为其开放的每一份数据资源编制一个包含 本身ODIN前缀的,且增加了后缀的ODIN标识串,并将该ODIN标识串映射到数据资源的元数据和URL上,这样ODIN就成为数据资源的一部分,始终与该数字资源共存。然后,已被开放的这些数据资源的ODIN 记录、元数据及其URL 信息可以JSON编码的形式保存在该ODIN注册者的数据库内,这些被集中存贮起来的资源就形成一个ODIN资源标识库。 当用户根据ODIN标识串寻找一个数据资源或有关这一资源的相关信息时,查询请求就会通过开源的ODIN解析库在区块链上进行定位,然后被传送到该ODIN 拥有者所登记的访问点(Access Point)上按照PTTP(Peer Trusted Transfer Protocol)传输协议进行解析并得到该数据资源的元数据描述和实际数据URL链接。 ODIN拥有者可以完全开放数据资源访问权,也可以通过适当的自定义机制让用户获取数据资源访问权,如通过订购、资源传递、按浏览付费等方式获得。 4、ODIN的编码方式 4.1 根ODIN 根ODIN 的标准结构式为: ppk:[BTC_BLOCK_SN].[BTC_TRANS_INDEX]/[DSS] ODIN 分为命名体系、前缀和后缀三部分,用冒号、斜杠分开。前缀中又以小圆点分为两部分 [BTC_BLOCK_SN]为该ODIN在比特币区块链上的登记记录所在区块的数字流水号(由比特币网络决定), [BTC_TRANS_INDEX]为该ODIN在比特币区块链上的登记记录所在区块内的具体存储位置的阿拉伯数字编号(从0开始寻址)。 后缀[DSS] (Data Suffix String)由ODIN注册者可选并自行给出的该ODIN标识所对应具体数据内容定位标识,需要自主确保具有唯一性。 [DSS]的命名方案: RESOURCE_ID*[DATA_BLOCK_ID.CHUNK_INDEX] 其中: RESOURCE_ID 为对应的资源标识,由所属ODIN标识注册者来定义,可以是流水编号,也可以是唯一取值的字符串,需自行保证能与标准结构式区分开,且不能包含* / ( ) "这五个字符。 DATA_BLOCK_ID 为对应的内容区块编号(如从1开始,对于文件File可理解为版本,对于动态数据流Stream可以理解为顺序产生的数据包), CHUNK_INDEX 为对应的子数据块在该数据区块内部的索引编号(从0开始)。 注:"*"及其后续部分可省略,缺省表示对应最新内容块 下面几例都是符合定义的根ODIN的合法编码: ppk:351474.430/ ppk:351474.430/* ppk:351474.430/*1.0 ppk:305678.568/ISBN2890321345*1.0 ppk:305678.1000/ISBN2890321345-P235*2.1 根ODIN可以采用短编码方式,结构式为: ppk:[REG_ORDER_INDEX]/[DSS] [REG_ORDER_INDEX]为该ODIN记录在全部ODIN注册记录中以注册时间早晚排序的阿拉伯数字索引值(从0开始)。 下面几例都是符合定义的根ODIN的合法缩短编码: ppk:1/ ppk:356/*1.0 ppk:356/ISBN2890321345*1.0 ODIN的命名结构使每个数据资源在全网具有自主、安全的唯一索引标识。ODIN不同于URL,它是数据资源的索引名称,而与实际地址无关。实际上它是一种URI(Universal Resource Name,统一资源标识符)或URN(Universal Resource Name,统一资源名称),是信息索引的数字标签和身份证。有了它,就使数据资源具有了唯一性和可追踪性。 特例: ppk:351474.430 ppk:351474.430* ppk:0 ppk:0* 这四种特殊编码含义一样,都表示对应根ODIN标识自身的最新解析记录配置数据,注意都不带资源版本。 4.2 多级扩展ODIN 以根ODIN为基础,根ODIN的注册者可以利用自选的区块链来扩展自定义二级ODIN。以此类推,可以形成更多级的ODIN标识。 多级ODIN 的标准结构式为: ppk:[PARENT_ODIN_PREFIX]/[SUB_BLOCK_SN].[SUB_TRANS_INDEX]/[DSS] [PARENT_ODIN_PREFIX]为对应上级ODIN前缀, [SUB_BLOCK_SN]和[SUB_TRANS_INDEX]为对应子级ODIN在上级自定义区块链上的登记记录所在区块和区块内记录位置的阿拉伯数字编号。 后缀[DSS] (Data Suffix String)由上级ODIN注册者可选并自行给出的具体数据内容定位标识,需要自主确保具有唯一性,命名方案同上。 举例: ppk:351474.430/21.35/* ppk:351474.430/21.35/ISBN2890321345* ppk:351474.430/21.35/ISBN2890321345*1.0 ppk:305678.1000/23.678/235.32/ISBN2890321345-P218*2.1 多级ODIN自定义结构式为: ppk:[PARENT_ODIN_PREFIX]/[SUB_TRANS_ID]/[DSS] [SUB_TRANS_ID]为该ODIN记录在子级区块链或其他技术平台上的唯一标识,由所属上级ODIN标识注册者来定义,可以是流水编号,也可以是唯一取值的字符串,需自行保证能与标准结构式区分开,且不能包含* / ( ) "这五个字符。 举例: ppk:351474.430/22/* ppk:1/22/ISBN2890321345* ppk:1/22/ISBN2890321345*2.1 ppk:1/china/books/* ppk:1/china/books/* ppk:1/china/books/ISBN2890321345-P218* 4.3 对分布式方法调用的特定资源形式定义 在上述ODIN资源标识定义框架下,定义以下特定扩展形式来支持远程方法调用需求: ppk:[PARENT_ODIN_PREFIX]/[FUNCTION_NAME]([arg1],[arg2],...,[argn])*[RESULT_SN] 其中: [PARENT_ODIN_PREFIX]为对应上级ODIN前缀, [FUNCTION_NAME] 为对应的方法名称,由所属ODIN标识注册者来定义,需自行保证能与标准结构式区分开,且不能包含* / ( ) "这五个字符。 [arg1],[arg2],...,[argn]为对应方法调用的1个或多个输入参数, RESULT_SN 为对应的结果唯一流水号,自定义产生,比如采用自增编号也可以采用时间戳等方案 注:"*"及其后续部分可省略,缺省表示需要动态执行指定方法并获得最新结果。 举例: ppk:351474.430/21.35/sum(1,2,3)* ppk:351474.430/21.35/sum(1,2,3)*1.0 ppk:1/china/add_book("book_isbn","book_title")* 具体应用时,由[PARENT_ODIN_PREFIX]配置所映射的AP(Access Point)节点来按PTTP传输协议具体处理所对应的方法调用并返回结果。 以超级账本Fabric实现一个AP节点的PTTP传输协议接口为例,可以将其接口URI形式定义如下: fabric:[server1_ip:port,server2_ip:port,....]/channel_id/contract_id/function_name(PTTP_INTEREST) 将按上述形式定义的实际URI地址配置到对应ODIN标识配置信息里,按照PTTP传输协议规范即可实现对该接口的具体方法调用获得反馈结果。 4.4 根标识的英文转义编码方案 为更好地满足在应用ODIN标识初期方便记忆区分的需求,ODIN根标识支持英文字母转义命名,参考电话按键上的英文与数字对应编码方案,并对I,L,O,S,Z这些易和数字混淆的字母做调整后的具体编码方案如下: 字母O o -> 数字0 字母ILA ila -> 数字1 字母BCZ bcz -> 数字2 字母DEF def -> 数字3 字母GH gh -> 数字4 字母JKS jks -> 数字5 字母MN mn -> 数字6 字母PQR pqr -> 数字7 字母TUV tuv -> 数字8 字母WXY wxy -> 数字9 支持从英文名称单向转义到数字标识: 如: btm 对应 286 qq 对应 77 bcz,bbz,ccz 都对应 222 abcde.com 对应 12233.206 也可以英文数字混用: 如 ab123 对应 12123 5、利用ODIN查找数据 那么如何根据ODIN号找到原始数据呢? 通过ODIN查找原始数据的方法很简单: 5.1 通过一个ODIN检索网站 有网站搭建能力的个体都可以利用开源的ODIN检索库来设立一个ODIN检索网站。 比如登陆http://ppkpub.org/odin/这个原型示例,在"Query ODIN"的提示框内输入已知ODIN号, 点击"Go"按钮,ODIN系统就会显示相应的ODIN注册信息。 例:我们在"Query ODIN"的提示框内输入ODIN号“0”,点击"Go"按钮,则会显示该ODIN号的相关信息。 另外上例也可以直接在浏览器地址栏里输入 http://ppkpub.org/odin/?odin=0 可获得相同的展现结果。 在此案例的基础上,可以进一步实现更为复杂的资源检索功能,我们将逐步提供相关的示例。 5.2 应用程序内置ODIN支持 应用程序的开发者可以将开源的ODIN检索库直接应用到自己的程序内,这样就能直接获取ODIN所对应数据资源的元数据描述和实际数据URL, 并根据元数据的定义来自定义最终展现。 例如,PPk开源工具的Java版客户端示例就内嵌了对ODIN标识的支持,可以从这里下载:http://ppkpub.org/ 6.FAQ 6.1 PPk是啥意思? PPk这个名称来源于 Peer-Peer network 即“对等网络”的缩写。 PPkPub不是一个创业团队,而是一个兴趣驱动、专注“创造”、开放的技术极客社区,依托北京邮电大学网络与交换技术国家重点实验室网络管理研究中心的深厚学研资源,集合了一群对比特币等数字加密货币案例感兴趣的P2P技术爱好者,社区成员多具有通信和互联网行业技术研发从业背景,对于互联网业态的发展趋势有着独立判断和独特理念。相比数字加密货币的价格起伏,我们更关注其中以区块链为代表的创新技术的潜在价值,正融合区块链与网络通信技术跨界融合来做一些有趣的事情! 我们的联系资料: 电子邮箱: ppkpub@gmail.com HTTP网站: http://ppkpub.org/ PTTP网站: ppk:0/ 6.2 如何类比已有案例以方便理解ODIN的功能? ODIN可以与域名DNS类比会比较容易理解些。 ODIN会索引到一个或若干个数据源URL,机制上像域名DNS解析, 但是把传统的域名登记机构换成了创新的区块链来实现, 不需要传统域名管理机构了,谁需要都可以自主到区块链上登记,另外可以发挥比特币地址公私钥加密技术的特点来提供更为安全可信的解析结果。 也可以类比一些能提供域名解析功能的数字加密货币来进行理解,比如Namecoin、ENS等,因为ODIN与它们本质上都是发挥了区块链技术的公开可信不可篡改的特点来提供类似域名的功能。不同点在于ODIN明确比特币区块链作为根标识承载区块链,因为比特币区块链具有事实上最强的稳定性和可靠性。以比特币区块链提供的可信基础,ODIN能兼容ETH,BYTOM,Fabric等其他类型区块链甚至传统的IT平台作为二级和多级扩展标识的承载平台。 6.3 为什么采用区块链? 以比特币为代表的区块链的独特之处在于实现了历史上第一个形式上去中心化、逻辑上却达成中心化共识的技术体系,简单理解就是:从彼此无关的不同节点读取到都是完全相同的唯一拷贝。以此为基础,才能定义出类似ODIN这样具有自主、安全关键特性的唯一资源标识。 6.4 采用比特币区块链作为基础是否能确保安全? 比特币作为第一个提出和实现区块链的加密货币,经过多年的运行已形成一个具有超强算力的分布式网络,其算力已经远超传统超级计算服务集群的合计算力且还在持续增加,从而充分保证了其区块链的安全性和稳定性。 理论上,如果比特币网络的超大算力有超过一半被一个个体所控制,该个体就可以篡改近期的若干区块数据(即著名的51%攻击),但其攻击难度随区块增长呈现指数级提高,超过6个区块确认后基本就不可能了,而且攻击者也只能篡改自己相关的交易信息(比如重复消费自己的比特币)或者不记录别人发出的交易,但不能凭空伪造别人比特币地址相关的交易,所以ODIN申请者在向比特币网络广播ODIN注册消息后,只需要等待6个区块就可以规避以上攻击风险以确认注册是否成功,即使在极小概率的情况下比特币网络被攻击成功导致注册不成功,也只需重新发起注册即可,对于注册者来说除耽误了一些操作时间外没有损失。 所以采用比特币区块链作为ODIN的根区块链是安全可信的。 6.5 比特币价格的大幅调整是否会对ODIN标识体系的稳定运行产生很大影响? 每条ODIN消息存储到比特币区块链的成本主要是支付给收录该交易的比特币“矿工”的费用,当比特币价格有大幅调整时该项费用也可以适当调整达到相对合理的费用(调整客户端的参数配置即可)。 另外,通过使用二级扩展标识还可以大幅降低标识的注册和维护成本(可以接近0成本)。 如果未来比特币价格存在大幅走低的可能性,导致矿工关闭矿机使得算力减少,在一定程度上会降低比特币网络的健壮性,但对于ODIN标识来说,只要等待6个区块的确认仍能保证相当高的可信和稳定性。 所以比特币价格的大幅调整会对ODIN标识体系整体的稳定运行会有很小的不良影响且通过适当的规则可有效规避相关风险。 6.6 与现有DNS域名体系的差异? 现有DNS域名体系是组织形式和逻辑上都中心化,与承载ODIN的区块链相比无法提供自主性,且DNS协议因为出现历史早,在安全性等多方面上也存在不足,但因为其作为现有互联网的基础协议以稳定为重,很难做出大的改变。 ODIN形式上和DNS域名有点像,但借助区块链的独特性使得运行机制上有本质的差别,强调自主和安全,是“数据时代的自主域名” 。 6.7 与EMULE、BT/MAGNET等P2P网络的差异? EMULE、BT/MAGNET等P2P网络是形式上的去中心化,但却没有进一步达成逻辑上的中心化,因此无法提供一个逻辑上一致的目录索引服务。比特币区块链是借鉴了EMULE、BT等P2P网络的经验,并将非对称加密等技术集大成组合到一起形成的创新技术体系,逻辑上能提供一个唯一性数据索引目录,同时能提供更好的安全性。 另外,以“magnet:?”开头的磁力链接为例,这种链接的“数字指纹”是通过文件内容的Hash结果来生成的,并以此来定位和识别文件的,当文件内容发生变动,其磁力链接的“数字指纹”地址也会发生变化,导致无法通过原有磁力链接来定位到新版本的文件内容。 而ODIN可以兼容磁力链接地址并将其作为AP设置选项,这样当文件内容发生改变时,只需更改AP设置即可,不影响ODIN标识,通过既有ODIN地址仍能访问到新修改的文件。 6.8 ODIN与URI/URL的差异性在哪? ODIN不同于URL(Uniform Resource Locator, 统一资源定位符),它是数据资源的索引名称,而与实际地址无关,与URL 的最大区别就是实现了对 资源实体的永久性标识。实际上它是一种URI(Universal Resource Name,统一资源标识符)或URN(Universal Resource Name,统一资源名称),是信息索引的数字标签和身份证。有了它,就使数据资源具有了自主、安全的唯一性和可追踪性。 6.9 与其它基于区块链的标识应用像Namecoin,Onename等案例的差异性在哪? ODIN和以上这些标识应用本质上都利用了区块链技术来生成唯一可信标识,也都是完全开放开源的,但在技术方案、应用扩展上各有特点,可以互相借鉴探讨。 ODIN明确以BTC区块链承载根标识并以此为基础延伸扩展引入其他加密币区块链或类区块链承载二级标识。 Namecoin建立在自己独立的区块链上,但算力较小,运行不稳定。 Openname,Onename缺省采用Bitcoin区块链,并支持兼容其它加密币区块链替换作为同级承载,但不支持多级扩展机制。 ------------------------------------------------------------------------------------------------- Released under the MIT License. Copyright (C) 2015-2018 PPk Public Group (ppkpub.org). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.