Brownie 开发智能合约(入门使用)

Brownie 开发智能合约(入门使用)简介 上篇文章 使用了 Remix 在线 IDE 个人感觉 Remix 在入门智能合约开发时 是很好的上手工具 因为 Remix 帮我们处理好了编译 部署的过程 并且还通过 JavaScript VM 准备好了本地区块链方便我们测试 可谓开箱即用 但毕竟是线上 IDE 功能还是有限 这里我们使用 Brownie 框架来开发智能合约 Brownie 框架是基于 Python

大家好,我是讯享网,很高兴认识大家。

22328f7da197388d6e8f2a0b0fcfe746.png
讯享网

简介

上篇文章,使用了 Remix 在线 IDE,个人感觉 Remix 在入门智能合约开发时,是很好的上手工具,因为 Remix 帮我们处理好了编译、部署的过程,并且还通过 JavaScript VM 准备好了本地区块链方便我们测试,可谓开箱即用,但毕竟是线上 IDE,功能还是有限。

这里我们使用 Brownie 框架来开发智能合约,Brownie 框架是基于 Python 编写的智能合约开发框架,它可以帮我们快速完成编译、部署、测试等智能合约开发的全流程。

文档:https://eth-brownie.readthedocs.io/en/stable/

Web3.py 基础

因为 Brownie 主要基于 Web3.py 这个库开发而来,在从 Python 角度了解以太坊

编写简单的智能合约

首先,通过 Solidity 编写一个简单智能合约,没错,我们并不能通过 Python 来编写智能合约,利用 Python,只是为了让这个过程更加自动化与工程化,智能合约代码如下:

// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; contract Storage { struct People { string name; uint256 age; } People[] public people; function addPerson(string memory _name, uint256 _age) public { people.push(People(_name, _age)); } }

讯享网

上述代码中,通过 struct 关键字定义了一个名为 People 的对象,该对象中有 name 与 age 两个属性,然后基于 People 对象,实例化了 people 数组,然后定义了 addPerson 函数,该方法会接收_name 与_age 参数,然后实例化 People 对象,最后将 People 对象添加到数组中。

这里有个细节,就是参数_name 是字符串,所以需要使用 memory 关键字标注一下。Solidity 中,存储变量的方式有 storage 与 memory 两种。

  • storage 变量:永久存储在区块链中的变量
  • memory 变量:临时的,当外部函数对某合约调用完成时,内存型变量即被移除

Solidity 中的 string 的本质是字符数组(Char Array),如果你不通过 memory 声明,就算_name 是函数参数,Solidity 也会通过storage持续存储它。

编译智能合约与连接本地区块链网络

创建名为【web3py_storage】的文件夹,然后在其中创建 Storage.sol 文件并将智能合约代码复制到文件中。

通过 vscode 打开 webpy_simple_storage 文件夹,创建 base.py,在 base.py 实现对智能合约的编译以及连接上区块链网络的操作。

阅读 web3.py 智能合约相关的文档:https://web3py.readthedocs.io/en/stable/contracts.html

通过文档可知,web3.py 不支持 solidity 的编译,文档中建议我们安装 py-solc-x 库来实现 solidity 的编译,简单安装一下,然后通过 install_solc 方法来下载对应版本的 solidity 编译器。

因为我们的智能合约使用了 Solidity ^0.6.0,所以下载 0.6.0 版本的 solidity 编译器则可,然后按文档的方式设置编译 Solidity 时的配置则可,相关代码如下:

讯享网import os import json from web3 import Web3 # 编译 solidity # https://github.com/iamdefinitelyahuman/py-solc-x from solcx import compile_standard, install_solc with open('./Storage.sol', 'r', encoding='utf-8') as f:     storage_file = f.read() # 下载0.6.0版本的Solidity编译器 install_solc('0.6.0') # 编译Solidity compiled_sol = compile_standard(     {         "language": "Solidity",         # Solidity文件         "sources": {"Storage.sol": {"content": storage_file}},         "settings": {             "outputSelection": {                 "*": {                     # 编译后产生的内容                     "*": ["abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"]                 }             }         },     },     # 版本,与编写智能合约时Solidity使用的版本对应     solc_version="0.6.0", ) # 编译后的结果写入文件 with open('compiled_code.json', 'w') as f:     json.dump(compiled_sol, f)

compile_standard 方法编译后的结果写入 compiled_code.json,将其格式化,如下图:

a5ad100895e1d35872f9c747e639cfd6.png

从上图可知,Solidity 编译后的字节码也在 compiled_code.json 中,将 json 文件中重要的数据读取出来,代码如下:

# 智能合约编译后的字节码(上链的数据) bytecode = compiled_sol["contracts"]["Storage.sol"]["Storage"]["evm"][     "bytecode" ]["object"] # ABI (Application Binary Interface),用于与智能合约中的方法进行交互的接口 abi = json.loads(     compiled_sol["contracts"]["Storage.sol"]["Storage"]["metadata"] )["output"][&
小讯
上一篇 2025-01-28 10:37
下一篇 2025-01-05 18:28

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/124210.html