抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

一个程序员眼中的区块链技术

2018 年 5 月 31 日

我为什么要写这篇文章?在了解区块链相关信息时(例如维基百科上的内容),我发现这些内容非常零碎和不连贯。要把这些零碎的信息整合在一起,形成一个完整的视图需要花费大量的时间。不过现在,我想我已经知道在引入区块链时要使用哪些东西,以及应该按照怎样的顺序来了解它们,以便让开发人员能够在 1 到 1.5 小时内看到完整的视图。本文内容经过一定程度的简化,如果有人对更复杂的细节感兴趣,可以继续深入探讨。

非对称加密已经存在很长一段时间了,非对称加密包含了公钥和私钥。我们使用公钥加密并使用私钥解密,并且无法从这两者中的一个中获得另外一个。因此,在使用非对称加密技术时,我可以向某人发送一条信息,比如“我转账 100 美元”,每个人都知道它是我发送出去的,而且中间没有被篡改过。

假设有十个人,他们每个人都拥有一定数量(假设是美元)的新货币。他们每个人都确定(并确信)一个叫“X”的人支出了 30 万美元,但 X 是否真的拥有 30 万美元还不得而知。为了弄清楚情况,我们需要知道每个人的余额。我们只需要将他所有收入交易加起来,并扣除所有支出交易,这样就能得到余额。为此,我们需要了解有关收入和支出的信息,于是公共账本出现了。有了公共账本,我们就知道某人是否真的有能力支出 30 万美元。

比特币:开端

还有一个问题——如果我把所有钱同时发给两个人会怎样?这个问题被称为双重支出(double spending)。当然,这两个人不应该同时收到我账户里的钱。让他们自己商量谁将收到我账户里的钱?这样做不方便。通过查看时间戳来确定我把钱先转给了谁?这样做不保险。不过,还是有一个解决方案——对交易进行流水化。如果这样做了,那么很明显第一笔付款发给了 John,那么就无法再将它发给第二个人,因为我没有更多的钱。但现在还不清楚谁将决定交易的顺序。在银行和其他集中式系统中,银行本身就是受托人,也就是单一故障点和信任点,负责与第一个接收人沟通。

在区块链中,不存在这样的单个受托人,取而代之的是网络中的大部分参与者(当然,这是指将整个网络作为一个整体,因为你不能相信每个个体参与者,因为其中肯定有一些骗子)。我们假设网络不受一个人的控制,并且大多数参与者严格按照自己的经济利益行事。

但流水化交易仍然存在问题,我们还需要在网络参与者中达成“共识”。这个问题需要通过共识算法来解决,这是区块链领域的一个关键算法。

在讨论特定的共识算法之前,先让我们来说说臭名昭著的区块链的“区块”。区块是一种技术度量,是批处理的一个实例,因此我们可以以“批量”的方式计算多个交易的共识,并且网络的开销成本可以通过多个交易来“分摊”。

区块内交易的顺序由网络参与者(即生成该区块的人员,也称为“矿工”)定义,但区块本身的顺序则由共识算法来确定。共识算法已经存在了相当长一段时间。例如,多主 NoSQL 系统中的 Paxos 和 Raft 等算法就属于共识算法,但它们并不适用于拥有数百万个参与者的网络。

比特币的工作证明(proof of work,PoW)共识算法在刚开始时被认为是革命性的。许多网络参与者(矿工)同时生成新区块,那么就有必要确定区块之间的顺序。为了让一个区块成为链中的下一个区块,矿工必须进行非常耗时的散列计算。对一个区块(随同一个随机串,一个递增的数字)进行持续的散列计算,直到散列值看起来像是一个符合某些条件的大数,例如包含 10 个前导零。这需要数十亿次的散列操作,这一过程代表矿工“证明”该区块的存在。但检查矿工的工作是否正确却十分容易——只需要再进行一次散列操作。需要注意的是,整个网络(其中包括成千上万的矿工)平均在 10 分钟内(比特币生成区块的平均间隔)只可以生成一个区块 。这大大减少了出现冲突的可能性,即同时有两个或多个区块作为下一个区块。

但是,冲突的可能性仍然存在。于是就有了如下规则——网络参与者接受形成最长链的那个区块。

事实上,它不是一个链,而是一个有许多分支和链的有向无环图(DAG)。链通常被称为“共同历史”(它是最长的链)。共识不会立即达成,至少需要在生成几个区块之后,所以必须等待一段时间。为了防止比特币的双重支出,人们通常会等待六个区块(这需要一个小时)。

除了交易数据之外,一个区块还包含对前一个区块的散列值。因此,过去的某些内容不可能被修改,因为如果修改了就会使其后的所有散列无效。在挖矿过程中,你将获得奖励,也就是新的资金收益!否则的话,该如何将资金引入到这个系统呢?如果说资金必须发放给某人,那么这个人就变得很特别,这与去集中化的想法是相矛盾的。为挖矿者发钱似乎是一种合乎逻辑和可接受的解决方案。

