Skip to content

Commit

Permalink
feat: add compact block filter client
Browse files Browse the repository at this point in the history
temp 2

temp 3

temp 4

pass wallet to builder

remove async builder

make ip a type, bump bdk-kyoto, add connections

add more configurations

fix datadir builder

bump kyoto

add trait bound for logger

update logger

update bdk-ffi
  • Loading branch information
thunderbiscuit authored and rustaceanrob committed Nov 15, 2024
1 parent 8cf23df commit 2cda0bf
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 52 deletions.
2 changes: 0 additions & 2 deletions bdk-android/lib/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,11 @@ java {
dependencies {
implementation("net.java.dev.jna:jna:5.14.0@aar")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
implementation("androidx.appcompat:appcompat:1.4.0")
implementation("androidx.core:core-ktx:1.7.0")
api("org.slf4j:slf4j-api:1.7.30")

androidTestImplementation("com.github.tony19:logback-android:2.0.0")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
androidTestImplementation("org.jetbrains.kotlin:kotlin-test:1.6.10")
Expand Down

This file was deleted.

2 changes: 1 addition & 1 deletion bdk-ffi/src/bdk.udl
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ interface LightClient {
Update? update(NodeEventHandler? logger);

[Async, Throws=LightClientError]
void broadcast(Transaction transaction);
void broadcast([ByRef] Transaction transaction);

[Async, Throws=LightClientError]
void watch_address(Address address);
Expand Down
2 changes: 1 addition & 1 deletion bdk-ffi/src/bitcoin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ impl From<BdkAddress> for Address {
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Transaction(pub(crate) BdkTransaction);
pub struct Transaction(BdkTransaction);

impl Transaction {
pub fn new(transaction_bytes: Vec<u8>) -> Result<Self, TransactionError> {
Expand Down
4 changes: 2 additions & 2 deletions bdk-ffi/src/kyoto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,9 @@ impl LightClient {
update.map(|update| Arc::new(Update(update.into())))
}

pub async fn broadcast(&self, transaction: Arc<Transaction>) -> Result<(), LightClientError> {
pub async fn broadcast(&self, transaction: &Transaction) -> Result<(), LightClientError> {
let client = self.client.lock().await;
let tx = transaction.0.clone();
let tx = transaction.into();
client
.broadcast(tx, bdk_kyoto::TxBroadcastPolicy::RandomPeer)
.await
Expand Down
19 changes: 0 additions & 19 deletions bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/KyotoTest.kt

This file was deleted.

49 changes: 49 additions & 0 deletions bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveKyotoTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.bitcoindevkit
import org.rustbitcoin.bitcoin.Network

import kotlinx.coroutines.runBlocking
import kotlin.test.Test
import kotlin.test.AfterTest
import kotlin.test.assertNotNull

import java.nio.file.Files
import java.nio.file.Paths
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.deleteRecursively

class LiveKyotoTest {
private val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET)
private val changeDescriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.SIGNET)
private val ip: IpAddress = IpAddress.fromIpv4(68u, 47u, 229u, 218u)
private val peer: Peer = Peer(ip, null, false)
private val currentPath = Paths.get(".").toAbsolutePath().normalize()
private val persistenceFilePath = Files.createTempDirectory(currentPath, "tempDirPrefix_")

@OptIn(ExperimentalPathApi::class)
@AfterTest
fun cleanup() {
persistenceFilePath.deleteRecursively()
}

@Test
fun testKyoto() {
val conn: Connection = Connection.newInMemory()
val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET, conn)
val peers = listOf(peer)
runBlocking {
val nodePair = buildLightClient(wallet, peers, 1u, null, persistenceFilePath.toString())
val client = nodePair.client
val node = nodePair.node
println("Node running")
runNode(node)
val updateOpt: Update? = client.update(null)
val update = assertNotNull(updateOpt)
wallet.applyUpdate(update)
assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
}
client.shutdown()
println("Test completed successfully")
}
}
}
54 changes: 54 additions & 0 deletions bdk-python/tests/test_live_kyoto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from bdkpython import *
from bdkpython.bitcoin import *
import unittest
import os

network: Network = Network.SIGNET

ip: IpAddress = IpAddress.from_ipv4(68, 47, 229, 218)
peer: Peer = Peer(address=ip, port=None, v2_transport=False)

descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network=network
)
change_descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network=network
)

class LiveKyotoTest(unittest.IsolatedAsyncioTestCase):

def tearDown(self) -> None:
if os.path.exists("./bdk_persistence.sqlite"):
os.remove("./bdk_persistence.sqlite")
if os.path.exists("./data/signet/headers.db"):
os.remove("./data/signet/headers.db")
if os.path.exists("./data/signet/peers.db"):
os.remove("./data/signet/peers.db")

async def testKyoto(self) -> None:
connection: Connection = Connection.new_in_memory()
wallet: Wallet = Wallet(
descriptor,
change_descriptor,
network,
connection
)
peers = [peer]
node_pair: NodePair = build_light_client(wallet, peers, 1, None, ".")
client: LightClient = node_pair.client
node: LightNode = node_pair.node
run_node(node)
update: Update = await client.update(None)
self.assertIsNotNone(update, "Update is None. This should not be possible.")
wallet.apply_update(update)
self.assertGreater(
wallet.balance().total.to_sat(),
0,
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(KeychainKind.EXTERNAL).address} and try again."
)
await client.shutdown()

if __name__ == "__main__":
unittest.main()
14 changes: 11 additions & 3 deletions bdk-swift/Tests/BitcoinDevKitTests/LiveKyotoTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import XCTest
@testable import BitcoinDevKit

private let PEER = IpAddress.fromIpv4(q1: 68, q2: 47, q3: 229, q4: 218)

final class LiveKyotoTests: XCTestCase {
private let descriptor = try! Descriptor(
Expand All @@ -19,6 +18,15 @@ final class LiveKyotoTests: XCTestCase {
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
private let peer = IpAddress.fromIpv4(q1: 68, q2: 47, q3: 229, q4: 218)
private let cwd = FileManager.default.currentDirectoryPath.appending("/temp")

override func tearDownWithError() throws {
let fileManager = FileManager.default
if fileManager.fileExists(atPath: cwd) {
try fileManager.removeItem(atPath: cwd)
}
}

func testSuccessfullySyncs() async throws {
let connection = try Connection.newInMemory()
Expand All @@ -28,8 +36,8 @@ final class LiveKyotoTests: XCTestCase {
network: Network.signet,
connection: connection
)
let trusted_peer = Peer(address: PEER, port: nil, v2Transport: false)
let nodePair = try! buildLightClient(wallet: wallet, peers: [trusted_peer], connections: 1, recoveryHeight: nil, dataDir: ".")
let trusted_peer = Peer(address: peer, port: nil, v2Transport: false)
let nodePair = try buildLightClient(wallet: wallet, peers: [trusted_peer], connections: 1, recoveryHeight: nil, dataDir: cwd)
let client = nodePair.client
let node = nodePair.node
runNode(node: node)
Expand Down

0 comments on commit 2cda0bf

Please sign in to comment.