“合約ABI是以太坊生態系統中與合約互動的標準方式,不論是外部客戶端與合約的互動還是合約與合約之間的互動。”上述是以太坊官方文件給出的定義,更通俗的理解,包含兩方面內容:
ABI是合約介面的說明。
ABI定義與合約進行互動資料編碼規則
測試合約前提
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:
官方文件:建立一個新的契約例項及其在json介面物件中定義的所有方法和事件
官方文件:該web3.eth.Contract物件可以輕鬆地與以太坊區塊鏈上的智慧合約進行互動。
個人理解:建立與合約互動的物件,連線完通訊地址後,我們對這地址簽訂合同,合同裡面有合約地址和介面規範(ABI)
web3.eth.contract(介面文件的合約地址, ABI介面規範)
contract = web3.eth.contract(address=address, abi=abi)
透過合約.功能.呼叫介面方法(傳引數).獲取返回值
contract.functions.介面方法名(引數1,引數2,引數3).call()
res = contract.functions.getLastMintInfo(10).call()
print("getLastMintInfo:", res)
獲取結果
mint智慧合約介面資料(單元指令碼)
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)
獲取ABI存放地址
filePath = os.path.dirname(__file__) + '/abi.json'
這裡是讀取我們們的abi合約介面規範,方便後面使用
with open(filePath, 'r') as f:
個人理解:建立與合約互動的物件,連線完通訊地址後,我們對這地址簽訂合同,合同裡面有合約地址和介面規範(ABI)
web3.eth.contract(介面文件的合約地址, ABI介面規範)
contract = web3.eth.contract(address=address2, abi=abi)
透過合約功能.呼叫介面方法(傳遞mint方法的入參).建立交易引數({key:value})
transaction = contract.functions.mint(1).buildTransaction({
'gas': 70000, # 最大氣費上限'gasPrice': web3.toWei('20', 'gwei'), # 氣費'from': address1, # 接受地址'value': web3.toWei('0.01', 'ether'), # mint多少eth'nonce': web3.eth.getTransactionCount(address1), # 當前第幾個交易
複製
})
web3.eth.account.signTransaction用賬戶對交易簽名(轉賬需要的引數,from錢包地址的秘鑰)
signed_tx = web3.eth.account.signTransaction(transaction, private_key=test_key)
交易傳送並獲取交易hash
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(tx_hash)