【问题标题】:SECP256K1 using SawTooth SwiftSECP256K1 使用 SawTooth Swift
【发布时间】:2020-07-03 16:35:33
【问题描述】:

我正在尝试使用来自Sawtooth 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_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?

【问题讨论】:

    标签: ios swift sdk


    【解决方案1】:

    您循环了Secp256k1 构造函数(即在自己的init 中调用Secp256k1()),这会导致崩溃。

    这是解决方案的可能变体(经过测试并适用于 Xcode 11.4):

    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)
        }
    }
    

    【讨论】:

    • 成功了!谢谢!但是好像加了一个“静态”这个词就解决了?我可以知道为什么吗?
    • static 表示成员不属于类的实例,而是属于整个类,因此访问该成员不需要实例化类,而是直接使用类,例如。 Secp256k1.context.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多