Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SECP256K1使用锯齿形Swift_Ios_Swift_Sdk - Fatal编程技术网

Ios SECP256K1使用锯齿形Swift

Ios SECP256K1使用锯齿形Swift,ios,swift,sdk,Ios,Swift,Sdk,我正在尝试使用Sawtooth SDK对签名进行签名和验证。看了一下文档,我照着做了,但没有成功 import SawtoothSigning public class Secp256k1 { private var signer: Signer private var privateKey: PrivateKey private var context = Secp256k1Context() //Here it crashed with error Thread 1: EXC_BAD_A

我正在尝试使用Sawtooth SDK对签名进行签名和验证。看了一下文档,我照着做了,但没有成功

import SawtoothSigning

public class Secp256k1 {

private var signer: Signer
private var privateKey: PrivateKey
private var context = Secp256k1Context() //Here it crashed with error Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeeda61ff8)

 public func sign(message: [UInt8]) -> String {
    var result = ""
    do {
        result = try signer.sign(data: message)
    } catch {
        print("Error signing")
    }
    return result
}

public func getPrivateKey() -> PrivateKey {
    if let privateKey = UserDefaults.standard.string(forKey: "privateKey") {
        return Secp256k1PrivateKey.fromHex(hexPrivKey: privateKey)
    } else {
        let privateKey = context.newRandomPrivateKey()
        UserDefaults.standard.set(privateKey.hex(), forKey: "privateKey" )
        do {
            let pubKey = try context.getPublicKey(privateKey: privateKey)
            UserDefaults.standard.set(pubKey.hex(), forKey: "publicKey" )
        } catch {
            if #available(iOS 10.0, *) {
                print("Error creating public key")
            }
        }
        return privateKey
    }
}

public init() {
    self.privateKey = Secp256k1().getPrivateKey()
    self.signer = Signer(context: context, privateKey: self.privateKey)
}
}

有没有人使用过这个SDK,并且知道它为什么会崩溃?或者有没有更简单的SDK?

您循环使用了
Secp256k1
构造函数(即在own
init
中调用
Secp256k1()
),导致崩溃

以下是解决方案的可能变体(已测试并使用Xcode 11.4):

公共类Secp256k1{
私有var签名者:签名者
private var privateKey:privateKey
私有静态var context=Secp256k1Context()//字符串{
var result=“”
做{
结果=尝试signer.sign(数据:消息)
}抓住{
打印(“错误签名”)
}
返回结果
}

公共静态函数getPrivateKey()->PrivateKey{//成功了!谢谢!但似乎通过添加一个单词“static”来解决这个问题?我可以知道为什么吗?
static
表示成员不属于类的实例,而是属于整个类,所以要访问这样的成员,不需要实例化类,而是直接使用类,例如
Secp256k1.context
public class Secp256k1 {

    private var signer: Signer
    private var privateKey: PrivateKey
    private static var context = Secp256k1Context()          // << shared !!

    public func sign(message: [UInt8]) -> String {
        var result = ""
        do {
            result = try signer.sign(data: message)
        } catch {
            print("Error signing")
        }
        return result
    }

    public static func getPrivateKey() -> PrivateKey {        // << shared !!
        if let privateKey = UserDefaults.standard.string(forKey: "privateKey") {
            return Secp256k1PrivateKey.fromHex(hexPrivKey: privateKey)
        } else {
            let privateKey = context.newRandomPrivateKey()
            UserDefaults.standard.set(privateKey.hex(), forKey: "privateKey" )
            do {
                let pubKey = try context.getPublicKey(privateKey: privateKey)
                UserDefaults.standard.set(pubKey.hex(), forKey: "publicKey" )
            } catch {
                if #available(iOS 10.0, *) {
                    print("Error creating public key")
                }
            }
            return privateKey
        }
    }

    public init() {
        self.privateKey = Secp256k1.getPrivateKey()       // no cycle now !!
        self.signer = Signer(context: Secp256k1.context, privateKey: self.privateKey)
    }
}