簡體   English   中英

使用 web3swift 與自定義智能合約交互

[英]Interacting with custom smart contract using web3swift

我正在使用 web3swift 庫,並且我設法進行了一些交易,主要是獲取(balanceOf、owner 等)。 我閱讀了整個自述文件(文檔),但我不太確定,我們可以使用這個庫從我們的自定義智能合約中調用函數嗎? 例如,我有商店智能合約,我想從中調用購買功能? 我看到我們可以轉移 eth 和 ERC20 代幣,但這對我來說還不夠。 對此有什么幫助嗎?

"

是的,您可以調用自定義智能合約上的任何功能。 這是一個例子。

        let infura = Web3.InfuraMainnetWeb3()
        // 1
        let contract = infura.contract(someABI, at: ethContractAddress, abiVersion: 2)
        // 2
        var options = Web3Options.defaultOptions()
        options.from = address
        // 3 
        let transactionIntermediate = contract?.method("accountExists", parameters:[address] as [AnyObject], options: options)
        // 4
        let result = transactionIntermediate!.call(options: options)
        switch result {
        // 5    
        case .success(let res):
            let ans = res["0"] as! Bool
            DispatchQueue.main.async {
                completion(Result.Success(ans))
            }
        case .failure(let error):
            DispatchQueue.main.async {
                completion(Result.Error(error))
            }
        }
    }  
  1. 設立合同和ABI。 您需要以數據或字符串格式的合同地址。 let ethContractAddress = EthereumAddress("0xfa28eC7198028438514b49a3CF353BcA5541ce1d")! 您可以直接從Remix IDE獲得合同的ABI。
  2. 設置所需的所有選項。
  3. 可能是答案的主要部分之一 - 在這里,您使用合同方法名稱創建事務,並將此方法所需的所有參數放入其中。 你可以打電話或發送交易。 call方法適用於view標識符為solidity的方法,因此您不需要為此付費,方法send()用於智能合約的方法,應該使用gas來執行。
  4. 在這里,您只需解析方法返回的結果。 您應該知道要從具體方法獲取的變量的數據類型,以便正確解析它們。

我希望我的回答能幫到你! 如果有些事情仍然不清楚 - 隨意問! :)

我已經嘗試過這個解決方案,但看起來它不起作用。 在此處輸入圖像描述

ABI 已正確加載。 我正在調用的函數是這樣的。

let contractAddress = EthereumAddress("0x292A9B1e6Ae49ce03B4c0473D1a53330469aC4fd")!
    let abiVersion = 2 // Contract ABI version
    let amount = Web3.Utils.parseToBigUInt("0.001", units: .eth)
    let parameters: [AnyObject] = [] // Parameters for contract method
    let extraData: Data = Data() // Extra data for contract method
    let contract = web3Provider.contract(abi, at: contractAddress, abiVersion: abiVersion)!
      var options = TransactionOptions.defaultOptions
      options.from = walletAddress
    DispatchQueue.global(qos: .background).async {
        let result = try! contract.method(contractMethod, parameters: [], transactionOptions: options)?.call(transactionOptions: options)
        print(result)
    }

這總是返回空數組。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM