我正在尝试使用来自 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?
最佳答案
您已骑行 Secp256k1
构造函数(即在自己的 Secp256k1()
中调用 init
),导致崩溃。
这是解决方案的可能变体(经过测试并与 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)
}
}
关于ios - SECP256K1 使用 SawTooth Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60809750/