区块链的认识

参考连接如下:

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/1_conception/distributed_system.html
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/1_conception/understandable_blockchain.html
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/1_conception/on_and_off_the_blockchain.html
智能合约说明
http://www.woshipm.com/blockchain/1442574.html

说明:打开以上链接是需要开启ACC(VPN的一种,你懂得)

将个人感觉通俗易懂的片段进行提取,如下

区块链的通俗解释

  要理解区块链,首先要接受一个设定:有个账本,要记录的是一群人之间的公共账目(比如班费、物业费、公益捐款的收支),这个账本由大家一起来记账。选一个人,在账本的某一页,一行一行的记录明细,当一页记满后,大家都去核对账目,正确的话,大家签字认可这一页的所有账目。记满一页后,再选另一个人开始记接下来的一页。现在有意思的事情来了,新的一页首先要把上一页的一些摘要特征(比如页码、余额、人数、条数什么的…)抄写下来放在页首以供对照,免得前一页被改了或丢了还无据可查。然后,再一条条记账,记满一页后,核对、签名确认…依次反复。这样,账本的一页和一页之间就形成了“证据链”。

  更重要的是,账本上已经签名确认的每一页,所有人都会一字不漏地复制一份,放到自己家里,以免少数人篡改、污损、丢失账目。这样,账本的每一页是一个“区块(Block)”,一页一页之间形成前后连贯的证据链,每个人之间构成了多点的网络,这就是“区块链”的概要原型了。这里面的关键点在于,这个账本一定是一群人的账,并不是一个人的账。如果是一个人的账,自己拿个小本本记就好了,为什么要整这么麻烦。就是因为这一群人互相之间并不完全信任,记账过程可能出纰漏,所以必须用这么繁琐的步骤,让大家平等参与,一起保证账目的准确和公允性,产生的结果大家保存,永远不会丢也不会错。

  上面的举例看起来步骤繁琐,还要求每个人都一字不差地复刻和保存,那么就需要技术手段来帮助大家记账。这又回到技术环节,随着计算机科技的发展,无论是网络、密码学、数据结构、分布式算法等技术都趋于成熟,区块链领域把这些技术组合在一起,一揽子完成了从记账到分发到验证到保存的整个过程。运用技术服务整个群体,这就是神奇的区块链技术。

  交易层面,在一个互相没有强信任关系的网络里,且处理的是大概率和“价值”有关系的交易,区块链尤其强调交易的全局事务性,保证全网一致性,且为了避免有作恶节点伪造假数据,所有的交易都会在共识机制和网络同步驱动下,在所有的节点上进行排序、运算和校验。 在支持智能合约的区块链上,每个智能合约被交易调用时,都会在所有节点上把合约代码跑一遍,以确保在每个节点上生成数据的过程是公认的、运行结果是一致的。

共识算法

  还是引用一个数钱的例子: 有一大堆钱让十个人数,有两种方法。 方法一,可以把钱分成十份,每个人数一份,这样很快就数完了,人越多,数得越快,但是如果里面有人数错了,或者甚至偷钱,那就有问题了。 于是,为了资金安全,改成方法二,让一个人整理出一叠钱,先数一遍,然后让其他九个人也数一遍,每个人都验算记账后,再换个人整理出下一叠钱,重复上述节奏去数,这样结果肯定是不会错的,且能得到大家的公认。但参与数钱的人增加,并不会加速计数,反而有可能因为人多手杂导致更慢。 方法一就是常见的互联网分布式系统的做法,方法二是区块链。 可见,目的不同,导致设计哲学、系统结构、最终效果都不同。

  综上所述,区块链这种“分布式系统”,存储成本和节点数同比线性增加,而计算效率不升反降,使整个系统显得“贵”和“重”,这和互联网服务的“轻快灵”相背而驰。最要命的是,难以通过增加硬件、带宽、节点数来显著提升并行处理能力和存储量。 但区块链的“网络规模效应”并不体现在硬件和计算上,而是体现在因为“共识”和“信任”上。 区块链通过复杂的算法和博弈,构建了一种可信网络,使得更多人愿意参与到网络里,共同贡献数据和维护网络,体现“协作共赢”这个价值效应。 这样也给我们一个重要启示:既然区块链的计算和存储成本是很高的,其目的是为了达到共识,那么,我们应该让区块链干最该干的事情。

