10分钟了解区块链编程

Wesley13
• 阅读 508

谈起这几年最热的技术,一定少不了区块链。按说新技术的出现本是稀松平常的事情,但区块链的出现和发展,却有那么一点让人不淡定:

其一,区块链的代表应用比特币,其价格在这七八年间翻了上百万倍。2010年有人花10000个比特币买了两块披萨,在比特币最高价位时,这两块披萨相当于近两亿美元。

10分钟了解区块链编程

其二,因为区块链项目的大热,相关从业人员的需求激增,岗位薪资也水涨船高,让一众程序员们蠢蠢欲动。

10分钟了解区块链编程

正所谓人红是非多,关于区块链以及数字货币的争论一直不断。支持者认为区块链将会是有一项改变世界的新技术,而反对者则认为它不过是又一个更高级的庞氏骗局罢了。

10分钟了解区块链编程

我觉得,对于一个新兴事物,没必要过早地下结论。尤其在还不了解它的情况下,就凭自己的固有观念来站队打标签,这是很不明智的。

于是,和你们学习Python一样,我也在不断学习新的技术,而区块链就是我最近关注较多的一项。在这里分享下我对区块链的一些认识和理解。

说区块链就不能不说比特币。它们好像鸡和蛋的关系:区块链是比特币的技术基础,但区块链的相关研究却是由比特币开始

比特币的特殊之处在于,它通过区块链实现了一种新的记账方式:除了创世区块外,每个账本(区块)都记录了上一个账本的特征信息(哈希值),一个个账本构成了一整个链条。同时这个链条存在于整个网络的每个人手上。这样一来,如果要修改已有的数据,就会导致后续账本上的信息都不对了。如果你想对以前的一笔交易动手脚,则必须把后续账本上的记录都修改掉,并得到其他人的认可。

10分钟了解区块链编程

而比特币的另一项设计,就是每个账本上必须附带一个特殊的数字,这个数字的特点是难以计算但很容易验证。计算这个数字的过程就是我们常听到的“挖矿”。所以挖矿并不是指挖比特币,而是为了记账。只不过对于成功算出数字的人,会给予一定比特币的奖励。这个精妙的设计,使得前面说的篡改记录变得不可能—你无法拥有足够的计算能力去修改这些账本,这保证了整个链条的可信。

10分钟了解区块链编程

上图是哈希算法的示意图。假设我们想找到一个数字,使它加上账本上的信息,能满足算出的哈希值以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”,就得到了编译好的可执行代码。

10分钟了解区块链编程

在“Run”页面,选择“JavaScript VM”作为环境。Account 中,已经为我们准备好了几个余额(以太币)充足的账号。点击“Create”,合约就被部署到了区块链上,而相应的账号也被扣去部署费用。同时,下方出现我们定义的 set/get 方法。

10分钟了解区块链编程

在“Set”后面的框里输入 "Hello World, Crossin"(同py2一样,别少了英文引号),点击“Set”,账号再次被扣去执行的费用。从控制台可以看到合约执行的详细信息。

点击“Get”,则会看到我们刚刚写入的 Hello World, Crossin。因为 Get 定义的是常函数(constant),不会修改区块链中的数据,因此不消耗费用。

10分钟了解区块链编程

这就是用 solidity 实现的一个最简单的智能合约。

看到这里,你是否对区块链有了更多的认识?

但所谓术业有专攻,在区块链领域,我也只是一个学习者。理解上若有偏差,欢迎大家留言指正和讨论。

════
其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表

欢迎关注:Crossin的编程教室