顺便说一些关于挖矿的事。矿工的主要工作是对新区块进行散列计算,这里没有使用非对称加密技术,因为只需要在将交易添加到区块之前检查交易。比特币使用 SHA-256 散列,以太坊则使用 Keccak-256。如果你是独自挖矿,那么在生成一个区块之前,需要很长的时间(每十分钟产生一个区块,而你的竞争者有成千上百万)。因此,矿工需要聚集在一起形成矿池。在矿池中,奖励在参与者之间通过各种方式进行分配,这意味着你有可能会更经常地获得奖励。在这种情况下,风险和收益都是“分散”的。随着时间趋于无限,来自矿池开采奖励的数学期望值(无视矿池佣金)等于独自挖矿的数学期望值。

到目前为止,我们主要介绍的是网络参与者之间的数据交换,并没有深入太多细节。要记住,数据通过网络进行点对点交换,让每个挖矿者都能看到交易。

这就是比特币区块链技术。

智能合约和 ICO

让我们继续。两个操作(加法和减法)在比特币的每个账户上执行,任何人(主要是矿工)都可以检查它们。但如果我们向帐户添加内部变量并添加比较操作呢?假设当我积累了 1000 万美元时,我不想再让我的帐户继续接受资金,也就是说除了向账户添加资金的操作,还需要一定的条件。于是我们有了确定性图灵机(每个人仍然可以检查我的账户),然后是智能合同。本文所说的智能合约指的是以太坊网络中的智能合约,因为它是目前最受欢迎的智能合约。

确定性意味着在交易参数相同和存储初始状态相同的情况下,我们最终会得到相同的结果以及相同的存储变更。只有在这些条件得到满足的情况下,网络才能就每笔交易达成共识。我们必须明白,因为对确定性、可验证性和去中心化的要求,智能合约孤立于外部世界。例如,它无法调用去中心化的 Web API。另外,智能合约对外界的控制也非常有限。例如,要通过智能合约来租用公寓(交换加密货币)仍然是很困难的,因为我仍然需要确信当我来到公寓门口时,电子锁上面不会再套着一把老式的挂锁。

要了解智能合约的执行结果(新的余额或存储变更),网络节点必须执行该合约规定的操作。在多个节点上的计算不是免费的,因此,以太坊引入了瓦斯(gas)的概念,以避免出现硬编码加密货币佣金,并让用户可以计算运算数量及设置价格。这种结构提供了一个额外的间接层,让用户可以在低成本交易和快速交易之间进行选择。

当资金被发送到合约账户(通过地址)时,它便触发了回退功能,即默认的入口。与账户不同的是,合约有多个入口——因此可以接受参数。要修改合约(无论入口是什么),你必须将交易发送到网络。但是,如果你只想以只读模式查看某些内容,则可以通过使用最新的区块链在本地执行此操作。另外,与账户不同的是,智能合约没有私钥。你不能直接从余额中提取资金——这可以通过使用定义好的方法来完成,当然这些方法应该有安全限制,例如检查试图访问资金的用户的地址。

最后,我们在比特币风格的区块链上获得智能合约技术。

许多加密货币或所谓的“代币”都是基于以太坊智能合约。是的,通常这种加密货币只是一个以太坊合约。余额是 map 形式的智能合约存储条目,货币从一个参与者到另一个参与者的转移如下所示:

map[Alice] –= payment;map[Bob] += payment;

他们不需要自己挖矿和自己的网络,他们可以使用以太坊的基础设施。在以太坊中,ICO/ITO 是指加密货币(代币)的以太网交换(以太坊网络的加密货币)。 ERC20 标准说明了哪些方法必须在加密货币中定义,这要归功于交易所对加密货币的支持以及以太坊钱包提供的支持。

未来的发展

除了智能合约之外,还有很多其他建立在区块链基本概念之上的想法,比如“零知识证明(zero-knowledge proof)”和“自律网络(self-regulated network)”。

零知识证明基于同名的密码协议族,实质上,它最初用于在不解开整个对象的情况下证明该对象的所有权。例如,如果我能够说出某个文件随机十个字节的位置,那就可以证明我拥有这个 1GB 的文件。显然,在这种情况下,我将只公开了 1GB 中的 10 个字节。由于 RSA 加密涉及求幂,并且

(Y ∗ X) ^ a = Y^a ∗ X^a

所以最后变成了

encrypted(Y ∗ X) = encrypted(Y) ∗ encrypted(X)

也就是说,任何人都可以检查我的帐户余额是否正确执行了乘法预算,而且没有必要透露我的帐户上有多少钱!基于这个想法,我们可以创建一种可以保护余额和支付隐私信息的加密货币(实际上,这样的货币已经存在,如 Zcash)。

