python以太坊开发框架Populus快速入门

欢迎学习Populus框架!Populus几乎拥有以太坊区块链开发所需的一切。

Populus有以下系统依赖关系:

  • solidity编译器:智能合约是以solidity语言编写的,然后编译到以太坊虚拟机(EVM)的二进制代码中。
  • Geth:官方go语言的以太坊协议的实现。Geth客户端运行区块链节点,让我们与区块链进行交互,并可以在开发过程中运行并部署到测试区块链。

此外,杨树需要一些其他的系统依赖性,才能安装PyEthereum库。

Debian, Ubuntu, Mint

1
sudo apt-get install libssl-dev

Fedora, CentOS, RedHat

1
sudo yum install openssl-devel

OSX

1
brew install pkg-config libffi autoconf automake libtool openssl

安装Populus

Populus可以通过pip来进行安装:

1
$ pip install populus

如果你在Ubuntu上安装,python3(推荐)上运行的话 :

1
$ pip3 install populus

重要的提示:

Ubuntu下使用Ubuntu’s pip:

1
$sudo apt-get install python-pip

或者python 3:

1
$sudo apt-get install python3-pip

你可能需要安装populus用sudo权限:

1
$ sudo -H pip install populus

从源代码安装可以通过以下命令从项目的根目录完成。

1
$ python setup.py install

验证安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ populus

Usage: populus [OPTIONS] COMMAND [ARGS]...

Populus

Options:
-p, --project PATH Specify a populus project directory
-l, --logging TEXT Specify the logging level. Allowed values are
DEBUG/INFO or their numeric equivalents 10/20
-h, --help Show this message and exit.

Commands:
chain Manage and run ethereum blockchains.
compile Compile project contracts, storing their...
config Manage and run ethereum blockchains.
deploy Deploys the specified contracts to a chain.
init Generate project layout with an example...

没问题的话,就可以开始第一个项目了。

忠告

Populus是一个开发环境。它的设计目的是为了让Python以太坊开发者轻松和有趣。我们使用测试区块链、演示帐户、简单密码、帮助你专注于代码本身。

但是一旦代码准备好用真实的以太坊进行工作和部署,你就应该小心了。因为在Xcode模拟器中运行iOS应用程序和iPhone上的应用程序的实际操作之间有明显的区别,或者在另一个示例中,在一个运行在127.0.0.1的网站上,而不是在一个真正的服务器上运行它,这个服务器被链接到整个互联网,当你在真实以太坊部署和发送时,区块链开发环境,是有明显区别的。

作为开发人员的核心问题是,一旦你打开帐户,就有一个进程运行访问你的以太坊。任何错误或安全漏洞都会导致一些损失。这不是测试区块链和测试时的以太币的问题,而是真实的。

通常情况下:

  • 1.当你解锁一个帐户使用真正的Ether,解锁帐户应该只有需要满足gas和你的转账所需要的最小以太币。以太坊账户是免费的,所以不必为你的开发提供专用帐户,你只需要不时地发送你需要的以太币。
  • 2.永远不要在远程节点上打开真正的以太网帐户。可以使用远程节点,但不可以使用需要解锁帐户的操作。当你在远程节点上打开帐户时,访问该节点的任何人都可以访问你的资金。换句话说,解锁你的帐号的Geth实例应该在本地受保护的机器上运行。
  • 3.Geth允许你提供密码文件,这是为了方便的(稍后再讨论)。密码文件应该受权限保护。

幸运的是,有简单有效的方法来保障你的账户和资金安全,看这里

初始化一个新的项目

Populus可以初始化你的项目通过$ populus init命令:

1
2
3
4
5
6
$ populus init
Wrote default populus configuration to `./populus.json`.
Created Directory: ./contracts
Created Example Contract: ./contracts/Greeter.sol
Created Directory: ./tests
Created Example Tests: ./tests/test_greeter.py

这样你的项目就会有一个./contracts目录,和一个名字为Greeter.sol的solidity源文件;还有一个./tests目录,和一个名字为test_greeter.py测试文件。

你也可以通过新建一个自己的目录初始化一个新项目:

1
$ populus -p /path/to/my/project/ init

编译智能合约

在编译我们的项目之前,让我们先看一下作为项目初始化的一部分生成的Greeter智能合约。

1
$ nano contracts/Greeter.sol

注意检查你的IDE是否安装好了solidity的扩展包。

智能合约的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pragma solidity ^0.4.11;

contract Greeter {
string public greeting;

function Greeter() {
greeting = "Hello";
}

function setGreeting(string _greeting) public {
greeting = _greeting;
}

function greet() constant returns (string) {
return greeting;
}
}

Greeter是一个简单的智能合约:

  • contract关键字开始合约定义。
  • 该合约有一个公共state变量,命名为greeting
  • 具有相同名称的合约构造函数,函数function Greeter(),以字符串Hello的默认问候来初始化。
  • greet函数被公开,并返回设置的任何字符串作为问候语。
  • setGreeting功能可用,并允许问候语被改变。

你可以使用命令$ populus compile进行编译:

1
2
3
4
5
6
7
8
9
10
11
$ populus compile
============ Compiling ==============
> Loading source files from: ./contracts

> Found 1 contract source files
- contracts/Greeter.sol

> Compiled 1 contracts
- Greeter

> Wrote compiled assets to: ./build/contracts.json

可以指定编译后的目录:

1
$ populus -p /path/to/my/project/ compile

build/contracts.json文件包含了solidity编译器产生的大量信息。这是部署和使用合约所必需的。一些重要的信息是合约的应用程序二进制接口(ABI),它允许在编译后调用合约的函数,以及部署合同所需的二进制代码,一旦合约部署到区块链链上的二进制代码就开始运行了。

测试你的合约

现在你有了一个基本的合约,你会想测试它的行为是否符合预期。项目应该已经有一个名为test_greeter.py的测试模块,它位于./tests目录中,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def test_greeter(chain):
greeter, _ = chain.provider.get_or_deploy_contract('Greeter')

greeting = greeter.call().greet()
assert greeting == 'Hello'

def test_custom_greeting(chain):
greeter, _ = chain.provider.get_or_deploy_contract('Greeter')

set_txn_hash = greeter.transact().setGreeting('Guten Tag')
chain.wait.for_receipt(set_txn_hash)

greeting = greeter.call().greet()
assert greeting == 'Guten Tag'

你应该看到两个测试,一个测试默认问候语,一个测试我们可以设置自定义问候语。

注意,两个测试函数都接受chain参数。这个chain实际上是py.test fixture,由populus的 pytest插件提供。测试中的链是一个populus chain对象,运行一个称为tester的临时区块链。测试链是短暂的。所有区块链状态在每次测试运行开始时会被重置,并且只存储在内存中,因此显然不能长期运行智能合约,但对测试非常有用。

可以安装Populus时安装py.test在线实用测试工具。

1
2
3
4
5
$ py.test tests/
collected 2 items

tests/test_greeter.py::test_greeter PASSED
tests/test_greeter.py::test_custom_greeting PASSED

你应该看到一些类似于上述输出的三个测试通过。

最后,类似于测试部署,从命令行测试相同的部署:

1
2
3
4
5
6
7
8
$ populus deploy --chain tester --no-wait-for-sync
> Found 1 contract source files
- contracts/Greeter.sol
> Compiled 1 contracts
- contracts/Greeter.sol:Greeter
Please select the desired contract:

0: Greeter

在提示符下键入0,然后回车:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Beginning contract deployment.  Deploying 1 total contracts (1 Specified, 0 because of library dependencies).

Greeter
Deploying Greeter
Deploy Transaction Sent: 0x84d23fa8c38a09a3b29c4689364f71343058879639a617763ce675a336033bbe
Waiting for confirmation...

