/// <summary> /// Compute signature point. /// </summary> /// <param name="msg">32-byte msg</param> /// <param name="nonce">schnorr nonce</param> /// <param name="schnorrPubkey">pubkey</param> /// <returns>signature point</returns> public static Pubkey ComputeSigPoint(ByteData msg, SchnorrPubkey nonce, SchnorrPubkey schnorrPubkey) { if (msg is null) { throw new ArgumentNullException(nameof(msg)); } if (nonce is null) { throw new ArgumentNullException(nameof(nonce)); } if (schnorrPubkey is null) { throw new ArgumentNullException(nameof(schnorrPubkey)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdComputeSchnorrSigPoint( handle.GetHandle(), msg.ToHexString(), nonce.ToHexString(), schnorrPubkey.ToHexString(), out IntPtr sigPoint); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } string point = CCommon.ConvertToString(sigPoint); return(new Pubkey(point)); } }
/// <summary> /// constructor for schnorr pubkey. /// </summary> /// <param name="pubkey">schnorr public key</param> /// <param name="type">address type</param> /// <param name="network">network type</param> public Address(SchnorrPubkey pubkey, CfdAddressType type, CfdNetworkType network) { if (pubkey is null) { throw new ArgumentNullException(nameof(pubkey)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdCreateAddress( handle.GetHandle(), (int)type, pubkey.ToHexString(), "", (int)network, out IntPtr outputAddress, out IntPtr outputLockingScript, out IntPtr outputP2shSegwitLockingScript); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } address = CCommon.ConvertToString(outputAddress); lockingScript = CCommon.ConvertToString(outputLockingScript); p2shSegwitLockingScript = CCommon.ConvertToString(outputP2shSegwitLockingScript); Initialize(handle, address, out network, out witnessVersion, out string tempLockingScript, out hash); this.network = network; addressType = type; } }
/// <summary> /// Verify schnorr signature. /// </summary> /// <param name="signature">schnorr signature</param> /// <param name="msg">32-byte msg</param> /// <param name="schnorrPubkey">pubkey</param> /// <returns>verify result</returns> public static bool Verify(SchnorrSignature signature, ByteData msg, SchnorrPubkey schnorrPubkey) { if (signature is null) { throw new ArgumentNullException(nameof(signature)); } if (msg is null) { throw new ArgumentNullException(nameof(msg)); } if (schnorrPubkey is null) { throw new ArgumentNullException(nameof(schnorrPubkey)); } using (var handle = new ErrorHandle()) { var ret = NativeMethods.CfdVerifySchnorr( handle.GetHandle(), signature.ToHexString(), msg.ToHexString(), schnorrPubkey.ToHexString()); if (ret == CfdErrorCode.Success) { return(true); } else if (ret != CfdErrorCode.SignVerificationError) { handle.ThrowError(ret); } } return(false); }
/// <summary> /// Get taproot data. /// </summary> /// <param name="internalPubkey">internal pubkey</param> /// <returns>taproot data</returns> public TaprootScriptData GetTaprootData(SchnorrPubkey internalPubkey) { if (internalPubkey is null) { throw new ArgumentNullException(nameof(internalPubkey)); } using (var handle = new ErrorHandle()) using (var treeHandle = new TreeHandle(handle)) { Load(handle, treeHandle); var ret = NativeMethods.CfdGetTaprootScriptTreeHash( handle.GetHandle(), treeHandle.GetHandle(), internalPubkey.ToHexString(), out IntPtr witnessProgram, out IntPtr tapLeafHashPtr, out IntPtr controlBlockStr); if (ret != CfdErrorCode.Success) { handle.ThrowError(ret); } var witnessProgramStr = CCommon.ConvertToString(witnessProgram); var tapLeafHash = CCommon.ConvertToString(tapLeafHashPtr); var controlBlock = CCommon.ConvertToString(controlBlockStr); return(new TaprootScriptData( new SchnorrPubkey(witnessProgramStr), new ByteData(controlBlock), new ByteData256(tapLeafHash), GetTapScript())); } }