用Solidity构建智能合约

来自维基百科:

Solidity是编写智能合约的“面向合约的”编程语言。它用于在各种区块链平台上实施智能合约。它由Gavin Wood,Christian Reitwiessner,Alex Beregszaszi,Liana Husikyan,Yoichi Hirai和几位以前的以太坊核心贡献者开发,以便在区块链平台(如以太坊)上编写智能合约。

— Wikipedia entry for Solidity

Solidity由GitHub上的Solidity项目开发团队开发并维护:

https://github.com/ethereum/solidity

Solidity项目的主要“产品”是_Solidity Compiler(solc)_,它将用Solidity语言编写的程序转换为EVM字节码,并生成其他制品,如应用程序二进制接口(ABI)。Solidity编译器的每个版本都对应于并编译Solidity语言的特定版本。

要开始,我们将下载Solidity编译器的二进制可执行文件。然后我们会编写一个简单的合约。

选择一个Solidity版本

Solidity遵循一个称为_semantic versioning_(https://semver.org/)的版本模型,该模型指定版本号结构为由点分隔的三个数字:MAJOR.MINOR.PATCH。”major”用于对主要的和“向前不兼容”的更改的递增,“minor”在主要版本之间添加“向前兼容功能“时递增,“patch”表示错误修复和安全相关的更改。

目前,Solidity的版本是+0.4.21+,其中+0.4+是主要版本,21是次要版本,之后指定的任何内容都是补丁版本。Solidity的0.5版本主要版本即将推出。

正如我们在[intro]中看到的那样,你的Solidity程序可以包含一个+pragma+指令,用于指定与之兼容的Solidity的最小和最大版本,并且可用于编译你的合约。

由于Solidity正在快速发展,最好始终使用最新版本。

下载/安装

有许多方法可以用来下载和安装Solidity,无论是作为二进制发行版还是从源代码编译。你可以在Solidity文档中找到详细的说明:

https://solidity.readthedocs.io/en/latest/installing-solidity.html

Installing solc on Ubuntu/Debian with apt package manager中,我们将使用 apt package manager 在Ubuntu/Debian操作系统上安装Solidity的最新二进制版本:

Installing solc on Ubuntu/Debian with apt package manager

  1. $ sudo add-apt-repository ppa:ethereum/ethereum
  2. $ sudo apt update
  3. $ sudo apt install solc

一旦你安装了 solc,运行以下命令来检查版本:

  1. $ solc --version
  2. solc, the solidity compiler commandline interface
  3. Version: 0.4.21+commit.dfe3193c.Linux.g++

根据你的操作系统和要求,还有许多其他方式可以安装Solidity,包括直接从源代码编译。有关更多信息,请参阅

https://github.com/ethereum/solidity

开发环境

要在Solidity中开发,你可以在命令行上使用任何文本编辑器和+solc+。但是,你可能会发现为开发而设计的一些文本编辑器(例如Atom)提供了附加功能,如语法突出显示和宏,这些功能使Solidity开发变得更加简单。

还有基于Web的开发环境,如Remix IDE(https://remix.ethereum.org/)和EthFiddle(https://ethfiddle.com/)。

使用可以提高生产力的工具。最后,Solidity程序只是纯文本文件。虽然花哨的编辑器和开发环境可以让事情变得更容易,但除了简单的文本编辑器(如vim(Linux / Unix),TextEdit(MacOS)甚至NotePad(Windows)),你无需任何其他东西。只需将程序源代码保存为+.sol+扩展名即可,Solidity编译器将其识别为Solidity程序。

Writing a simple Solidity program

[intro]中,我们编写了我们的第一个Solidity程序,名为+Faucet+。当我们第一次构建+Faucet+时,我们使用Remix IDE来编译和部署合约。在本节中,我们将重新查看,改进和修饰+Faucet+。

我们的第一次尝试是这样的:

Faucet.sol : A Solidity contract implementing a faucet

  1. // Our first contract is a faucet!
  2. contract Faucet {
  3. // Give out ether to anyone who asks
  4. function withdraw(uint withdraw_amount) public {
  5. // Limit withdrawal amount
  6. require(withdraw_amount <= 100000000000000000);
  7. // Send the amount to the address that requested it
  8. msg.sender.transfer(withdraw_amount);
  9. }
  10. // Accept any incoming amount
  11. function () public payable {}
  12. }

[make_it_better] 开始,我们将在第一个示例的基础上构建。

用Solidity编译器(solc)编译

现在,我们将使用命令行上的Solidity编译器直接编译我们的合约。Solidity编译器+solc+提供了多种选项,你可以通过+—help+参数来查看。

我们使用+solc+的 —bin 和 —optimize 参数来生成我们示例合约的优化二进制文件:

Compiling Faucet.sol with solc

  1. $ solc --optimize --bin Faucet.sol
  2. ======= Faucet.sol:Faucet =======
  3. Binary:
  4. 6060604052341561000f57600080fd5b60cf8061001d6000396000f300606060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632e1a7d4d81146040575b005b3415604a57600080fd5b603e60043567016345785d8a0000811115606357600080fd5b73ffffffffffffffffffffffffffffffffffffffff331681156108fc0282604051600060405180830381858888f19350505050151560a057600080fd5b505600a165627a7a723058203556d79355f2da19e773a9551e95f1ca7457f2b5fbbf4eacf7748ab59d2532130029

+solc+产生的结果是一个可以提交给以太坊区块链的十六进制序列化二进制文件。