区块链提供的通用设置已经包含在网络客户端的代码中,例如区块的交易数量。通常,更改它们需要网络参与者社区接受这些更改(以代码更新的形式),这会带来网络分支的风险(当一些参与者决定不接受更改并继续使用“旧”代码)。自我监管尝试解决这些问题(参见 Tezos 或 EOS 区块链)。这个想法的本质是,对于每一次变更,都可以使用自己的资金进行投票(当然,不会失去它们)。

结论

简而言之,区块链技术走过了以下的路径:

交易签名(非对称加密技术)+ 交易的开放性 + 交易的流水化 + 到图灵机的扩展 +(零知识证明 | 自我监管 | ……)

我已经提到,许多加密货币实际上是以太坊的智能合约,也就是说它们使用了以太坊区块链。但除了比特币和以太坊之外,还有其他项目——它们在细节和主要特征方面可能会有所不同,有人已经尝试创建几乎全新的区块链,如 EOS,甚至是不同的区块拓扑,如 Tangle 和 AElf。

英文原文: https://medium.com/@Eenae/blockchain-through-the-eyes-of-a-developer-68415cc083c0

感谢郭蕾对本文的审校。

2018 年 5 月 31 日 18:313623
用户头像

发布了 731 篇内容, 共 378.8 次阅读, 收获喜欢 1887 次。

关注

评论

发布
暂无评论
发现更多内容

Java开发8年,40W年薪被别人叫垃圾?请你们不要口嗨了,好好去刷题吧!

Java架构追梦

Java 架构 面试题总结 金三银四 年薪40W

短视频编辑:基于ExoPlayer可实时交互的播放器

梅芳姑

定义边缘计算架构需考虑的三个方面

浪潮云

边缘计算

SCF—BSS3.0的“公路网”

鲸品堂

工具 框架搭建 流式计算框架

清明|TcaplusDB持续为您保驾护航

TcaplusDB

c++ 数据库 后端 TcaplusDB

融云X-Meetup南京站 探讨实时通信架构的高质量设计

融云 RongCloud

业务随行:用户的网络访问策略还能这么玩

华为云开发者社区

网络 通信 安全组 IP地址 业务随行

用DeBug的方式,带你掌握HBase文件在Snapshot的各种变化

华为云开发者社区

HBase 元数据 数据迁移 数据备份 Snapshot

单片机异常复位后如何保存变量数据

不脱发的程序猿

嵌入式 单片机 4月日更 硬件研发 单片机异常复位

融云推出超值套餐包,音视频20万分钟免费享

融云 RongCloud

在npm发布自己的组件

空城机

JavaScript 前端 npm 4月日更 自定义组件

OpenTelemetry 简析

阿里巴巴云原生

容器 开发者 云原生 k8s 监控

Netty HashedWheelTimer 时间轮源码详解

Yano

Java 架构 Netty

重磅官宣:Nacos2.0 发布,性能提升 10 倍

阿里巴巴云原生

Java 容器 微服务 云原生 应用服务中间件

[TcaplusDB知识库] TcaplusDB技术原理分享

TcaplusDB

数据库 后端 TcaplusDB

京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统

Crud的程序员

spring 编程 架构 springboot java程序员

如何美化 GitHub 个人主页?

彭宏豪95

GitHub 写作 markdown IT 4月日更

将AI部署到现实?或许你该读读这本书!

澳鹏Appen

人工智能 AI 伦理 人工智能大数据

自己搭建一个语音聊天室

anyRTC开发者

ios android 音视频 WebRTC RTC

Hexo + Material + Github 搭建博客

U+2647

博客 4月日更

flink流计算可视化web平台

无情

sql 流计算 flin

二次元界福音:MakeGirlsMoe创建动漫人物

不脱发的程序猿

GitHub 开源项目 4月日更 二次元 MakeGirlsMoe

货运物流移动端解决方案:为货运物流行业打造高性能、高粘性的“双端”触点

蚂蚁集团移动开发平台 mPaaS

mPaaS 移动端 智慧物流 移动开发·

MySql数据库列表数据分页查询、全文检索API零代码实现

crudapi

全文检索 API crud crudapi 列表查询

Kubernetes 稳定性保障手册 -- 可观测性专题

阿里巴巴云原生

Serverless 容器 云原生 k8s 存储

Serverless 可观测性的过去、现在与未来

阿里巴巴云原生

Serverless 容器 开发者 云原生 调度

8x Flow 业务建模法(一):你能分清业务和领域吗?

胡皓

领域驱动设计 DDD 架构设计 事件风暴 业务建模

软件测试分类体系,系统学习

程序员阿沐

软件测试 测试工程师 黑盒测试 白盒测试 测试类型

清明节特辑 |记忆存储、声音还原、性格模仿……AI可以让人类永生吗?

华为云开发者社区

AI 语音合成 清明节 对话机器人 VR/AR

Rust从0到1-所有权-引用和借用

rust 引用 所有权 借用

那些我磕过的音视频项目总结

梅芳姑

Study Go: From Zero to Hero

Study Go: From Zero to Hero

一个程序员眼中的区块链技术-InfoQ