量化合约系统开发参考版量化合约开发策略源码方案
“合约ABI是以太坊生态系统中与合约交互的标准方式,不论是外部客户端与合约的交互还是合约与合约之间的交互。”上述是以太坊文档给出的定义,更通俗的理解,包含两方面内容:
ABI是合约接口的说明。
ABI定义与合约进行交互数据编码规则
测试合约前提 - 合约系统开发:wwqqyy420
1、熟悉项目业务层逻辑
2、开发提供智能合约接口文档
(1)、确认我们要在那个链上测试,让开发提供对应的测试币
(2)、提供测试地址(类似于web2的url)
(3)、提供新合约地址(这个地址开发每次部署到链上都会变更)
(4)、提供ABI(合约接口的说明)如果开发不给可以在eth区块链浏览器上获得
(5)、我们自己测试钱包的秘钥
智能合约转账(单元脚本)
from web3 import Web3, HTTPProvider
import json, os
rpc = "HTTP合约通讯地址(http url)"
address1 = "个人合约地址"
address2 = "智能合约地址"
test_key = "个人钱包秘钥地址"
连接钱包地址
web3 = Web3(HTTPProvider(rpc))
结果为true表示连接成功
connect = web3.isConnected()
print(connect)
转账
def transfer_eth(amount, gas_price=20, gas_limit=21000):
# 带签名的合约写操作
params = {
# 发送代币地址 'from': address1,
# 接收代币的地址 'to': address2,
# 代币数量,以wei为单位,可以是字符串和int类型 web3.toWei(数值,代币单位)
# 为了方便调通代码,我们这里用wei来做单位,正常都是用ether。
# 1 ether = 1 x 10^18wei = 1 x 10^9 Gwei 'value': web3.toWei(amount, 'wei'),
# 每个在链上可以执行的命令都设置了一个消耗的gas值,例:PUSH操作需要消耗3个gas,一次转账一般要消耗21000 gas,gas使用ether来支付
# 1 ether = 1 x 10^18wei = 1 x 10^9 Gwei, 无论您执行的命令是成功还是失败,都需要支付计算费用
# 简易理解:gas_limit 是一次交易中gas的可用上限 'gas': gas_limit,
# 通过gasPrice可以节省矿工费用,但也会减慢矿工打包的速度。因为,矿工会优先打包gas price设置高的交易,如果您想加快转账,您可以把gas price设置得更高,这样您就可以插队靠前
# 一次转账一般要消耗21000 gas,如果你设置的gas Price = 1000000000wei = 1Gwei,则此次转账的交易手续费为:TxFee = 21000 Gwei = 0.000021 ether
# A账户欲向B账户转账4 ether,则要求A账户至少要有 4 + 0.000021 = 4. 000021 ethrer
# 简易理解:gasPrice就是你想用多少气费进行交易,为什么设置20,是因为当前市场价20就够了。如果你有钱,想更快也可以设置成25甚至更高 'gasPrice': web3.toWei(gas_price, 'gwei'),
# 'nonce': web3.eth.getTransactionCount(主钱包地址),主要标记当前新的交易号是多少,算是记录在交易队列中的位置 'nonce': web3.eth.getTransactionCount(address1),}# web3.eth.account.signTransaction用账户对交易签名(转账需要的参数,from钱包地址的秘钥)
signed_tx = web3.eth.account.signTransaction(params, private_key=test_key)# 交易发送并获取交易hash
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)return tx_hash
复制
print("运行转账后的交易hash值:", transfer_eth(100))
编写单元测试脚本
from web3 import Web3, HTTPProvider
import json, os
rpc = "HTTP合约通讯地址(http url)"
address = "智能合约地址"
连接钱包地址
web3 = Web3(HTTPProvider(rpc))
结果为true表示连接成功
connect = web3.isConnected()
print(connect)
获取ABI存放地址
filePath = os.path.dirname(__file__) + '/abi.json'
这里是读取咱们的abi合约接口规范,方便后面使用
with open(filePath, 'r') as f:
abi = json.load(f)
复制
文档:创建一个新的契约实例及其在json接口对象中定义的所有方法和事件
文档:该web3.et***ntract对象可以轻松地与以太坊区块链上的智能合约进行交互。
个人理解:创建与合约交互的对象,连接完通讯地址后,我们对这地址签订合同,合同里面有合约地址和接口规范(ABI)
web3.et***ntract(接口文档的合约地址, ABI接口规范)
contract = web3.et***ntract(address=address, abi=abi)
通过合约.功能.调用接口方法(传参数).获取返回值
con***ctions.接口方法名(参数1,参数2,参数3).call()
res = con***ctions.getLastMintInfo(10).call()
print("getLastMintInfo:", res)
获取结果
mint智能合约接口数据(单元脚本)
from web3 import Web3, HTTPProvider
import json, os
rpc = "HTTP合约通讯地址(http url)"
address1 = "个人合约地址"
address2 = "智能合约地址"
test_key = "个人钱包秘钥地址"
ABI是合约接口的说明。
ABI定义与合约进行交互数据编码规则
测试合约前提 - 合约系统开发:wwqqyy420
1、熟悉项目业务层逻辑
2、开发提供智能合约接口文档
(1)、确认我们要在那个链上测试,让开发提供对应的测试币
(2)、提供测试地址(类似于web2的url)
(3)、提供新合约地址(这个地址开发每次部署到链上都会变更)
(4)、提供ABI(合约接口的说明)如果开发不给可以在eth区块链浏览器上获得
(5)、我们自己测试钱包的秘钥
智能合约转账(单元脚本)
from web3 import Web3, HTTPProvider
import json, os
rpc = "HTTP合约通讯地址(http url)"
address1 = "个人合约地址"
address2 = "智能合约地址"
test_key = "个人钱包秘钥地址"
连接钱包地址
web3 = Web3(HTTPProvider(rpc))
结果为true表示连接成功
connect = web3.isConnected()
print(connect)
转账
def transfer_eth(amount, gas_price=20, gas_limit=21000):
# 带签名的合约写操作
params = {
# 发送代币地址 'from': address1,
# 接收代币的地址 'to': address2,
# 代币数量,以wei为单位,可以是字符串和int类型 web3.toWei(数值,代币单位)
# 为了方便调通代码,我们这里用wei来做单位,正常都是用ether。
# 1 ether = 1 x 10^18wei = 1 x 10^9 Gwei 'value': web3.toWei(amount, 'wei'),
# 每个在链上可以执行的命令都设置了一个消耗的gas值,例:PUSH操作需要消耗3个gas,一次转账一般要消耗21000 gas,gas使用ether来支付
# 1 ether = 1 x 10^18wei = 1 x 10^9 Gwei, 无论您执行的命令是成功还是失败,都需要支付计算费用
# 简易理解:gas_limit 是一次交易中gas的可用上限 'gas': gas_limit,
# 通过gasPrice可以节省矿工费用,但也会减慢矿工打包的速度。因为,矿工会优先打包gas price设置高的交易,如果您想加快转账,您可以把gas price设置得更高,这样您就可以插队靠前
# 一次转账一般要消耗21000 gas,如果你设置的gas Price = 1000000000wei = 1Gwei,则此次转账的交易手续费为:TxFee = 21000 Gwei = 0.000021 ether
# A账户欲向B账户转账4 ether,则要求A账户至少要有 4 + 0.000021 = 4. 000021 ethrer
# 简易理解:gasPrice就是你想用多少气费进行交易,为什么设置20,是因为当前市场价20就够了。如果你有钱,想更快也可以设置成25甚至更高 'gasPrice': web3.toWei(gas_price, 'gwei'),
# 'nonce': web3.eth.getTransactionCount(主钱包地址),主要标记当前新的交易号是多少,算是记录在交易队列中的位置 'nonce': web3.eth.getTransactionCount(address1),}# web3.eth.account.signTransaction用账户对交易签名(转账需要的参数,from钱包地址的秘钥)
signed_tx = web3.eth.account.signTransaction(params, private_key=test_key)# 交易发送并获取交易hash
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)return tx_hash
复制
print("运行转账后的交易hash值:", transfer_eth(100))
编写单元测试脚本
from web3 import Web3, HTTPProvider
import json, os
rpc = "HTTP合约通讯地址(http url)"
address = "智能合约地址"
连接钱包地址
web3 = Web3(HTTPProvider(rpc))
结果为true表示连接成功
connect = web3.isConnected()
print(connect)
获取ABI存放地址
filePath = os.path.dirname(__file__) + '/abi.json'
这里是读取咱们的abi合约接口规范,方便后面使用
with open(filePath, 'r') as f:
abi = json.load(f)
复制
文档:创建一个新的契约实例及其在json接口对象中定义的所有方法和事件
文档:该web3.et***ntract对象可以轻松地与以太坊区块链上的智能合约进行交互。
个人理解:创建与合约交互的对象,连接完通讯地址后,我们对这地址签订合同,合同里面有合约地址和接口规范(ABI)
web3.et***ntract(接口文档的合约地址, ABI接口规范)
contract = web3.et***ntract(address=address, abi=abi)
通过合约.功能.调用接口方法(传参数).获取返回值
con***ctions.接口方法名(参数1,参数2,参数3).call()
res = con***ctions.getLastMintInfo(10).call()
print("getLastMintInfo:", res)
获取结果
mint智能合约接口数据(单元脚本)
from web3 import Web3, HTTPProvider
import json, os
rpc = "HTTP合约通讯地址(http url)"
address1 = "个人合约地址"
address2 = "智能合约地址"
test_key = "个人钱包秘钥地址"