Python Flask Web3.py开发部署以太坊智能合约

将数据存储在数据库中是任何软件应用程序不可或缺的一部分。无论如何控制该数据库都有一个该数据的主控。区块链技术将数据存储到区块链网络内的区块中。因此,只要某个节点与网络同步,它们就会获得区块中数据的副本。因此,该技术中没有特定的数据主控。

在本教程中,我们将编写一份智能合约(我将进一步解释),以便在区块链上保留用户数据。我们将使用python web3(web3的python库)来开发和部署智能合约。一旦我们在区块链上部署了智能合约。我们将使用flask API与智能合约进行交互以存储一些数据/信息。我们将它存储在区块链上,它是不可变的。

环境要求

Python 3.6

安装

1.创建一个python虚拟环境。

Virtualenv将你的Python软件包本地化保存在你项目的虚拟环境中,而不是强迫你在系统范围内安装软件包。

2.现在我们需要那样的以太坊测试链。

Ganache是以太坊开发的个人区块链,可用于部署合约,开发应用程序和运行测试。

3.安装python web3

Web3.py是一个用于与以太坊交互的python库。它的API源自Web3.js Javascript API,对于使用过web3.js的人来说应该很熟悉。

4.Flask

Flask是一个python轻量级框架。

5.Flask Restful

Flask-RESTful是Flask的扩展,增加了对快速构建REST API的支持。

Flask Marshmallow

Flask marshmallow是一个对象序列化/反序列化库。

启动以太坊测试区块链服务器

要部署智能合约,我们应该启动测试以太坊服务器。我们正在使用ganache进行测试。在终端中键入以下命令:

Ganache为我们提供了10个默认测试帐户,每个帐户中有100个假ether,用于交易。我们将使用这些帐户在合约中部署和设置各种值。

我们可以看到gas价格和限制以及部署的。我们在部署合约时需要这个。

创建user.sol文件

现在我们将用Solidity编写智能合约。Solidity是在ethereum上编写智能合约的语言。智能合约包括我们将在区块链上存储的数据,数据和getter方法的可选验证函数,访问数据的setter方法。

例如,要在区块链上进行考勤注册,你将拥有一组用户对象。它将可以访问用户的getter,setter方法。由于每个用户每天只能标记一次出勤,因此你需要一个验证功能来检查,智能合约与我们通常用其他任何语言开发的应用程序非常相似。

在下面的文件中,我们使用getter,setter函数构建简单的用户合约。

1.在.sol文件中声明solidity编译器版本。

了解使用的编译器版本。

2.导入库文件Import library。我们应该将库用于常用的实用程序函数。库可以只编译一次并反复使用(点击这里获取一些好的库资源)。

3.为用户声明合约

4.现在,对于基本演示,我们将存储有关用户的名称和性别信息。因此,使用struct和enum数据类型初始化这两个变量。

5.现在我们将声明类型的用户对象。也可以将其声明为public,以便从合约外部访问它(有关可见范围,请单击此处)。

6.现在为用户对象添加getter,setter方法。我们将在区块链上保留每个用户的信息。我们应该始终公开此方法,因为我们将从合约外部访问它们。

7.请注意,我们使用了两个内部函数和。让我们添加这个内部函数。将它们声明为内部,因为我们不会在外面使用它们。

我们正在使用库函数。由于此版本的solidity不支持使用(==)进行字符串比较。

8.现在我们的user.sol文件合约如下所示:

使用python脚本编译和部署solidity文件。

1.在下面的python脚本中,我们需要实例化python-web3测试以太坊节点。我们将设置ganche url为测试以太坊节点。我们将使用下面的w3对象来部署合约。

2.现在我们将编译代码。为了编译代码,我们使用py-solc,它是用于编译器的python扩展。

3.每当使用import语句编译.sol文件时。我们还需要链接导入文件的部署地址以及主合约。 因此,对于部署所有链接首先通过编译它(如果已经部署然后保存地址)请参见下图主合约的bin。

当你编译主合约时,如果你看到它的bin部分,你将找到我们正在导入的库的(它也可以用于合约)。 这部分我们应该通过在部署合约之前的库地址来替换它。

4.然后我们将库地址与主合约相关联。

链接后主合约bin的见下图:

你将看到导入库的bin已添加。

5.现在使用我们的w3对象部署主合约。使用的默认地址进行部署。

你将在运行ganache测试服务器的选项卡中看到以下这行:

这与合约部署后在中获得的信息相同。

6.现在将abi和contract_address存储在json文件中。这样我们以后可以在flask api中使用它来存储合约中的用户对象。

7.现在我们的完整脚本如下所示:

创建flask api以为用户存储不同的值

你只需部署一次合约。但是使用它的地址,你会一次又一次地存储数据。同样,在db的世界中,你只需定义一次模型/模式,但你将在db中添加不同的行/文档。

我们将使用flask post api来获取用户的用户信息并返回成功。

由于这不是flask教程,我不会详细说明这一点,如果flask不熟悉可以看这个flask教程学习下。我们的API用户将从客户端获取数据(curl请求)并对其进行验证将其返回给客户端(curl请求)

2.现在我们将初始化web3对象以与已部署的用户合约进行通信。

3.现在我们将获得之前存储在文件中的abi和合约地址。

4.选择交易的默认帐户地址。每次在合约中为用户设置新值。你会从钱包里拿出一些gas。

5.最后,你将在以太坊合约中设置api调用用户对象时获得的值。

我们首先使用abi和contract_address获得部署合约。

然后我们可以使用合约实例调用任何合约公共函数。在为用户设置值之后,我们将使用transact方法将其公之于众。这将在以太坊区块中添加新的用户值。

现在我们可以使用call方法获得已在合约中设置的值,这将调用合约函数而不在区块链中添加任何区块。

我们的api文件的最终代码如下所示。将其另存为。

运行以下命令以启动服务器。

用curl调用api

你也可以在这里找到完整代码。

python用web3.py库开发以太坊来说非常的方便,有兴趣的用户可以关注我们的

python以太坊教程

,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。

汇智网内容已经覆盖以下编程技术,发送相应的文字会收获相关课程信息:

区块链、以太坊、EOS比特币、Tendermint、Node.js、MongoDB、JavaScript、C、C#、PHP、Python、Angularjs、Ionic、React、UML、redis、mySQL、Nginx、CSS、HTML、Bootstrap、Flask、Gulp、Mocha、Git、Meteor、Canvas、zebra、Typescript、Material Design Lite、ECMAScript、Elasticsearch、Mongoose、jQuery、d3.js、django、cheerio、SVG、phoneGap、jQueryMobile、Saas、YAML、Vue.js、webpack、Firebird,jQuery Easy UI,ruby,asp.net,c++,Express......

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181128G1IL9700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券