区块链编程完全指南:平台、语言与结论
链客,专为开发者而生,有问必答!
此文章来自链客区块链技术问答社区,未经允许拒绝转载。
区块链,代表着未来的发展方向。是的,在文章开头,我们首先给出这样的结论。当然,认定未来将围绕这一新兴技术而延拓绝不是什么牵强附会。区块链最初是一种公开且不存在准入限制的技术,但随着后续发展又有新的类型逐步出现,而且每种区块链都有着自己特定的用例集合。公开/无准入区块链的特征包括开放、去中心化以及速度缓慢,而私有/准入型区块链则采取部分或者完全封闭的集中管理方式。
通过今天的文章,我们将共同探讨需要学习哪些知识才能立足区块链技术开发应用程序。当我本人(原文作者)刚刚开始学习区块链时,跟大家一样,我也觉得脑袋里塞满了模糊而难解的疑问。区块链分为哪些不同类型?我应该使用哪种编程语言进行高效编程?区块链又有哪些可选的开发平台?别急,这些问题都将在今天的文章中一一得到解答。
下面,就让我们从编程语言开始,逐步了解如何开发出能够充分运用区块链技术优势的应用成果。
区块链编程类型
· 区块链架构编程
在区块链发布之前,开发者首先需要解决构成其架构与协议的各项重要功能,而功能自然必须使用代码来编写。举例来说,在2009年正式发布之前,比特币项目的管理规则与条款是使用C++编写的。这方面编码工作通常使用C及Java等语言来完成,其特点就是表达方式更接近于机器的处理习惯。
· 构建智能合约,或者去中心化应用(简称DApp)
在一般的中心化应用程序当中,后端代码运行在中央服务器之上;与此不同,DApp的后端代码则在去中心化的对等网络中运行。与其它应用程序一样,DApp也能够使用任意语言及用户界面进行前端代码编写,并直接调用后端提供的功能。
常见区块链编程平台
· Hyperledger
Hyperledger实际上是开源区块链领域的一个总集类项目,旨在推进相关技术发展,并通过自身引导发布相关工具、培训与活动,从而支持全球区块链分布式分类账的协同开发工作。该项目的目标在于提供模块化区块链技术,其中也包括各类丰富且易于使用的应用程序编程接口(简称API)。Hyperledger能够显著降低安全风险,并确保只有希望参与交易的各方才能加入到交易过程中来。总而言之,Hyperledger能够提供区块链架构、数据隐私保护、信息共享以及不可变性等全部与区块链密切相关的功能。
· 以太坊
以太坊是一套开源区块链平台,用于开发可运行在区块链技术之上的去中心化应用或者DApp。以太坊区块链平台提供强大的脚本或脚本合约支持能力,并将其运行在自身网络的各节点当中。以太坊不仅能够追踪交易活动,还可以对其进行编程。目前以太坊提供多种编程语言选项,具体包括C++、Go、Python以及Java等。智能合约则需要使用Solidity构建,这是一种面向合约的高级编程语言。
五大常用区块链编程语言
- C++
下面让我们从清单当中最古老、也最受推崇的语言——编程语言界的常青树C++开始。相信大家都很清楚,C++语言属于C语言的扩展方案。在C++中,我们可以创建数据、函数与对象包,并在其它程序中轻松对其进行调用与复用,这将大大缩短编码的时间周期。
然而,考虑到当前可选择的高级语言多种多样,我们为什么还要使用C++?
简单来讲,这是因为C++具有某些无法替代的特性,并因此获得了强大的吸引力。考虑到区块链开发中的种种挑战,我们可以将理想的区块链开发成果视为一种安全堡垒,同时要求其提供高效的资源管理能力。区块链需要与诸多不受信任的节点进行交互,同时确保能够为一切节点提供快速服务。更重要的是,服务的快速性往往直接决定着加密货币项目的命运。因此,开发人员必须面对资源需求争用问题并将核心功能设定为最高优先级,这就要求大家必须完全控制CPU与内存资源的使用——重点来了,C++能够帮助用户很好地实现这一目标。
C++的另一大有趣之处,在于其具备move语义。Move语义提供了一种在不同对象之间进行内容移动,而非内容复制的方法。Move语义的优势在于,我们可以仅在必要时才获取某些数据的副本,这将显著减少代码冗余进而提高性能水平。因此,C++所代表的内存管理与强大性能表现恰好契合区块链技术的实际应用需求。
在区块链编程方面,我能想到的另一个重要挑战,在于如何将并行化任务与非并行化任务整合起来。大多数语言往往只专注于其中一种,但C++的线程化能力使其能够同时应对并行与非并行任务。C++允许多线程设施实现高效的线程间通信,同时对其中的单线程性能做出优化。
C++的优势与短板
C++区块链用例
C++语言主要用于加密货币以及其它一些重要的区块链项目,包括比特币、Ripple、Bitcoin cash、Litecoin、Stellar以及Monero。
- JavaScript
JavaScript是目前最具人气的软件开发语言之一。JavaScript及其库与框架,包括jQuery、React、Angular和Node等,已经成为现代Web开发的驱动引擎。与HTML及CSS加以配合,其功能也将得到进一步提升。JavaScript的主要用途在于创建存在大量交互效果的页面。
事实上,JavaScript本身也具备一种非常适合区块链操作的重要特性,这就是其非常关于处理异步操作。随着区块链平台上用户数量的激增,同时执行的操作量也将快速增长,而JavaScript能够更轻松地处理一切不同区块链节点之间的往来通信。但是,我们必须承认一点,JavaScript在充分运用计算机处理能力方面不如C++高效。
JavaScript的优势与短板
JavaScript区块链用例
区块链开发人员目前在web3.js以及ethereum.js当中使用JavaScript,其能够帮助我们将应用程序的前端与以太坊网络及智能合约连接起来。在区块链领域,另一大主要JavaScript应用方向为针对node.js的Hyperledger Fabric SDK。这是一套在IT行业及企业当中得到广泛使用的庞大框架。因此,如果您喜欢这样的编码方式,那么JavaScript也许会是个很好的选择。
- Python
作为一种相对现代的编程语言,Python通常受到新手程序员们的喜爱。究其根本,Python拥有着类似于英语的简单语法。大家可以在服务器上利用Python代码创建出基于Web的应用程序,亦可利用其对接数据库系统,甚至处理大数据并执行复杂的数学运算。另外,Python最吸引人的地方,在于其能够使用新行来完成某项命令——相比之下,其它编程语言一般需要使用分号或括号,这无疑会让代码结构看起来比较复杂。
无论你的实际使用方向是什么,Python都必然会在这份推荐清单中占据一席之地。事实上,几乎每一个区块链生态系统当中都存在着一种或者多种利用Python编写而成的公开工具。Python的人气也一直在快速提升。
Python的优势与短板
Python区块链用例
在区块链领域,Python被用于为Hyperledger平台编写智能合约。此外,Python在以太坊等众多其它项目中也有自己的实现成果(例如pyethereum)。Python亦被NEO用于创建合约。
- Go
GoLang语言,或者大家习惯称其为GO,是一种相对现代的通用型语言,由谷歌公司于2007年开发完成,并在2012年正式公开发布。Go是一种静态类型语言,其语法与C语言有些类似。作为一款以健壮性及多用途为既定目标的语言,Go尝试将现代语言(例如Python与JavaScript等)的语法及用户友好性,同C语言的性能与安全优势结合起来。Go是一种编译语言,提供丰富的标准库。当我们在区块链项目的多个组成部分内使用Go语言时,这种特性能够为我们最大程度提供灵活性优势。
在Go中,我们可以利用Goroutines方法实现对多个程序或者多个程序内部分进行异步或并行运行,而这一能力恰好契合区块链项目所着重强调的特征。一般来讲,Java及其它编程语言需要使用Threads才能实现这一点。
Go的优势与短板
Go区块链用例
与Golang相关的区块链项目非常多,在这里我只列举几个人气较高的条目。首先是Go-Ehtereum,这是使用Golang语言编写的最重要的项目之一。同样由Go编写而成的另一个主力项目是Hyperledger Fabric,其已经成为各类企业巨头最喜爱的区块链解决方案之一。再有,Loom Network项目专门针对去中心化在线游戏,这一令人兴奋的成果同样包含利用Go编写的链码。
5.Solidity
Solidity 是一种由以太坊团队(Gavin Wood、Christian Reitwiessner等)开发的,类似于JavaScript、专用、面向对象的高级语言。Solidity受到C++、Python以及JavaScript的深刻影响,用于在以太坊平台以及以太坊虚拟机(简称EVM)上创建去中心化应用程序。顺带一提,EVM是指以太坊平台上编写智能合约的运行时环境。Solidity是一种静态类型语言,支持继承、库以及复杂的用户定义类型。截至目前,其仍然是以太坊社区以及区块链行业当中适用性最强的去中心化应用程序开发语言。
要体验Solidity的代码示例,大家可以使用Remix IDE。Remix是一套基于网络浏览器的IDE,其提供集成化编译器与Solidity运行时环境,且无需任何服务器端组件。Remix允许大家编写Solidity代码并对智能合约进行部署与运行。
Solidity的优势与短板
Solidity区块链用例
Solidity语言主要用于开发以太坊智能合约。目前,我还没有看到其被任何其它类型的项目所实际使用。但好消息是,以太坊开发生态系统本身的体量已经非常可观,而且已经成为当前区块链开发领域中最重要的组成部分。单凭这一点,Solidity已经足以跻身智能合约开发方面最具人气的语言选项之一。
总结
区块链技术有望给每一个行业及市场层面带来巨大影响。相信在未来的几个月到几年之内,全球去中心化水平将不断提高,而区块链技术也终将成为新的技术主流。面对这无限的发展空间,大家还犹豫什么?赶紧学起来!
相关文章:

基于QProbe创建基本Android图像处理框架
先来看一个GIF 这个GIF中有以下几个值得注意的地方这个界面是基本的主要界面所应该在的地方。其右下角有一个“”号,点击后,打开图像采集界面在这个界面最上面的地方,显示的是当前图像处理的状态。(一般来说,是成功/不…

iOS三种拨打电话的方法
1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString* str[[ NSMutableStringalloc ] initWithFormat : "tel:%" , "xxxxxxxxxxx" ];[[UIApplica…

查询今天是周几?
<?php $wdate(w); $weekarray( "0">"星期日", "1">"星期一", "2">"星期二", "3">"星期三", "4">"星期四", "5">"星期五",…

区块链学习之-发布合约
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 命令行编译,发布合约1. 编译合约,编译不了curl --data ‘{“jsonrpc”:“2.0”,“method”: “eth_compileSolidi…

Codeforces 900D Unusual Sequences:记忆化搜索
题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) x 且 ∑(a[i]) y。 题解: 由于gcd(a[i]) x,所以y一定是x的倍数,否则无解。 那么原题就等价于…

对AFNetworking的简单封装
#import "YGLoadDataManager.h"#import "AFNetworking.h"implementation YGLoadDataManager#pragma mark -- GET请求 -- (void)getWithURLString:(NSString *)URLStringparameters:(id)parameterssuccess:(void (^)(id))successfailure:(void (^)(NSError …

js原型链prototype与__proto__以及new表达式
对象模型的细节 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model转载于:https://www.cnblogs.com/imust2008/p/5621751.html

公有链和联盟链的本质不同
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链是生命体、经济体。未来的区块链世界离不开自己的价值尺度建设 公有链和联盟链的本质不同 区块链受到大家广泛关注应该是2015年10月…

C++ 重载运算符简单举例
我们可以重定义或重载大部分 C 内置的运算符。这样,就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。…

ApacheBench(ab)使用详解
ab命令原理 Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目…

ios如何实现静音模式下声音仍然可以外放
AVAudioSession *audioSession [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

创建数据目录及多节点目录
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 创建数据目录及多节点目录 mkdir -p ~/workmeta/EduEthereumServerDeploy/deploy_2/{node1,node2} > cd ~/workmeta/EduEthereumServerD…

卷积神经网络学习笔记与心得(4)池化
图片经过卷积、激活后的结果一般带有大量原图信息。 上图中卷积核提取的是竖直方向上的连续像素,但是,被增强的像素只占了结果的1/3,对于多层网络,其余重要性较低的信息也被传入了下一层网络,造成了不必要的浪费&#…

mina、netty消息边界问题(采用换行符)
在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息。理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次read。但是,现实不总…

关于延时操作的使用
延时操作主要有4种方式 1.sleep方式 [NSThread sleepForTimeInterval:1.0f]; [self delayMethod]; 使用sleep方式在主线程和子线程中均可执行,但是这是中阻塞线程的方式,所以建议放到子线程中使用,以免卡住主线程使界面卡住. 没有发现取消执行的方法. 2.NSTimer定时器方式 …

CGpoint,CGSize,CGRect,NSRange
NSRange (范围);(location,位置 length,长度; NSPoint /CGpoint(点); NSSize /CGSize(大小) CGPoint p1 CGPointZero CGPointMake(0, 0)代表原点 CGSizeZero CGSizeMake(0, 0);代表大小为0 CGRect rec CGRectMake…

Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从…

WebViewJavascriptBridge的简单使用
- (void)viewDidLoad { UIWebView* webView [[UIWebView alloc] initWithFrame:self.view.bounds]; webView.backgroundColor [UIColor whiteColor]; [self.view addSubview:webView]; // 打开输出日志[WebViewJavascriptBridge enableLogging]; // 设置关联…

区块链架构详解
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 准备工作 区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特…

Git详解之九 Git内部原理
以下内容转载自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式。我个人发现学习这些内容对于理解…
Hadoop2.6.0伪分布环境搭建
用到的软件: 一、安装jdk: 1、要安装的jdk,我把它拷在了共享文件夹里面。 (用优盘拷也可以) 2、我把jdk拷在了用户文件夹下面。 (其他地方也可以,不过路径要相应改变) 3、执行复制安…

ios 设置tableview左滑删除按钮的相关属性
自定义cell时在layoutSubviews处理 - (void)layoutSubviews { [super layoutSubviews]; [self dealDeleteButton]; } - (void)dealDeleteButton{ for (UIView *subView in self.subviews) { if ([subView isKindOfClass:NSClassFromString("…

区块链基础:理论和术语
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 一、区块链: 1.百度百科上对区块链的定义是:区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机 技…

Python Socket编程基础篇
Socket网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文…

redis使用epoll
redis使用epoll的代码在ae_epoll.c文件中。 epoll_create:redis服务器在启动时,创建事件循环,调用epoll_create方法创建epoll实例。 static int aeApiCreate(aeEventLoop *eventLoop) {aeApiState *state zmalloc(sizeof(aeApiState));if (!…

贝塞尔结合CAShapeLayer绘制路线,CABasicAnimation实现的小动画
最近项目需求,做的一个标识正在直播的小动画,代码如下: #import "YGIsOnLiveAnmationView.h" interface YGIsOnLiveAnmationView () property (strong, nonatomic) CAShapeLayer * progressLayer; property (strong, nonatomic) CAShapeLayer * triangleLayer; p…

区块链和可持续性
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链和可持续性 在区块链算法和区块链平台方面,可持续性可以有多种解释。一方面,任何听说过比特币网络能源需求的…

eclipse中maven打包
第一种方式:将依赖包打包进一个jar包中。 <build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>${pro…

2014年国内最热门的.NET开源平台
http://developer.51cto.com/art/201501/464292.htm转载于:https://www.cnblogs.com/littlehb/p/5646300.html

从 PoS 进化 SPoS:无能耗共识机制
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 从 PoS 进化 SPoS:无能耗共识机制 我们为 V SYSTEMS 区块链平台设计了了一个注重高扩展性的权益证明(PoSÿ…