量化合約系統開發(原始碼)合約量化系統開發(技術)

Tg_StPv888發表於2023-02-22

“合約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:

abi = json.load(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 = json.load(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)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2936351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章