什么是智能合约?
智能合约(smart-contract)实际上就是运行在以太坊网络中的一段代码。其最大的特点就是:自动执行、一旦部署就不可更改。智能合约这一特点,确保了写在合约里的全部功能,都能够按照逻辑执行。在以太坊部署智能合约之后,就意味着拥有了一段永不消失、自动执行的程度,随时能够与网络合约进行交互。智能合约类似于互联网里的TCP/IP协议,网络的传输运行完全按照协议标准执行。
编写简单的智能合约:
//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
#智能合约编译后的字节码(上链的数据)
bytecode=compiled_sol"contracts""Storage"[
"bytecode"
]["object"]
#ABI(Application Binary Interface),用于与智能合约中的方法进行交互的接口
abi=json.loads(
compiled_sol"contracts""Storage"
)"output"
bytecode:智能合约编译后的字节码,智能合约上链其实就是将这部分数据存储到区块链中。
abi:我们的程序与智能合约交互的接口,它定义了我们的程序可以怎么与当前这个智能合约交互。
至此,智能合约的编译流程就结束了,然后我们通过web3.py连接到以太坊中。