上链

交易“上链”的简要过程如下:

  1. 记账者们收录交易,按链式数据结构打包成“区块”。
  2. 共识算法驱动大家验证新区块里的交易,确保计算出一致的结果。
  3. 数据被广播到所有节点,稳妥存储下来,每个节点都会存储一个完整的数据副本。

交易一旦“上链”,则意味着得到完整执行,达成了“分布式事务性”。简单地说,就像一段话经过集体核准后在公告板上公示于众,一字不错不少,永久可见且无法涂改。 “上链”意味着“共识”和“存储”,两者缺一不可。交易不经过共识,则不能保证一致性和正确性,无法被链上所有参与者接受;共识后的数据不被多方存储,意味着数据有可能丢失或被单方篡改,更谈不上冗余可用。 除此之外,如果仅仅是调用接口查询一下,没有改变任何链上数据,也不需要进行共识确认,则不算“上链”。

或者,某个业务服务本身和区块链并不直接相关,或其业务流程无需参与共识,所生成的数据也不写入节点存储,那么这个业务服务称为“链下服务”,无论它是否和区块链节点共同部署在一台服务器,甚至和节点进程编译在一起。 当这个业务服务调用区块链的接口发送交易,且交易完成“共识”和“存储”后,才称为“上链”;如果这个交易没有按预期被打包处理,那么可以叫“上链失败”。

事实上,几乎所有的区块链系统,尤其是和实体经济、现实世界结合的区块链应用,都需要链上链下协同,用“混合架构“来实现,系统本身就包含丰富的技术生态。

交易之轻和“上链”之重

目前区块链底层平台逐步趋于成熟,性能和成本已经不是什么大问题,只是以下几个开销是因“分布式多方协作”而先天存在的:

  • 共识开销:主流共识算法里,PoW(工作量证明,也就是挖矿)消耗电力;PoS(权益证明)要抵押资产获得记账权;PBFT(联盟链常用的拜占庭容错算法)记账者要完成多次往返投票,流程步骤繁杂。
  • 计算开销:除了加解密、协议解析等计算之外,在支持智能合约的区块链上,为了验证合约的执行结果,所有节点都会无差别地执行合约代码,牵一发而动全身。
  • 网络开销:与节点数呈指数级比例,节点越多,网络传播次数越多,带宽和流量开销越大,如果数据包过大,就更雪上加霜。
  • 存储开销:和节点数成正比,所有的链上数据,都会写入所有节点的硬盘,在一个有100个节点的链上,就变成了100份副本,如果有1000个节点,那就是1000份。

也许有人会说:“这就是‘信任’的成本,值得的!”我同意。只是理想无法脱离现实,毕竟硬件资源总是有限的。 想象一下,如果每个交易都是一个复杂科学计算任务,那么每个节点CPU和内存会跑满;如果每个交易都包含一个大大的图片或视频,那么全网的带宽,以及各节点存储很快被塞爆;如果大家都敞开来滥用“链上”资源,“公地悲剧”就不可避免。 调用API发个交易是很容易的,而链上的开销就像房间里的大象,难以视而不见。作为开发者,需要正视“交易之轻和链上之重”,积极“上链”的同时减少不必要的开销,找到平衡之道。

*注1:常规联盟链节点参考配置:8核/16G内存/10m外网带宽/4T硬盘,不考虑“矿机”和其他特种配置。土豪随意,俗话说“钱能解决的问题都不是问题,问题是…”

哪些数据可以“上链”?

