量化合約系統開發 (參考版),量化合約開發策略原始碼方案

丸子qy發表於2023-05-11

“合約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.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 = "個人錢包秘鑰地址"


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

相關文章