关于区块链,程序员需要了解什么

作者 | 曹严明


如果说比特币是对传统货币的一种颠覆,那么比特币的基础技术——区块链则是对传统编程范式的一种颠覆。

 

区块链技术被看作是一次Paradigm Shift。也许很多人对 “颠覆”这种说法不以为然,因为现在这个词已经被用滥了(如今哪个好一点儿的词没有被用滥呢?),但是明眼人在匆忙做出“这又是个噱头”这样的结论之前会谨慎地去了解它背后的东西。

 

这篇文章的目的就是为程序员介绍区块链的独特技术,以及这些技术如何运用到项目或者产品的开发过程中。

 

即使你不想进入全新的区块链应用开发大潮,你也会发现其底层技术对平日的应用开发有不少启发和借鉴作用。

 

一个新技术的诞生有它顺应时代的合理性(黑格尔语“存在就是合理的”)。作为程序员我们应该去了解它的合理性所在之处,取而用之。我们不一定非要用新技术去颠覆一个老应用,但可以用新技术去重塑一个老应用。

 

本篇主要讨论区块链在三个方面的独特性:去中心和去中介、隐私保护、时间戳。


去中心和去中介


1994年凯文 · 凯利(国内称KK)出版了一本预言式的巨著《失控》,书中充满了关于智慧生命及其社会进化机制的真知灼见。书中提到的很多概念,比如云计算、物联网、网络社区等,在二十多年后的今天已经成为普遍事实。


“去中心化”是凯文 · 凯利在书中提出的“九律”中的一条。


一个去中心化的系统,没有一个中央的、至上而下的控制主体,而完全是由大量相互联结看似无组织的小个体构成,这些个体有一定的独立性,可以相互作用,它们自发地形成一个整体以后,由量变引起质变,结果整体的能力、智慧、适应性和灵活性,都大大超过了个体的简单相加。


这样的去中心化系统生命力极强,遭到破坏可以自我修复,因而很难被完全摧毁。


互联网就是一个典型去中心化的例子,极强的适应性和抗破坏性是互联网的根本。不过如今的互联网却有了中心化的趋势。


中心化的后果见仁见智,对崇尚多种选择的人来说,中心化代表着选择自由的丧失,服务质量的下降,活力的倒退和创新的萎缩。微博做为新一代互联网媒体的翘楚,它的兴起、没落以及再次复兴,从内容的产生和传播来说,就是一个从一开始的去中心化,到由大V们控制的中心化,再到去中心化的历程。


总之,只有那些赋予其中每个个体充分发展的自由的系统,那些抗拒中心化趋势的系统,才是生机勃勃、有创新力、能够不断进化的系统。

 

站在2016-2017年之交,智能机器时代似乎离我们不远了。


芯片、存储、网络、移动、物联网技术,都极大增强了各种网络终端(edge)的能力,无论这些终端是人、手机、汽车、机器人,或是其他设备。以前由于存储、网络或者计算能力等限制而选择中心化的应用程序设计,现在的程序员则有更大的自由去选择一种去中心化的设计。去中心化的系统更加灵活,更具适应性,更有活力。

 

另一方面,现实社会中的各种交易活动,由于交易双方缺乏信任、信息不对称、搜寻成本、匹配效率、交易费用等因素,需要有交易双方共同信任的中介参与。


比如银行间的跨境支付,中间需要通过SWIFT网络和代理银行,而不能直接进行点对点交易。


中介的产生源自于降低交易成本的目的,但是随着新技术的出现和普及,双方直接交易成为可能,而且成本更低。在这样的情况下中介变得多余了,交易双方通过去中介化来降低交易成本。

 

去中心和去中介有多种不同层次,可以体现在业务模式、业务数据的产生和传播、应用系统的架构、应用系统的开发、运行、维护、升级等方面。比特币和区块链是一种比较彻底的去中心和去中介应用,它包含以下几种去中心和去中介技术:


1. 点对点网络(P2P network)


