简介
上篇文章,使用了 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,将其格式化,如下图:

从上图可知,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"][&


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