编写智能合约绕不过去的一个坑就是要学一种新的编程语言,这就是号称智能合约编程语言的 Solidity 。这篇小文是 Solidity 的一个开发入门。首先介绍 Solidity 的诞生和自我定位,接下来进入重点内容,聊聊智能合约编程的哪些具体的挑战决定了我们必须要发明一种新的语言,最后介绍一下网上 Peter 觉得最优秀的学习 Solidity 的网站资源。

Soldity 定位

先来讲讲 Solidity 的诞生和定位。

故事还是要从以太坊说起,为了开发强大的智能合约,以太坊开发了 EVM ,也就是以太坊虚拟机,而以太坊虚拟机上运行的语言就是 Solidity 。之后的2016和2017年,智能合约爆发,Solidity 也被其他的区块链项目搬到了自己的平台上,所以在其它平台,例如 Nervos 上, 开发智能合约也都会用 Solidity 语言。

按照官网的说法,Solidity 是一个面向合约开发的高级语言,借鉴了其他一些高级语言,例如 Javascript 和 Python,的特性。它是一门静态类型语言,支持继承,支持各种库和用户自定义的类型。非常适合用来开发类似于投票,众筹,拍卖,多重签名钱包等各种功能。

简单一句话,Solidity 就是为智能合约而生。

核心语言特性

这时候我们心中最大的疑问是,为啥不直接用目前已经非常流行的语言,例如 Javascript ,来开发智能合约呢?或者说智能合约开发有哪些独特的特点,要求我们必须要开发一门新的语言来应对呢。

首先一点是安全。智能合约往往都跟真金白银挂钩,而且智能合约是部署到区块链上的,而区块链是一个大家形成共识的环境,所以说智能合约部署之后,代码虽然不能说绝对不能改,但是要改也是非常麻烦的事。这就要求智能合约的代码要非常的严禁和安全。而我们熟悉的 Javacript 是弱类型语言,恰好不太能写出安全的代码,这也就是为何给 Javascript 添加强类型之后的 Typescript 语言变得如此流行了。而 Solidity 直接就被设计为静态类型和强类型的语言,保证对于一些常见错误,让开发者能够迅速通过编译捕捉到,增强的语言的安全性。这里要插一句,虽然 Java/C++ 这些大型语言也都有对安全性的非常好的优化,但是要把这些语言移植到在区块链上,对系统造成的负荷也会很大,整个的移植工作量也是非常大的,所以 Solidity 的小巧和专用也是它的优势。

第二点是对智能合约特定业务的支持。智能合约不一定是一个现实意义的合约,即使一个只打印 Hello World 的程序,只要部署到区块链上,我们也叫它做一个智能合约。但是话说回来,智能合约的很常见的一种作用就是来实现合约,常见的编程语言对于这一点是没有特殊支持的,而 Solidity 就专门对此作了优化,甚至专门添加了一种类型,就叫 contract 。除了对于合约的支持,以太坊之所以迅速火爆,跟它的能够轻松发代币的能力是分不开的,所以 Solidity 之下有专门的数据类型叫做 address ,可以用来在发代币的时候设置铸币人地址。

所以说,Solidity 之所以能流行起来就是因为它的安全小巧,和专门的对智能合约开发所做的优化。

参考资料

最后给大家介绍一下几个学习 Solidity 的最优秀的网站和工具。

第一个是 Remix ,remix.ethereum.org 。这是以太坊官方推出的一个 Solidity 的在线集成开发环境。提供了文件浏览器,带高亮支持的代码编辑器,调试工具,甚至有编译功能。Remix 是每个 Solidity 开发者都在用的项目。

第二个是 Solidity 官网,是有中文版的哦, https://solidity-cn.readthedocs.io/zh/develop/ 。官网上介绍了,合约编译输出之后的元数据的作用,什么是 ABI ,也就是应用二进制接口,以及合约的结构,各种语言类型的详细说明等等重要信息,是上手智能合约编程之前的必备基础。

最后一个不得不提的资源是,https://cryptozombies.io/ 。这是一个第三方的在线智能合约学习环境,目标是教会大家实现 DApp 游戏。这个网站的特点是自作非常精良,各种辅助学习材料丰富,并且是对 Solidity 小白友好的。

好,我想推荐的资源就是这三个了。

总结

来总结一下本文要点。Solidity 是一门诞生在以太坊之上的新语言,因为非常适合做合约开发,目前已经被很多其他区块链项目也移植到自己的平台之上。Solidity 足够小巧足够安全,让它非常适合运行在区块链上成为智能合约语言,同时 Solidity 还为智能合约和发代币等各种实际业务场景做了语言层面的优化,这个也是其他语言所不具备的,所以说人们没有使用现有的 Java/C++ 这些语言来开发智能合约,而是专门发明了 Solidity 。