谈起这几年最热的技术,必定少不了区块链。按说新技术的出现本是稀松日常的事情,但区块链的出现和发展,却有那么一点让人不淡定:程序员
其一,区块链的表明应用比特币,其 价格在这七八年间翻了上百万 倍。2010年有人花10000个比特币买了两块披萨,在比特币最高价位时,这两块披萨至关于近两亿美圆。算法
其二,由于区块链项目的大热,相关从业人员的需求激增, 岗位薪资也水涨船高 ,让一众程序员们蠢蠢欲动。编程
正所谓人红是非多,关于区块链以及数字货币的争论一直不断。支持者认为区块链将会是有一项 改变世界 的新技术,而反对者则认为它不过是又一个更高级的 庞氏骗局 罢了。网络
我以为,对于一个新兴事物,不必过早地下结论。尤为在还不了解它的状况下,就凭本身的固有观念来站队打标签,这是很不明智的。分布式
因而,和大家学习Python同样,我也在不断学习新的技术,而区块链就是我最近关注较多的一项。在这里分享下我对区块链的一些认识和理解。函数
说区块链就不能不说比特币。它们好像鸡和蛋的关系: 区块链是比特币的技术基础,但区块链的相关研究倒是由比特币开始 。学习
比特币的特殊之处在于,它经过区块链实现了一种新的 记帐方式 :除了创世区块外,每一个帐本(区块)都记录了上一个帐本的 特征信息 (哈希值),一个个帐本构成了一整个链条。同时这个链条存在于整个网络的每一个人手上。这样一来,若是要修改已有的数据,就会致使后续帐本上的信息都不对了。若是你想对之前的一笔交易动手脚,则必须把后续帐本上的记录都修改掉,并获得其余人的承认。区块链
而比特币的另外一项设计,就是每一个帐本上必须附带一个特殊的数字,这个数字的特色是难以计算但很容易验证。计算这个数字的过程就是咱们常听到的“挖矿”。因此挖矿并非指挖比特币,而是为了记帐。只不过对于成功算出数字的人,会给予必定比特币的奖励。这个精妙的设计,使得前面说的篡改记录变得不可能—你没法拥有足够的计算能力去修改这些帐本,这保证了整个链条的可信。spa
上图是 哈希算法 的示意图。假设咱们想找到一个数字,使它加上帐本上的信息,能知足算出的哈希值以4个0开头,是很是耗时的(挖矿);但若是给定了数据,验证它的哈希值是否以4个0开头,则很是容易(验证)。设计
比特币没有咱们一般意义的帐户,它的帐本上的内容是一条条 转帐记录 ,收款人是一个个 数字地址 。除了持有地址对应口令的人以外,没法知道这些地址的主人是谁。所以比特币交易从技术上是 匿名的 。只要你有口令,你就能转走里面的比特币。丢了口令,你的币就再也找不回来了。
综上, 比特币提供了一种去中心化的、不可篡改的、匿名的记帐方式 (而并不是一种以实体存在的“币”,即使在网络上,也没有“一个比特币”)。而逐渐人们又发现,比特币背后的区块链蕴含着更大的想象空间。
以太坊 就是 区块链 的另外一个热门应用。它最大的优点是提供了“ 智能合约 ”。若是说,比特币解决了交易记录的可靠性问题,那么智能合约就更进一步,避免了赖帐的问题。
智能合约至关于一段代码,它能够像交易记录同样被添加到区块链上,又能够 在条件知足时被触发执行 。这从技术上解决了交易双方的信任问题,提供了点对点的合约,没有中间商赚差价。以太坊也再也不是一个单纯的帐本,而成为一个去中心化的应用平台。在这个平台之上,开发能够构建更加复杂分布式应用,无需自行实现便可拥有区块链的功能。
从程序员的视角来看,以太坊是一个 虚拟机 。在这个虚拟机之上,咱们能够用代码开发本身程序(智能合约)。写好的程序被上传到区块链上,等待条件触发执行。前面说过,区块链的产生是须要有人来计算的,所以在以太坊 部署和执行代码须要支付费用(以太币) ,以维持这个系统。
以太坊使用的开发语言叫 Solidity ,它与 JavaScript 相似,也借鉴了 C++ 和 Python。它因以太坊而生,所以是面向合约的,并自带支付功能。我们做为一个编程类的干货公众号,此处必须得来一段代码了。
Talk is cheap. Show me the code.
写一个 Solidity 的 HelloWorld 并不难。咱们在官方文档的例子上稍做修改:
pragma solidity ^0.4.10; contract HelloWorld { string greeting; function set(string s) public { greeting = s; } function get() public constant returns (string) { return greeting; } }
这是一段很基础的面向对象代码, 合约(contract) HelloWorld 有一个变量 greeting,get/set 两个方法分别获取和修改这个变量。第一行 pragma 则是指明使用的 solidity 版本。
要执行这段代码,可使用在线开发环境 remix.ethereum.org。将代码复制到编辑区,点击“ Compile ”-“ Start to compile ”,就获得了编译好的可执行代码。
在“ Run ”页面,选择“ JavaScript VM ”做为环境。 Account 中,已经为咱们准备好了几个余额(以太币)充足的帐号。点击“ Create ”,合约就被部署到了区块链上,而相应的帐号也被扣去部署费用。同时,下方出现咱们定义的 set/get 方法。
在“Set”后面的框里输入 "Hello World, Crossin" (同py2同样,别少了英文引号),点击“Set”,帐号再次被扣去执行的费用。从控制台能够看到合约执行的详细信息。
点击“Get”,则会看到咱们刚刚写入的 Hello World, Crossin 。由于 Get 定义的是 常函数(constant) ,不会修改区块链中的数据,所以不消耗费用。
这就是用 solidity 实现的一个最简单的智能合约。
看到这里,你是否对区块链有了更多的认识?
但所谓术业有专攻,在区块链领域,我也只是一个学习者。理解上如有误差,欢迎你们留言指正和讨论。
════
其余文章及回答:
如何自学Python | 新手引导 | 精选Python问答 | Python单词表
欢迎关注: Crossin的编程教室