只有多方要在交易过程中用到的、必须共享的关键数据要上链,比如公共账本的账目。

  视频、文件、图片、大规模的业务数据,可以生成摘要与交易数据关联,其本体通过其他渠道(如FTP、分布式文件系统等)进行交换。 比如下棋,只需要把棋局结果放到链上,或者把每一步的数据算个摘要放到链上,并不需要每一步都记录到链上(除非认为这也是非常关键的信息)。 毕竟每一笔放到“链上”的数据,都会占用所有节点的硬盘。

合约里写什么逻辑?

  应该是写多方共同参与、协作记账、必须全局共识的关键逻辑,而不是牵涉密集计算的逻辑。 比如,进行复杂查询或建模分析,可以把链上的数据导出来放在链下去做,而不是写在合约里。要清楚,你写的每一行代码,再不是只在自己的服务上跑一次了,而是会在链上所有参与者的节点上跑起来,多写一行代码就会多消耗大家的一点CPU。 所以,区块链上会有类似“Gas上限”这样的机制,来控制合约的代码规模。新一代的合约引擎,更是考虑只提供有限的、可以定制化的商业规则实现,而不是完全的开放式编程。 作为开发者,是面向“自己的电脑”编程,还是面向“大家的电脑”编程,这就是互联网海量服务系统和区块链最大的不同。 开发者必须切换思维模式,切忌滥用区块链上宝贵的计算、存储、网络资源,避免有意或无意的“公地悲剧”,而是精打细算,从全局权衡,找出协作模式和数据共享里的“最大公约数”,把好钢用到刀刃上。

区块链信什么

信密码学算法
区块链是用算法达成信任的,其中最重要的算法之一,就是密码学。区块链中最基本的密码学应用是HASH摘要、对称加密和非对称加密算法,以及相关的签名验签算法。

HASH算法的旧版本已经被证明可破解而被抛弃了,目前在用的SHA256等算法依旧坚不可破。HASH算法的特性是把一堆数据单向生成一段定长的数据,基本不会发生碰撞,可起到原始数据的“指纹”作用,其单向性不可逆,推不出原始数据,具有一定的抗量子性,
是能隐藏原始数据又能在必要时提供校验凭据的最佳方式。 数字签名一般基于公私钥体系,用私钥签名,公钥验签或者反之。数字签名源自密码学的牢靠性,使得不可能有人能伪造别人的私钥签名,所以一个拥有私钥的人可以通过数字签名,对他的资产签名确权,或者在双方交易时,采用对手方的公钥发起交易,将资产转移给对方,
对方用自己的私钥才能验签解开,以获得所有权。
AES、RSA、ECC椭圆曲线等几种对称和非对称算法广泛地用于数据加解密、安全通信等场景,其安全级别取决于算法本身和密钥长度,当AES使用128~512位密钥,RSA/ECC采用1024甚至2048位密钥时,其保护的数据理论上需要普通计算机上亿年的计算时间才能暴力破解。
这些算法在商业、科学、军事领域都经受了考验。 加密学领域里还有同态加密、零知识证明、环签名群签名、格密码等新的方向,目前都处于从理论发展到工程的阶段,都在功能、安全强度、效率方面快速优化中,已经可以看到落地使用的可能性了。同时我们也意识到,密码学通常需要经过长期的发展、验证,稳定后才能获得广泛认可,
要么实践中经历了大量考验,要么经过权威机构的审核和认证,才能在生产领域大放异彩。密码学里的理论到工程,常常有很长的时间周期。 加密算法的一个基本哲学是计算成本,当一个算法保护的资产价值,远低于攻破该算法所需的成本时,就是安全的。但如果用一个算法保护一个无价之宝,自然就会有人不计成本地去攻击获利,所以,密码学的安全,也是辩证的、需要量化的。 随着量子计算机等学说的兴起,经典密码学可能会经受一些挑战,但量子计算机的理论完善和工程实现还有待时日,目前来看,基本上我们可以近乎“无条件”相信区块链里已经采用的密码学算法,同时,区块链领域的实践者也在陆续引入各种抗量子的密码学算法,这是一场持续的博弈。
信数据
区块链的数据结构,无非是区块+链。新区块将自己的区块高度、交易列表,和上一个区块的HASH,共同再生成一个HASH做为新区块的标识,如此循环,形成了一个环环相扣的数据链。这个链条里的任何一个字节甚至一个Bit被修改,都会因为HASH算法的特性被校验发现。