点对点网络并不是什么新概念,网上的很多文件共享和视频直播服务就是用P2P网络协议实现的。P2P是对等网络,网络中每个节点的地位相当,没有任何节点处于中央控制的地位,也没有任何节点扮演交易中介的角色;每个节点既是Server,又是Client;节点可以选择随时加入,随时退出;节点可以选择运行所有的功能(Full node),也可以选择运行部分的功能;节点越多,整个系统的运算能力越强,数据安全性越高,抗破坏能力越强。

 

2. 去中心化数据库


例如Bitcoin的分布式总帐。

 

3. 去中心化应用 (Decentralized App,简称 DApp)


例如在Ethereum上运行的智能合约应用。

 

4. 共识算法


无中心、无中介、无需相互信任的对等网络的节点间需要协调一种共识算法,以便共同维护一个统一的分布式数据库,以及协同工作以保障整个系统的安全性和适应性。有多种共识算法,包括:

 

PoW–Proof of Work工作量证明

 

PoS – Proof of Stake权益证明

 

DPoS–Delegated Proof of Stake授权权益证明

 

PBFT–Practical Byzantine FaultTolerance实用拜占庭容错

 

PoET–Proof of Elapsed Time流逝时间量证明等。

 

作为一个程序员或者架构师,这些思路和技术有什么帮助呢?你的应用需要去中心或者去中介吗?你的下一个应用需要采用去中心化的架构吗?设计去中心化的架构需要作哪些改变?需要哪些基础设施?在时下这股区块链的淘金热里,已经有很多创业公司准备颠覆传统的中心化应用。几乎所有的应用,都开始有相应的基于区块链技术的去中心化版本。如果你认为目前没有必要或者不可能去中心化,未雨绸缪总是不会错的。

 

隐私保护


个人隐私信息泄露在中国是一个非常严重的现象。


盗取、贩卖个人信息已经有完整的黑市产业链,部分互联网征信和数据公司,从黑市上购买数据,甚至雇佣黑客盗取数据。互联网用户普遍意识到个人隐私信息的重要,对隐私保护的要求会更高。程序员有责任从技术上加强个人隐私的保护。

 

在传统的应用架构设计中,隐私保护或者安全性设计的优先级并不是很高,现在这种情况必须有所改变,架构师需要提升隐私保护设计的优先级。

 

区块链应用领域采用了很多密码学的技术,例如哈希算法、加密算法、公钥密码学、默克尔树、和零身份证明。

 

Bitcoin在保护用户身份方面,使用哈希过的公钥作为个人账号,这样在交易时隐藏了个人信息。另外,个人账号可以设计成一次性的,每次交易都使用新账号,这样就很难通过追踪某个账号的交易来推测用户身份。Bitcoin的总帐是公开的,上面每笔交易记录包含付费账号、收费账号以及转账金额。

 

如果觉得这样的隐私保护还不够,另一个数字货币Zcash在Bitcoin之上增加了一些协议,将付费账号、收费账号以及转账金额都隐藏了起来,采用的方法仍然是加密、哈希、默克尔树和零知识证明。

 

尽管比特币出自于一群无政府主义者之手,但他们秉承的一些诸如保护个人隐私的信念,在这个信息泛滥的互联网时代还是非常可取的。

 

你的应用是否收集了超越应用需要的个人信息?(保护隐私的最好办法就是不收集它们)在处理交易时,是否可以传递尽可能少的个人身份信息?或者使用一次性账号?在日志中是否可以记录尽可能少的个人身份信息?或者完全不需记录?缓存数据库中的个人信息是否安全?消息传递时不仅采用Session Key加密,是否还可以采用Message Key?如今,哈希算法、公钥加密,默克尔树,这些加密技术唾手可得。程序员应该养成新的习惯,在应用设计中采用各种加密技术保护个人隐私信息,包括个人账户、交易、浏览、日志信息等。


时间戳


传统关系型数据库在设计表时一般会有一个或多个时间戳(timestamp)字段,用来标记一行记录添加或修改时的时间。


基本上,这些时间戳是给应用内部使用的。当数据被共享给其他应用时,这些时间戳并没有多大意义,因为时间戳可以伪造。

 

在数据黑市上,一个数据掮客可以将一份银行VIP客户数据进行注水,掺入一半的假数据。

 