点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Filecoin RPC API官方文档【中文版】
JSONRPC是一种标准的远程调用方式,在以太坊和比特币等区块链实现中都得到了广泛的应用。FilecoinLotus也是使用JSONRPC实现服务进程与客户端的通信,默认监听端口为1234,支持HTTP和Websocket。FilecoinRPCAPI中文文档由汇智网提供,访问地址:http://cw.hubwiz.com/card/c/file
Stella981 Stella981
2年前
GraphQL实战比特币实时行情【NodeJS】
在这篇文章中,我们将学习如何使用Node.js开发一个比特币实时价格行情的GraphQLAPI。比特币开发相关链接:c比特币开发详解(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fxc.hubwiz.com%2Fcourse%2F5c766a59f54a5
Wesley13 Wesley13
2年前
NEO从源码分析看UTXO交易
_0x00前言_社区大佬:“交易是操作区块链的唯一方式。”_0x01交易类型_在NEO中,几乎除了共识之外的所有的对区块链的操作都是一种“交易”,甚至在“交易”面前,合约都只是一个小弟。交易类型的定义在Core中的TransactionType中:源码位置:neo/Core/TransactionType
Stella981 Stella981
2年前
BnbTool
BnbTool开发包适用于为PHP应用快速增加对币安链/BinanceChain数字资产的支持能力,即支持使用自有部署区块链节点的应用场景,也支持基于第三方节点开放API服务的轻量级部署场景。官方下载地址:http://sc.hubwiz.com/codebag/bnbtool/(https://www.oschina.ne
Stella981 Stella981
2年前
DCF Plus重塑区块链产业联盟链,任重道远
  当前,区块链技术已进入联盟链阶段,而监管成为制约区块链产业健康可持续发展的关键问题,如何有效监管一直是各国最大的课题与挑战。区块链行业如何实现有效安全的监管,监管标准制定显得尤其关键,这是区块链行业向好的一大指标。  DCFPlus重塑区块链产业联盟链,任重道远  2019年年底,在区块链技术大会上,中国工程院院士谈及区块链的监管挑战时,再次为
Stella981 Stella981
2年前
Reddit是否计划继续在它的主要平台上推行比特币支付
Reddit是否计划继续在它的主要平台上推行比特币支付Reddit日前宣布其旗下商店RedditMarket现在可以接受比特币。Coinbase将在平台上处理用户的支付,该平台销售多种Reddit装备,包括价值142美元的毛绒玩具,也是该网站的吉祥物Shoo。Reddit的决定在推特上反响很强烈,尽管一些用户表示希望RedditMa
Wesley13 Wesley13
2年前
1区块链底层技术
  每次在讲解区块链时,都会收到很多关于底层技术问题,感觉很有必要对区块链的底层技术进行分享,这也是我写这一系列文章的动力。  2015年接触比特币(可惜当时没有囤币),作为一个在IT行业摸爬滚打多年,并且是技术出身的人,成功的被比特币底层技术区块链所吸引。区块链与其说是新兴技术,不如说是新的理念、新的概念或者说是一种架构应用,是对目前中心化系统存在问
Wesley13 Wesley13
2年前
NEO从源码分析看网络通信
_0x00前言_NEO被称为中国版的Ethereum,支持C和java开发,并且在社区的努力下已经把SDK拓展到了js,python等编程环境,所以进行NEO开发的话是没有太大语言障碍的。比特币在解决拜占庭错误这个问题时除了引入了区块链这个重要的概念之外,还引入了工作量证明(PoW)这个机智的解决方案,通过数学意义上的难题来保证每个
哈希搭建 APP 哈希搭建 APP
1年前
什么是数字货币?
数字货币是信息和技术革命的产物。2009年成功诞生。“比特币”是数字货币世界的第一种货币。数字货币的发行是通过计算机程序的算法以分散的形式实现的。在过去十年中,这些货币的交易继续发展,并产生了规范相关交易操作和实施监督的程序。通过“区块链”记账法,监控交易过程,了解每一笔账。这些数据可以通过在线交易中获得的密码和用户名提供给所有经销商。矿工被视为加密货币市场
金旋 金旋
2个月前
Go语言区块链全栈课程学习【博学谷】
//下仔のke:https://yeziit.cn/13615/区块链是一种分布式数据库,由一系列按照时间顺序排列的数据块组成,并采用密码学方式保证不可篡改和不可伪造。它最初起源于比特币,作为比特币的底层技术,用于去中心化和去信任地维护一个可靠的数据库。相