同时,区块数据被广播给全网所有参与者,参与者越多,规模效应越强。少数人即使强行修改、删剪自己的区块数据,也很容易被其他人校验出异常并不予采纳,只有多数人认可的数据得以留存和流传。也就是说,数据是大家人盯人的形态盯着的,且存在多份副本,一旦落地,只要链还在,
数据就可以永远留存。 基于容易验证的链式数据结构、群体冗余保存、共同鉴证,区块链数据是“难以篡改”的,所有人拿到的数据也都是一致的,信息公开透明,公共知识得以彰显和固化。 从另一个角度看,数据达到信任,但能否达到“信用”还要看数据的价值,也就是数据本身携带的信息,是否能代表有价的资产、有用的信息,诸如身份、交易关系、交易行为、大数据等等,都能代表一定的商业价值。这些数据如果分享出来,足以构建完整的商业基础。 但如果是在过于强调隐私的场景里,大家愿意分享的信息本来就很少,那样就很难达到信用的“最大公约数”。然而,在当前的商业环境里,信息隔离和隐私保护是硬诉求,信息共享和隐私保护成了严峻的矛和盾的关系,除非整个商业关系和商业逻辑出现了革新。 所以,隐私保护相关的研究被大量关注,诸如“多方安全计算”、“零知识证明”的理论大行其道。理论上讲,确实可以做到公布很少的信息就能做到可验证,但其复杂性和计算开销,又是工程层面要去解决的事情了。
信博弈论
区块链中最玄妙的部分是“共识算法”。共识算法的定义是在一个群体中,用一种机制协调大家共同或轮流记账,得出无争议的、唯一性的结果,且保证这个机制可以持续下去。

换句话说,大家一起维护一个账本,选择谁做为记账者?凭什么相信记账者的动作是正确的?怎么防止记账者作恶?如果记账者正确记账如何得到激励?共识机制完整地回答了这些问题。

共识的逻辑是发生在线上的,但实际上,背后是现实世界的竞争博弈。