Transaction Mined
=================
Tx Hash : 0x84d23fa8c38a09a3b29c4689364f71343058879639a617763ce675a336033bbe
Address : 0xc305c901078781c232a2a521c2af7980f8385ee9
Gas Provided : 465729
Gas Used : 365729


Verified contract bytecode @ 0xc305c901078781c232a2a521c2af7980f8385ee9
Deployment Successful.

ok。当然,由于这是一个特设的tester区块链,它立即退出,什么都没有真正保存。但是部署工作,应该工作在一个永久性的区块链上,如主干网(公有链)或TestNET(测试链).

下面是在项目目录之外时使用:

1
$ populus -p /path/to/my/project/ deploy --chain tester --no-wait-for-sync

设置开发环境

为了在本地配置项目并使整个测试套件通过,需要确保你使用的是正确版本的solc编译器。按照以下步骤安装所有依赖项:

虚拟环境

如果你还没有,请继续安装virtualenv使用pip install virtualenv。然后可以用以下命令创建和激活Populus环境:

1
2
3
$ cd populus
$ virtualenv populus
$ source populus/bin/activate

这允许你安装特定版本的Populus依赖,而不必与你在计算机上已经拥有的全局安装相冲突。

安装依赖项

现在,运行以下命令以安装除solc之外的项目中指定的所有依赖项:

1
2
3
$ pip install -r requirements-dev.txt
$ pip install -r requirements-docs.txt
$ pip install -e .

安装Solidity

你必须安装Solidity,建议0.4.11或更高的发布版本。

二进制的安装脚本:

https://github.com/ethereum/py-solc#installing-the-solc-binary

安装脚本:

首先,复制存储库并切换到合适的分支:

1
2
3
$ git clone --recursive https://github.com/ethereum/solidity.git
$ cd solidity
$ git checkout release_0.4.13

你也可以下载压缩文件:

https://github.com/ethereum/solidity/releases

注意使用tar.gz文件从源代码构建的话,确保在解压文件之后,deps目录不是空的,实际上包含依赖项。

如果你在Mac上,你也可能需要接受Xcode许可证。请确保安装了最新版本,如果遇到错误,请尝试以下操作:

1
$ sudo xcodebuild -license accept

如果你在Windows上,请确保你安装了Git、CMake和VisualStudio 2015以上。

现在,安装所有外部依赖项。如果是Mac:

1
$ ./scripts/install_deps.sh

如果是Windows下:

1
$ scripts\install_deps.bat

最后,继续构建solidity。如果是Mac:

1
2
3
$ mkdir build
$ cd build
$ cmake .. && make

如果是Windows:

1
2
3
$ mkdir build
$ cd build
$ cmake -G "Visual Studio 14 2015 Win64" ..

下面的命令也在windows下工作:

1
$ cmake --build . --config RelWithDebInfo

确认

这应该已经安装了你需要的一切,但我们可以确认下。第一,尝试运行:

1
$ which solc

如果没有看到任何输出,则需要将solc可执行文件移动到环境设置PATH指定的目录中,或者在bash配置文件中添加一个精确路径。如果找不到文件,可能需要运行:

1
$ npm install -g solc

这应该在节点包所在的任何地方都安装了可执行文件。

一旦从solc命令中看到输出(并且在Populus目录中激活了virtualenv),就可以运行测试。

1
$ py.test tests/

这样,所有的测试都应该通过。如果他们不是这样,你很可能在某个地方错过了一个依赖关系。只要重复以上的步骤,你就会搞定的。

当然python也有专门的web3.py库,对于python开发以太坊来说非常的方便,有兴趣的用户可以关注我们的python以太坊教程,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。

另外其他语言可以学习的以太坊教程如下:

  • web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。

汇智网原创翻译,转载请标明出处。这里是原文