Web3Swift与自定义ABI的交互

Web3Swift与自定义ABI的交互,swift,xcode,ethereum,web3,web3swift,Swift,Xcode,Ethereum,Web3,Web3swift,我正试图与我建立的智能合约互动。 基本上,目标是从iOS应用程序5设置参数 projectTitle projectLocation projectStart projectEnd teamType 我希望用户设置这些参数并将其写入ropsten testnetwork 我还希望在以后用户需要时获得合同信息 我的solidity代码在remix中正常工作,合同已经部署: pragma solidity >=0.4.22 <0.7.0; contract ProjectContent

我正试图与我建立的智能合约互动。 基本上,目标是从iOS应用程序5设置参数
projectTitle
projectLocation
projectStart
projectEnd
teamType

我希望用户设置这些参数并将其写入ropsten testnetwork

我还希望在以后用户需要时获得合同信息

我的solidity代码在remix中正常工作,合同已经部署:

pragma solidity >=0.4.22 <0.7.0;

contract ProjectContent {
    
    string public projectTitle;
    string public projectLocation;
    string public projectStart;
    string public projectEnd;
    string public teamType;

    
    function projectContent(string initialProjectTitle, string initialProjectLocation, string initialProjectStart, string initialProjectEnd, string initialTeamType) public {
        projectTitle = initialProjectTitle;
        projectLocation = initialProjectLocation;
        projectStart = initialProjectStart;
        projectEnd = initialProjectEnd;
        teamType = initialTeamType;
    }
    
    function setContract(string newProjectTitle, string newProjectLocation, string newProjectStart, string newProjectEnd, string newTeamType) public {
        projectTitle = newProjectTitle;
        projectLocation = newProjectLocation;
        projectStart = newProjectStart;
        projectEnd = newProjectEnd;
        teamType = newTeamType;
        
    }
   
    function getProjectTitle() public view returns (string) {
      return projectTitle;
    } 
    
    function getProjectLocation() public view returns (string) {
      return projectLocation;
    } 
    
    function getProjectStart() public view returns (string) {
        return projectStart;
    }
    
    function getProjectEnd() public view returns (string) {
        return projectEnd;
    }
    
    function getTeamType() public view returns (string) {
        return teamType;
    }

    
   
}
我得到一个
结果的错误,它说:
调用可以抛出,但未标记为“try”,并且未处理错误

一般来说,我发现很难与智能合约abi建立交互

我已经在使用web3swift功能发送交易了,它的工作方式很有魅力

也许有人知道我如何在区块链上记录信息,并使用web3swift获取信息

不幸的是,互联网上的东西在这方面确实没有帮助


谢谢你的帮助:)

你很接近了。从错误开始
“调用可以抛出,但它没有标记为“try”,并且错误没有得到处理”
这是由于尝试
调用
合约函数而不使用try-Catch模式造成的。按照web3库的设计方式执行此模式对于所有写入和调用方法都是必需的

//不正确
让结果=transactionIntermediate!。通话(交易选项:选项)
//正确的
做{
让结果=尝试transactionIntermediate!。调用(transactionOptions:options)
}抓住{
打印(“尝试调用方法\(错误)”时出错)
}
此外,我建议在进行合同调用时使用
DispatchQueue.main.async
以及
Promise Kit库

ABI很难阅读,也很混乱,不要建议使用它来帮助在合同中找到可调用的方法和参数。相反,我会让契约沿着Xcode端打开,并通过使用包含将要使用的所有契约方法的enum或struct来打开

//合同中可用的方法
枚举方法:字符串{
案例projectContract=“项目内容”
案例setContract=“setContract”
案例getProjectTitle=“getProjectTitle”
案例getProjectLocation=“getProjectLocation”
案例getProjectStart=“getProjectStart”
案例getProjectEnd=“getProjectEnd”
case getTeamType=“getTeamType”
}
//用法
ContractMethods.setContract.rawValue
我将ABI移动到xcode中的一个单独文件中,以保持其干净。这是文件

下面是一个很好的例子,可以帮助您开始学习。查看我的更新版本。希望这有帮助,如果您还有任何问题,请告诉我。:)

导入UIKit
导入web3swift
进口承诺书
结构钱包{
let地址:String
让数据:数据
let name:String
让我想想,布尔
}
结构HDKey{
名称:字符串?
let地址:String
}
var password=“”//为ganache留空或使用您的钱包密码
let privateKey=”“//钱包的私钥
让walletName=“我的钱包”
let contractAddress=“”//0x11A0c067d7481240dCA57457eff77fc98dEAdE0F
让端点=URL(字符串:”http://127.0.0.1:7545")! // 我正在使用Ganache,但它可能看起来像endpoint=URL(字符串):https://rinkeby.infura.io/v3/")!
设abiVersion=2
类ViewController:UIViewController{
//合同中使用的模拟数据
让projectTitle=“房屋壁板”
let projectLocation=“佐治亚州达库拉赛马大道299号30019”
让projectStart=“2021年5月14日”
让projectEnd=“2021年6月15日”
让teamType=“协作”
var web3:web3?
var合同:web3.web3合同?
重写func viewDidLoad(){
super.viewDidLoad()
//1.使用私钥创建钱包
让formattedKey=privateKey.trimmingCharacters(在:。空格和换行符中)
让dataKey=Data.fromHex(formattedKey)!
让keyStore=try!以太坊keystorev3(privateKey:dataKey,password:password)!
让keyData=try!JSONEncoder().encode(keyStore.keystreparams)
让address=keyStore.addresses!.first!.address
let wallet=wallet(地址:地址,数据:keyData,名称:walletName,isHD:false)
//2.构建web3和密钥管理器
做{
web3=尝试web3.new(端点)
let data=wallet.data
var keysteremanager:keysteremanager
如果钱包是我的{
让keystore=BIP32Keystore(数据)!
keystoreManager=keystoreManager([keystore])
}否则{
让keystore=EthereumKeystoreV3(数据)!
keystoreManager=keystoreManager([keystore])
}
打印(密钥管理器地址)
web3!.addKeystoreManager(keystoreManager)
让ethContractAddress=EthereumAddress(contractAddress,ignoreChecksum:true)!
contract=web3!。contract(contractABI,地址:ethContractAddress,abiVersion:abiVersion)!
}抓住{
打印(“无法构造合同和/或密钥管理器\(错误)”)
}
//3.创建并调用合同方法
//让参数=[projectTitle,projectLocation,projectStart,projectEnd,teamType]作为[AnyObject]//用于创建新项目的参数
将参数=[]设为[AnyObject]//无参数
让响应=承诺{盖章
DispatchQueue.global().async{
//捕获异步调用中的错误
做{
//方法调用没有额外的数据
let extraData:Data=Data()
//方法调用的选项
var options=TransactionOptions.defaultOptions
class ProjectContractViewController: UIViewController, HalfModalPresentable {

    @IBOutlet weak var contractABIView: UITextView!
    
    
    var halfModalTransitioningDelegate: HalfModalTransitioningDelegate?
    
    var contractABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"initialProjectTitle\",\"type\":\"string\"},{\"name\":\"initialProjectLocation\",\"type\":\"string\"},{\"name\":\"initialProjectStart\",\"type\":\"string\"},{\"name\":\"initialProjectEnd\",\"type\":\"string\"},{\"name\":\"initialTeamType\",\"type\":\"string\"}],\"name\":\"projectContent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newProjectTitle\",\"type\":\"string\"},{\"name\":\"newProjectLocation\",\"type\":\"string\"},{\"name\":\"newProjectStart\",\"type\":\"string\"},{\"name\":\"newProjectEnd\",\"type\":\"string\"},{\"name\":\"newTeamType\",\"type\":\"string\"}],\"name\":\"setContract\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getProjectEnd\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getProjectLocation\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getProjectStart\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getProjectTitle\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getTeamType\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"projectEnd\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"projectLocation\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"projectStart\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"projectTitle\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"teamType\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
    
    
    let str = "0x6080604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806323a35e62146100bf57806337a4fc7d1461014f5780634a5736fd146101df5780634b04811e1461026f5780634e9d1281146102ff57806363afee221461038f578063775e6d451461051057806393ee0402146105a0578063c3e20c9f14610630578063d8045412146106c0578063dad375ff14610750578063f020cd19146108d1575b600080fd5b3480156100cb57600080fd5b506100d4610961565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101145780820151818401526020810190506100f9565b50505050905090810190601f1680156101415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015b57600080fd5b50610164610a03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a4578082015181840152602081019050610189565b50505050905090810190601f1680156101d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101eb57600080fd5b506101f4610aa1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610234578082015181840152602081019050610219565b50505050905090810190601f1680156102615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027b57600080fd5b50610284610b3f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c45780820151818401526020810190506102a9565b50505050905090810190601f1680156102f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030b57600080fd5b50610314610bdd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610354578082015181840152602081019050610339565b50505050905090810190601f1680156103815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039b57600080fd5b5061050e600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610c7b565b005b34801561051c57600080fd5b50610525610cf5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561056557808201518184015260208101905061054a565b50505050905090810190601f1680156105925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105ac57600080fd5b506105b5610d97565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105f55780820151818401526020810190506105da565b50505050905090810190601f1680156106225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561063c57600080fd5b50610645610e39565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561068557808201518184015260208101905061066a565b50505050905090810190601f1680156106b25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106cc57600080fd5b506106d5610ed7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107155780820151818401526020810190506106fa565b50505050905090810190601f1680156107425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561075c57600080fd5b506108cf600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610f79565b005b3480156108dd57600080fd5b506108e6610ff3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561092657808201518184015260208101905061090b565b50505050905090810190601f1680156109535780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109f95780601f106109ce576101008083540402835291602001916109f9565b820191906000526020600020905b8154815290600101906020018083116109dc57829003601f168201915b5050505050905090565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b375780601f10610b0c57610100808354040283529160200191610b37565b820191906000526020600020905b815481529060010190602001808311610b1a57829003601f168201915b505050505081565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bd55780601f10610baa57610100808354040283529160200191610bd5565b820191906000526020600020905b815481529060010190602001808311610bb857829003601f168201915b505050505081565b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c735780601f10610c4857610100808354040283529160200191610c73565b820191906000526020600020905b815481529060010190602001808311610c5657829003601f168201915b505050505081565b8460009080519060200190610c91929190611095565b508360019080519060200190610ca8929190611095565b508260029080519060200190610cbf929190611095565b508160039080519060200190610cd6929190611095565b508060049080519060200190610ced929190611095565b505050505050565b606060018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e2f5780601f10610e0457610100808354040283529160200191610e2f565b820191906000526020600020905b815481529060010190602001808311610e1257829003601f168201915b5050505050905090565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ecf5780601f10610ea457610100808354040283529160200191610ecf565b820191906000526020600020905b815481529060010190602001808311610eb257829003601f168201915b505050505081565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6f5780601f10610f4457610100808354040283529160200191610f6f565b820191906000526020600020905b815481529060010190602001808311610f5257829003601f168201915b5050505050905090565b8460009080519060200190610f8f929190611095565b508360019080519060200190610fa6929190611095565b508260029080519060200190610fbd929190611095565b508160039080519060200190610fd4929190611095565b508060049080519060200190610feb929190611095565b505050505050565b606060008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561108b5780601f106110605761010080835404028352916020019161108b565b820191906000526020600020905b81548152906001019060200180831161106e57829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110d657805160ff1916838001178555611104565b82800160010185558215611104579182015b828111156111035782518255916020019190600101906110e8565b5b5090506111119190611115565b5090565b61113791905b8082111561113357600081600090555060010161111b565b5090565b905600a165627a7a72305820458843a936d80ffe49dddb0955a0c1d56d0e15f994cd5ce31b386188b2724a790029"
        
    var contractAddress = EthereumAddress("0x11A0c067d7481240dCA57457eff77fc98dEAdE0F")

    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    
    func callContract(Password: String) {
        
        // Get from address from private key
        
        let formattedKey = Password.trimmingCharacters(in: .whitespacesAndNewlines)
        let dataKey = Data.fromHex(formattedKey )!
                    
                    // @@@ use [passKey]
        let keystore = try! EthereumKeystoreV3(privateKey: dataKey, password: "")!

  
        let keyData = try! JSONEncoder().encode(keystore.keystoreParams)
//            let address = keystore.addresses!.first!.address
        let address =  keystore.addresses!.first!.address
        let ethAddress = EthereumAddress(address)
        
        
        let infura = Web3.InfuraMainnetWeb3()
        // 1
        let contract = infura.contract(contractABI, at: contractAddress, abiVersion: 2)
        // 2
        var options = TransactionOptions.defaultOptions
            options.from = keystore.addresses!.first!
        // 3
        
        let data = Data.init(hex: str)

        let transactionIntermediate = contract?.method("getProjectTitle", parameters: [address] as [AnyObject], extraData: data, transactionOptions: options)
            
        // 4
        let result = transactionIntermediate!.call(transactionOptions: 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))
            }
        }
    }
}