POW(工作量证明)采用算力去竞争记账者的席位和获得记账者的奖励。现实生活中,为了构建具有竞争力的算力工厂,矿工通常需要研发或购买大量的新型号矿机,运输到有稳定和便宜电力供应地区,消耗大量的电费、网费以及其他运营费用,在被监管时又得举家搬迁,浪迹全球,
实际上投入了大量(现实世界的)资金、精力以及背着巨大的风险。如果要在POW竞争中获得稳定可观的收益,投入的资金动辄以亿计,并不亚于办一家企业。 POS和DPOS用权益证明代替了算力消耗,看起来是环保多了。而代表权益的token,除了创始团队自己发行的之外,“矿工们”一般需要通过币币兑换,或者直接法币购买数字币的方式获得,即使是币币兑换,掏出来的币也常常是采用法币购买的,或者至少这些权益都能以法币进行标价,
这其实也是现实世界里的财富注入和背书。 然而,和现实的商业关系对比,POW和POS等共识并没有法律和监管机制兜底,也容易受不断变化的博弈形势所影响,比如社群的规模、矿工的更迭、核心技术运营团队的变化。慢慢地,本来有钱和有能力的人,或许会更加有钱和有权力,去中心化的网络可能逐渐变成了卡特尔组织,
矿工和技术社区的瓜葛也会不停地掀起波澜,造成分叉、回滚、价格倾轧、对韭当割等现象。 总的来说,人们还是信任区块链上的“自治”,在这种分布式自治里,单个事件(如一笔交易)具有“概率性”,同时全网又追求“最终一致性”(公共账本的一致)。这种短期的概率性和长期的确定性,一定程度上可以达成动态的“纳什均衡”,支撑起链的生态,给人演化出一种玄妙的“信仰”感。 另一方面,联盟链的记账者一般是机构级的角色。联盟链要求记账者身份可知,参与者们经过许可才能接入网络,他们之间是一种合作博弈。联盟链引入了现实世界里的身份信息作为信用背书,如工商注册信息、商业声誉、承兑信用、周转资金,或者行业地位、执业牌照、法律身份等,
参与者在链上的一切行为均可审计、追查,也让相关的监管部门在必要时可以有的放矢,精准惩戒,强制执行,具有很高的威慑力。 在这种环境里,联盟链的参与者一起协作维护网络,共享必要的信息,在平等透明、安全可信的网络里开展交易,只需要防止少量记账者的恶意操作风险,避免系统上的可用性风险。因引入了现实世界里必要的信任背书,即使联盟链业务逻辑非常复杂,而信任模型却更直观。 所以,所谓的共识机制,背后依旧是现实世界里财力物力的竞争和信用背书,以及相应行之有效的激励和惩戒机制。 天下并没有免费的午餐,也没有平白无故的爱恨。“信”一个记账者,是信他在现实世界里所投入的成本、付出的代价,以及考虑到整个机制有震慑他的惩罚,相信记账者为了持续的收益和增值,不会无故破坏这个网络。

信智能合约

智能合约是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表于自己的网站的几篇文章中提到了智能合约的理念,定义如下:

“一个智能合约是一套以数字形式定义的承诺(promises),包括合约参与方可以在上面执行这些承诺的协议”。

简单地说,可以理解为纸质合约的电子版,用代码实现,无差别地运行在区块链网络的每一个节点上,在共识的作用下执行既定的合约规则。

智能合约一般基于一个特制的虚拟机,使用沙盒模式运行,屏蔽掉可能导致不一致性的一些功能。比如获取系统时间这个操作,在不同的机器上,时钟都可能不同,这就可能导致依赖时间的业务逻辑出现问题。再比如随机数,以及外部文件系统、外部网站输入等,
这些都可能导致虚拟机执行结果不同,都会被虚拟机沙盒环境隔离。 如果要采用java语言写合约,要么裁减掉jdk里的相关函数(系统时间、随机数、网络、文件等),要么放到一个有严密权限管控和隔离设定的docker里运行。或者干脆设计一门新的语言,如以太坊的Solidity,只实现特定的指令。又或者放弃掉一些“智能”特性,
用简单的堆栈指令序列完成关键的验证判断逻辑。 所以,在区块链上执行智能合约,基于沙盒机制控制,凭借区块链的共识算法,达到全网一致、难以篡改、不可否认等特性,运行结果输出就是全网认可的一份合同,江湖人称“Code
is Law”。 然而,只要是代码,就一定有出现bug或漏洞的概率,可能来自底层虚拟机和网络漏洞,更多的可能来自逻辑实现。随便搜一下“智能合约 安全 漏洞”,就有一堆搜索结果,包括溢出、重入、权限错误等,甚至就是低级错误。近年来,这些漏洞已经造成各种资产损失,
最著名的是DAO项目代码漏洞、Parity的多签钱包漏洞、某互联网公司的代币交易过程溢出归零…… 技术文章可以参考:https:
//paper.seebug.org/601/ 目前,行业里对智能合约的安全也是各出奇招,包括安全公司和白帽子审查、形式化证明、众测等,对安全问题会有一定地改善。如果再出问题,要么是黑客太厉害,或者只能抓程序员祭天了:) 所以,信智能合约,是有条件的,是要信经过严格测试、长时间稳定运行、万一出错还有办法补救(而不是绝望的只能等分叉大招)的合约。联盟链里的智能合约一般是经过严格测试的,上线时会执行灰度验证流程,运营中监控运行过程,且根据治理规则设计事后追责、
补救(冲正,调账,冻结…)等措施,还是比较可信的。
信中间人(?)
注意本小节标题打了问号,区块链推崇“去中心或多中心,去中介或弱中介”的运作模式,但是由于目前发展尚未完善,很多场景实际上还是引入了中介,如币币兑换通常需要经过交易所,尤其是中心化的交易所。其交易原理是要求用户把资产存入交易所的帐户里,
交易时其实是在交易所的数据库里进行记账,只有在存币或提币时,才会和区块链网络发生交互。 交易所的信任模型和区块链某种程度上是脱钩了,这时,交易所本身的资质,运营方的技术能力、安全防护能力、资产信用和承兑能力,才是用户最需要关心的。一旦交易所出了问题,比如跑路、破产、暗盘操作、监守自盗,基本上散户就只能做韭菜了。 多的不说,参见著名的“门头沟事件”:https:
//baike.baidu.com/item/Mt.Gox/3611884 所以,相信一个托管者,是一个见仁见智的事情,只是现行的模式里,类似交易所这样的角色还在某些区域运作着。2018年,全球虚拟数字资产交易所有1万多家,其中多少能做到高规格的安全,运营规范,干净……那就看情况了。 最后提一点:联盟链默认是没有公链那种虚拟数字资产交易所的。

