Ethereum 使用web3swift与自定义智能合约交互

Ethereum 使用web3swift与自定义智能合约交互,ethereum,smartcontracts,web3swift,Ethereum,Smartcontracts,Web3swift,我正在使用web3swift库,我设法完成了一些事务,主要是GET(balanceOf、owner等)。我阅读了整个自述文件(文档),但我不太确定,我们可以使用这个库调用自定义智能合约中的函数吗?例如,我有商店智能合约,我想从中调用buy函数?我看到我们可以转让eth和ERC20代币,但这对我来说还不够。有什么帮助吗?是的,您可以调用自定义智能合约上的任何函数。这里有一个例子 let infura = Web3.InfuraMainnetWeb3() // 1

我正在使用web3swift库,我设法完成了一些事务,主要是GET(balanceOf、owner等)。我阅读了整个自述文件(文档),但我不太确定,我们可以使用这个库调用自定义智能合约中的函数吗?例如,我有商店智能合约,我想从中调用buy函数?我看到我们可以转让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))
            }
        }
    }  
  • 建立合同和ABI。您需要数据或字符串格式的合同地址<代码>让ethContractAddress=EthereumAddress(“0xfa28eC7198028438514b49a3CF353BcA5541ce1d”) 您可以直接从Remix IDE获得合同的ABI
  • 设置您想要的所有选项
  • 可能是答案的主要部分之一——在这里,您使用合同方法名称创建事务,并将此方法所需的所有参数放入其中。 4.您可以在这里拨打电话或发送交易
    call
    method适用于标识符为
    view
    的方法,因此您不会为其付费,method send()适用于智能合约的方法,这些方法应使用gas支付执行费用
  • 在这里,您只需解析方法返回的结果。您应该知道要从具体方法获得的变量的数据类型,以便正确地解析它们
    我希望我的回答能帮助你!如果仍有不清楚的地方,请随时询问!:)

    我有同样的问题,除了在这里简要讨论外,在项目的任何地方都看不到答案:我在这里提出了一个问题供大家参考:@mattgabor回购协议的官方支持者将其移至感谢答案。这是可行的,我自己用与此非常相似的代码实现了。@maptuhec很高兴听到这个消息!你能接受这种情况下的答案吗?:)谢谢你的回答。你怎么知道参数类型?我正在尝试使用如下类型的Solidy函数:函数get_data_string_by_id(uint256 tokenId){..}+看起来像Web3Options。defaultOptions()不推荐使用吗?可能使用:let infura=Web3.InfuraMainnetWeb3()+infura.transactionOptions.from=address