一家保险公司为了搅乱市场上竞争对手的视线,故意污染数据,将高净值用户放入骗保用户黑名单,将骗保用户放入高净值用户名单,然后让污染后的数据故意泄露出去。

 

如果每条数据都带有一个真实可信的时间戳(这条数据产生的真实时间点),这样的造假行为就比较难奏效,因为假数据的时间戳一般都是最近的。

 

以前我们很少关心数据的时间戳,很少去了解时间戳对数据的意义,一个原因也许是我们不知道如何用技术去实现这样的时间戳。

 

如果技术实现完全可行,那么这个时间戳对我们来说就有了全新的意义。


首先,我们有了真正可以信任的历史数据。


第二,这些数据因为可信变得更有价值,可以在应用之外被其他应用或者分析工具使用。


第三,我们可以基于这些可信的历史记录生成信用。


最后,我们真正进入一个信用社会。

 

想象一下,如果我们想在未来某天证明自己的数据是在今天产生的,可以在今天对今天的所有数据进行某种形式的哈希(比如默克尔树),最终得到一个哈希值,然后在第二天的《参考消息》上登一个广告,把哈希值发布出去。明天的《参考消息》就成了我们的时间戳。


如果明天我们想做同样的事,可以如法炮制,另外有一个关键点,那就是要记得把今天的哈希值也给哈希进去。这样每天的哈希值就包含了以前所有数据的哈希信息。

 

区块链在P2P网络上通过节点间的共识算法实现了一个分布式的时间戳服务。

 

区块链是在时间上有序的、由记录块(区块)组成的一根链条。一个区块包含两个部分:区块头(Block Header)和记录部分。区块中的所有记录通过默克尔树(Merkle Tree)组织起来,默克尔树根(Root)的哈希值做为本区块里所有记录的数字指纹被放入区块头。


区块头还包含以下字段:前一个区块头的哈希值(这是前一个区块的数字指纹,也可以看做是指向前一个区块的哈希指针),本区块的时间戳、高度(Hight,即从第一个区块开始数本区块是第几个块),以及一些其他信息。系统的共识算法保证了每过固定的一段时间(Bitcoin是大约10分钟),参与整个系统记账的节点会达成共识在区块链上添加下一个新的区块。

 

时间戳的这种设计,使得更改一条记录的困难程度按时间的指数倍增加,越老的记录越难更改。这是因为,如果改动某个区块里的一条记录,意味着该区块原来的默克尔树根失效了,需要改动区块头,该区块的数字指纹随之失效。又由于下一个区块的区块头包含这个哈希指针,这就意味着下一个区块也需要改动。如此直到最新的那个区块。

 

可见要想改动一个区块,必须同时改动该区块后面的所有区块。因为将一个区块放入区块链中需要消耗非常多的资源(资源种类依共识算法的不同而不同,可以是计算力,流逝的时间,拥有的权益等),随着后面添加的区块越来越多,要想改动某个区块几乎是不可能的。

 

对一个普通应用来说,如何实现这样一个时间戳服务呢?我们需要自己创建一个区块链吗?其实没必要,Bitcoin就是一个很好的时间戳服务,我们可以把哈希值写到Bitcoin的区块链中。这是一种存在证明(Proof of Existence)。Factom也提供类似的服务,它收集所有的哈希,每隔10分钟生成一个哈希值,写到Bitcoin的区块链中。

 

哪些数据需要有时间戳?必须是不能变更的数据,特别适合存档文件。需要现在就考虑实施时间戳吗?这个跟你的数据战略相关。在大数据时代,拥有高质量的数据就是拥有了价值。时间戳可以一定程度上保证数据的可信度,至少这些数据是经过“时间考验”的。


总结


2009年1月Bitcoin发布,2015年7月Ethereum发布,到今年区块链开始大热。对于程序员和架构师来说,区块链带来了新的思维,新的程序设计范式,它所基于的技术也是一般程序员不太熟悉的。它号称要颠覆传统应用,要构造一个“价值互联网”。

 

本文讨论了区块链三个有意思的方面:去中心和去中介、隐私保护、时间戳。程序员有必要了解这些有益的思路和技术,审视自己的应用和产品,看看是否可以借鉴,是否可以提升用户体验,增加数据价值,降低运营成本,或者是否有新的业务场景,也许还可以开创一条全新的业务模式。


作者简介:曹严明,SAP咨询服务部架构师,专注于保险业核心系统、电子商务、企业移动应用等解决方案。曾就职于微软和HCL,参与过SQL Server、SharePoint、Visual Studio等产品的研发。


扫码加入「CSDN 区块链技术交流群」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java两个矩阵相乘_java计算两个n阶矩阵相乘

自己是个新手,研究java数据结构,看到两个n阶矩阵相乘的题目,自己就试着写了一个简单的demo,哪里有不好的地方,也希望大家多提提意见,直接上代码了:package com.shujujiegou01;public class JuZh…

java annotation list_java-注解annotation

package cd.itcast.day2;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.List;/*** 注解** 注解的使用构成: 1,注解的申明 2,在类型(代码)上面打上注解 3&…

java 关联表做修改_java-图关联列表实现

我知道我也许正在从死里复生一个老问题,但是我觉得应该发表评论.您可以创建关联列表图形结构,也可以针对图进行调整.考虑LinkedList< Vertex>.对象和LinkedList< Edge>.宾语.这将使您可以遍历所有边缘和所有顶点,但不包含有关所有对象如何连接的信息.假设我们添加了…

JavaApp自动化测试系列[v1.0.0][几种常见APP类型测试代码实例附源码]

通常APP分为&#xff1a;原生APP、WebApp、混合型APP&#xff0c;其自动化测试代码稍有不同 Java结合TestNG单元测试框架&#xff0c;实现移动端IOS_WebApp测试【源码】 /** FileName Test_iOS_WebApp:* author davieyang* create 2018-11-22 14:20*/ package testscript; imp…

混合云异军突起 英特尔的全“芯”体验为企业保驾护航

近几年&#xff0c;混合云在IT界异军突起&#xff0c;各大厂商纷纷布局混合云市场&#xff0c;企业更愿意将数据存放在私有云中&#xff0c;但是同时又希望可以获得公有云的计算资源&#xff0c;在这种情况下混合云被越来越多的采用&#xff0c;它将公有云和私有云进行混合和匹…

python 常用模块函数_python函数和常用模块(三),Day5

递归反射os模块sys模块hashlib加密模块正则表达式反射python中的反射功能是由以下四个内置函数提供&#xff1a;hasattr、getattr、setattr、delattr&#xff0c;改四个函数分别用于对对象内部执行&#xff1a;检查是否含有某成员、获取成员、设置成员、删除成员。class Foo(ob…

搭建java_搭建JAVA环境

1 jdk的获取jdk的获取路径有很多这种&#xff0c;我把我网盘上存的分享个大家&#xff0c;大家直接下载就可以了。http://pan.baidu.com/s/1pLsJLtp(这是一个公开链接&#xff0c;直接打开下载就可以了)。2 jdk的安装(1)单击刚刚下载的安装文件将会弹出欢迎对话框。(2)点击“下…

java数组下标越界_BUG-并行流与数组下标越界-思考与总结

BUG-并行流与数组下标越界-思考与总结今天线上环境报异常&#xff0c;发现了一个之前没注意过的问题&#xff0c;记录一下。1. 异常信息异常信息如下&#xff1a;Caused by: java.lang.ArrayIndexOutOfBoundsExceptionat java.lang.String.getChars(String.java:826)at java.la…

IDC敲黑板啦:未来企业IT以混合云为主

数字化是企业转型的必由之路数字化技术正在融入企业的血液里。IDC 认为&#xff0c;基于第三平台的 46 技术是企业在数字化转型过程中的关键要素&#xff1a;• 4 是指以云计算、大数据、社交商业与移动技术为代表的第三平台技术。• 6 则是基于第三平台智商的 6 大创新加速器。…

axis2接收json_AXIS2 如何返回JSON数据