区块链领域的细节还有很多,以上先罗列主要的几个点,信任技术,信任共识机制,信任规模化的社群博弈,超过了信任“人”。“人”是一种不确定因素,你可以信任一个你很熟悉很老铁的人,也可以信任一大群有共同理念且有完善机制协作的人,但你不能信任某一小撮居心叵測的人,要不分分钟变成韭菜:)

总结一下,在区块链世界中,人们可以建立以下基本的信心:

  • 我持有的资产和信息,只有我能动用或披露
  • 我可以按公允的规则参与交易,分享信息,转入转出资产
  • 别人给我转过来的资产一定是有效的,不会被重复花费而失效
  • 一旦交易完成,就是板上钉钉的事情
  • 一切已经发生的事情都可验证,可追溯
  • 违反规则的人会损失更大
  • 维护网络的人付出了劳动会有恰当的回报,整个模式可持续

基于这些信心和信任,在合法合规的前提下,人们给网络注入各种资产,开展互补互利、规则透明、公开公平公正的商业行为,将会是一种理想的状态。

智能合约

智能合约是一种特殊协议,旨在提供、验证及执行合约。

 智能合约包含了有关交易的所有信息,只有在满足要求后才会执行结果操作。智能合约和传统纸质合约的区别在于智能合约是由计算机生成的。因此,代码本身解释了参与方的相关义务。

很多区块链网络使用的智能合约功能类似于自动售货机。智能合约与自动售货机类比:如果你向自动售货机(类比分类账本)转入比特币或其他加密货币,一旦输入满足智能合约代码要求,它会自动执行双方约定的义务。

义务以“if then”形式写入代码,例如,“如果A完成任务1,那么,来自于B的付款会转给A。”通过这样的协议,智能合约允许各种资产交易,每个合约被复制和存储在分布式账本中。这样,所有信息都不能被篡改或破坏,数据加密确保参与者之间的完全匿名。

为了编写智能合约,你必须使用智能合约语言(SCL)。这些是直接编写智能合约或编译成智能合约的编程语言。Solidity是一种编写智能合约的编程语言,它在以太坊虚拟机上运行。它是一种面向合约的高级语言,其语法类似于JavaScript,主要针对以太坊EVM

 

posted @ 2022-01-13 17:10  背着泰山找黄河  阅读(558)  评论(0编辑  收藏  举报