按照网上两篇博文操作了http://blog.djakapm.com/2011/12/15/json-web-service-with-java-and-axis2/http://www.marcusschiesser.de/2009/01/building-a-json-web-service-with-java-and-axis2/但是结果一直是返回的XML数据&#xff0c;无法返回json数据。不知道有哪位大侠成功…

Service Mesh 在华为公有云的实践

我们在构建微服务而构建微服务是困难的微服务是一个很大的概念&#xff0c;从团队组织到最佳实践似乎都有实施微服务的一些指导。我们这里只提构建微服务的架构模式&#xff0c;也就是关乎到你用什么样的方式来构建你以微服务架构来组织的应用系统。近些年随着微服务的火热&…

centos7 安装mysql php_Centos7 安装mysql与php

https://blog.csdn.net/qq_36431213/article/details/79576025官网下载安装mysql-server依次使用下面三个命令安装wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpmrpm -ivh mysql-community-release-el7-5.noarch.rpmyum install mysql-community-ser…

分布式NewSQL数据库实践——民生银行经典案例

前言此前&#xff0c;金融信息化建设主要依托原有集中型 IT 架构进行维护扩展&#xff0c;系统规模及复杂程度呈指数级增长&#xff0c;各类瓶颈逐渐暴露&#xff0c;日益增长的数字金融需求同旧式的系统架构缺陷之间的矛盾愈加凸显。中国人民银行、中国银行保险监督管理委员会…

「拨云见日」英特尔揭秘短视频背后的二三事

“像一棵海草海草&#xff0c;随风飘摇&#xff0c;海草海草&#xff0c;浪花里舞蹈……”看到这样魔性的歌词&#xff0c;你是不是有立刻跟着唱的冲动&#xff0c;甚至还很想起来跳一段呢&#xff1f;去火锅店点餐&#xff0c;你会掏出手机告诉服务员按照视频内容操作吗&#…

36套java精品高级课_Dubbo-ZooKeeper“走一波”

随着科技的发展&#xff0c;服务器受到来自客户端的“压力”与日俱增&#xff0c;而使用分布式技术无疑是解决这一问题的不二选择&#xff0c;今天我们就介绍一款分布式解决--基于Dubbo-ZooKeeper的分布式解决方案。本文主要是如何安装Dubbo-ZooKeeper。Dubbo是什么&#xff1f…

英特尔助力金山云带你畅游云端的游戏世界

科技的发展让人们可以在任意时间、任意地点与不同的玩家一同畅游游戏世界。不论是拥挤的通勤路上&#xff0c;还是热闹的餐厅&#xff0c;都少不了痴迷于手游的玩家。来自《2017年中国游戏产业报告&#xff08;摘要版&#xff09;》的数据表明&#xff0c;去年中国游戏市场全年…

java date 实例_Java Date 和 Calendar 实例

Java 之 Date 和 Calendar 实例package com.homer.learn;import java.text.DateFormat;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;public class TimeTest {publ…

数据洪流时代,企业转型需要修建自己的“都江堰”

科技的进步推动着人类文明的进化&#xff0c;从农业采集社会到如今的网络智能社会&#xff0c;文明的进化也同样带动了企业的“进化”。今天&#xff0c;人工智能、云计算、大数据等技术的不断突破&#xff0c;让网络产生的数据量呈爆发式增长&#xff0c;数据洪流汹涌奔来&…

java $1参数_jmap命令详解----查看JVM内存使用详情

linux获取java进程PID&#xff1a;https://www.cnblogs.com/sxdcgaq8080/p/10734752.html如果命令使用过程中报错,可能解决你问题的方案&#xff1a;https://www.cnblogs.com/sxdcgaq8080/p/11089179.htmlhttps://www.cnblogs.com/sxdcgaq8080/p/10675966.html1、jmap命令基本概…

时代变了

阅读文本大概需要 2.6 分钟。最近一段时间&#xff0c;经常有人问我这么一个问题&#xff0c;说&#xff0c;张哥&#xff0c;现在市面上有各种付费网课和付费专栏&#xff0c;但我总觉得只有看书学习才是正途&#xff0c;不知道张哥怎么看&#xff1f;到底哪种学习方式最好呢&…