Skip to content

Commit 8b39819

Browse files
authored
Merge pull request #17 from TheBlueMatt/main
Update to latest upstream
2 parents d54d5dd + 722735d commit 8b39819

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+60942
-16253
lines changed

.github/workflows/build.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ jobs:
2929
git merge matt/2021-03-java-bindings-base
3030
cd ..
3131
git clone https://github.com/lightningdevkit/ldk-c-bindings
32+
- name: Rebuild C bindings without STD for WASM
33+
run: |
34+
cd ldk-c-bindings
35+
./genbindings.sh ../rust-lightning false
36+
mv target/wasm32-wasi ./
37+
cd ..
3238
- name: Rebuild C bindings, and check the sample app builds + links
33-
run: cd ldk-c-bindings && ./genbindings.sh ../rust-lightning true && cd ..
39+
run: cd ldk-c-bindings && ./genbindings.sh ../rust-lightning true && mv wasm32-wasi target/ && cd ..
3440
- name: Build Java/TS Debug Bindings
3541
run: ./genbindings.sh ./ldk-c-bindings/ "-I/usr/lib/jvm/java-11-openjdk-amd64/include/ -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux/" true false
3642
- name: Run Java Tests against Debug Bindings

genbindings.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def camel_to_snake(s):
6969
unitary_enums = set()
7070
complex_enums = set()
7171
opaque_structs = set()
72-
trait_structs = set()
72+
trait_structs = {}
7373
result_types = set()
7474
tuple_types = {}
7575

@@ -101,6 +101,11 @@ def java_c_types(fn_arg, ret_arr_len):
101101
assert var_is_arr_regex.match(fn_arg[8:])
102102
rust_obj = "LDKThirtyTwoBytes"
103103
arr_access = "data"
104+
elif fn_arg.startswith("LDKTxid"):
105+
fn_arg = "uint8_t (*" + fn_arg[8:] + ")[32]"
106+
assert var_is_arr_regex.match(fn_arg[8:])
107+
rust_obj = "LDKThirtyTwoBytes"
108+
arr_access = "data"
104109
elif fn_arg.startswith("LDKPublicKey"):
105110
fn_arg = "uint8_t (*" + fn_arg[13:] + ")[33]"
106111
assert var_is_arr_regex.match(fn_arg[8:])
@@ -146,7 +151,7 @@ def java_c_types(fn_arg, ret_arr_len):
146151
rust_obj = "LDKCVec_u8Z"
147152
assert var_is_arr_regex.match(fn_arg[8:])
148153
arr_access = "data"
149-
elif fn_arg.startswith("LDKTransaction"):
154+
elif fn_arg.startswith("LDKTransaction ") or fn_arg == "LDKTransaction":
150155
fn_arg = "uint8_t (*" + fn_arg[15:] + ")[datalen]"
151156
rust_obj = "LDKTransaction"
152157
assert var_is_arr_regex.match(fn_arg[8:])
@@ -509,12 +514,17 @@ def map_complex_enum(struct_name, union_enum_items, inline_enum_variants, enum_d
509514
def map_trait(struct_name, field_var_lines, trait_fn_lines, trait_doc_comment):
510515
with open(f"{sys.argv[3]}/structs/{struct_name.replace('LDK', '')}{consts.file_ext}", "w") as out_java_trait:
511516
field_var_convs = []
517+
flattened_field_var_convs = []
512518
for var_line in field_var_lines:
513519
if var_line.group(1) in trait_structs:
514-
field_var_convs.append((var_line.group(1), var_line.group(2)))
520+
field_var_convs.append((var_line.group(1), var_line.group(2), trait_structs[var_line.group(1)]))
521+
flattened_field_var_convs.append((var_line.group(1), var_line.group(2), ))
522+
flattened_field_var_convs.extend(trait_structs[var_line.group(1)])
515523
else:
516-
field_var_convs.append(
517-
type_mapping_generator.map_type(var_line.group(1) + " " + var_line.group(2), False, None, False, False))
524+
mapped = type_mapping_generator.map_type(var_line.group(1) + " " + var_line.group(2), False, None, False, False)
525+
field_var_convs.append(mapped)
526+
flattened_field_var_convs.append(mapped)
527+
trait_structs[struct_name] = field_var_convs
518528

519529
field_fns = []
520530
for fn_docs, fn_line in trait_fn_lines:
@@ -529,7 +539,7 @@ def map_trait(struct_name, field_var_lines, trait_fn_lines, trait_doc_comment):
529539
arg_tys.append(arg_conv_info)
530540
field_fns.append(TraitMethInfo(fn_line.group(3), is_const, ret_ty_info, arg_tys, fn_docs))
531541

532-
(out_java_addendum, out_java_trait_addendum, out_c_addendum) = consts.native_c_map_trait(struct_name, field_var_convs, field_fns, trait_doc_comment)
542+
(out_java_addendum, out_java_trait_addendum, out_c_addendum) = consts.native_c_map_trait(struct_name, field_var_convs, flattened_field_var_convs, field_fns, trait_doc_comment)
533543
write_c(out_c_addendum)
534544
out_java_trait.write(out_java_trait_addendum)
535545
out_java.write(out_java_addendum)
@@ -874,7 +884,6 @@ def map_tuple(struct_name, field_lines):
874884
map_unitary_enum(struct_name, field_lines, last_block_comment)
875885
last_block_comment = None
876886
elif len(trait_fn_lines) > 0:
877-
trait_structs.add(struct_name)
878887
map_trait(struct_name, field_var_lines, trait_fn_lines, last_block_comment)
879888
elif struct_name == "LDKTxOut":
880889
with open(f"{sys.argv[3]}/structs/TxOut{consts.file_ext}", "w") as out_java_struct:

genbindings.sh

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,21 @@ fi
1818

1919
set -e
2020

21+
cp "$1/lightning-c-bindings/include/lightning.h" ./
22+
sed -i "s/TransactionOutputs/C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ/g" ./lightning.h
23+
2124
echo "Creating Java bindings..."
2225
mkdir -p src/main/java/org/ldk/{enums,structs}
2326
rm -f src/main/java/org/ldk/{enums,structs}/*.java
2427
rm -f src/main/jni/*.h
2528
if [ "$4" = "true" ]; then
26-
./genbindings.py "$1/lightning-c-bindings/include/lightning.h" src/main/java/org/ldk/impl/bindings.java src/main/java/org/ldk src/main/jni/bindings.c $3 android $4
29+
./genbindings.py "./lightning.h" src/main/java/org/ldk/impl/bindings.java src/main/java/org/ldk src/main/jni/bindings.c.body $3 android $4
2730
else
28-
./genbindings.py "$1/lightning-c-bindings/include/lightning.h" src/main/java/org/ldk/impl/bindings.java src/main/java/org/ldk src/main/jni/bindings.c $3 java $4
31+
./genbindings.py "./lightning.h" src/main/java/org/ldk/impl/bindings.java src/main/java/org/ldk src/main/jni/bindings.c.body $3 java $4
2932
fi
33+
echo "#define LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ" > src/main/jni/bindings.c
34+
echo "#define CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free" >> src/main/jni/bindings.c
35+
cat src/main/jni/bindings.c.body >> src/main/jni/bindings.c
3036
javac -h src/main/jni src/main/java/org/ldk/enums/*.java src/main/java/org/ldk/impl/bindings.java
3137
rm src/main/java/org/ldk/enums/*.class src/main/java/org/ldk/impl/bindings*.class
3238

@@ -41,7 +47,10 @@ fi
4147
echo "Creating TS bindings..."
4248
mkdir -p ts/{enums,structs}
4349
rm -f ts/{enums,structs}/*.ts
44-
./genbindings.py "$1/lightning-c-bindings/include/lightning.h" ts/bindings.ts ts ts/bindings.c $3 typescript
50+
./genbindings.py "./lightning.h" ts/bindings.ts ts ts/bindings.c.body $3 typescript
51+
echo "#define LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ" > ts/bindings.c
52+
echo "#define CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free" >> ts/bindings.c
53+
cat ts/bindings.c.body >> ts/bindings.c
4554

4655
echo "Building TS bindings..."
4756
COMPILE="$COMMON_COMPILE -flto -Wl,--no-entry -Wl,--export-dynamic -Wl,-allow-undefined -nostdlib --target=wasm32-wasi"

java_strings.py

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ def c_constr_native_complex_enum(self, struct_name, variant, c_params):
479479
ret = ret + ", " + param
480480
return ret + ")"
481481

482-
def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comment):
482+
def native_c_map_trait(self, struct_name, field_vars, flattened_field_vars, field_fns, trait_doc_comment):
483483
out_java_trait = ""
484484
out_java = ""
485485

@@ -492,14 +492,14 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
492492
out_java_trait = out_java_trait + "\tfinal bindings." + struct_name + " bindings_instance;\n"
493493
out_java_trait = out_java_trait + "\t" + struct_name.replace("LDK", "") + "(Object _dummy, long ptr) { super(ptr); bindings_instance = null; }\n"
494494
out_java_trait = out_java_trait + "\tprivate " + struct_name.replace("LDK", "") + "(bindings." + struct_name + " arg"
495-
for var in field_vars:
495+
for var in flattened_field_vars:
496496
if isinstance(var, ConvInfo):
497497
out_java_trait = out_java_trait + ", " + var.java_hu_ty + " " + var.arg_name
498498
else:
499499
out_java_trait = out_java_trait + ", bindings." + var[0] + " " + var[1]
500500
out_java_trait = out_java_trait + ") {\n"
501501
out_java_trait = out_java_trait + "\t\tsuper(bindings." + struct_name + "_new(arg"
502-
for var in field_vars:
502+
for var in flattened_field_vars:
503503
if isinstance(var, ConvInfo):
504504
if var.from_hu_conv is not None:
505505
out_java_trait = out_java_trait + ", " + var.from_hu_conv[0]
@@ -509,7 +509,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
509509
out_java_trait = out_java_trait + ", " + var[1]
510510
out_java_trait = out_java_trait + "));\n"
511511
out_java_trait = out_java_trait + "\t\tthis.ptrs_to.add(arg);\n"
512-
for var in field_vars:
512+
for var in flattened_field_vars:
513513
if isinstance(var, ConvInfo):
514514
if var.from_hu_conv is not None and var.from_hu_conv[1] != "":
515515
out_java_trait = out_java_trait + "\t\t" + var.from_hu_conv[1].replace("\n", "\n\t\t") + ";\n"
@@ -524,7 +524,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
524524

525525
java_trait_constr = "\tprivate static class " + struct_name + "Holder { " + struct_name.replace("LDK", "") + " held; }\n"
526526
java_trait_constr = java_trait_constr + "\tpublic static " + struct_name.replace("LDK", "") + " new_impl(" + struct_name.replace("LDK", "") + "Interface arg"
527-
for var in field_vars:
527+
for var in flattened_field_vars:
528528
if isinstance(var, ConvInfo):
529529
java_trait_constr = java_trait_constr + ", " + var.java_hu_ty + " " + var.arg_name
530530
else:
@@ -593,14 +593,25 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
593593
if isinstance(var, ConvInfo):
594594
java_trait_constr = java_trait_constr + ", " + var.arg_name
595595
else:
596-
java_trait_constr = java_trait_constr + ", " + var[1] + ".new_impl(" + var[1] + "_impl).bindings_instance"
596+
java_trait_constr += ", " + var[1] + ".new_impl(" + var[1] + "_impl"
597+
for suparg in var[2]:
598+
if isinstance(suparg, ConvInfo):
599+
java_trait_constr += ", " + suparg.arg_name
600+
else:
601+
java_trait_constr += ", " + suparg[1]
602+
java_trait_constr += ").bindings_instance"
603+
for suparg in var[2]:
604+
if isinstance(suparg, ConvInfo):
605+
java_trait_constr += ", " + suparg.arg_name
606+
else:
607+
java_trait_constr += ", " + suparg[1]
597608
out_java_trait = out_java_trait + "\t}\n"
598609
out_java_trait = out_java_trait + java_trait_constr + ");\n\t\treturn impl_holder.held;\n\t}\n"
599610

600611
out_java = out_java + "\t}\n"
601612

602613
out_java = out_java + "\tpublic static native long " + struct_name + "_new(" + struct_name + " impl"
603-
for var in field_vars:
614+
for var in flattened_field_vars:
604615
if isinstance(var, ConvInfo):
605616
out_java = out_java + ", " + var.java_ty + " " + var.arg_name
606617
else:
@@ -612,7 +623,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
612623
out_c = out_c + "\tatomic_size_t refcnt;\n"
613624
out_c = out_c + "\tJavaVM *vm;\n"
614625
out_c = out_c + "\tjweak o;\n"
615-
for var in field_vars:
626+
for var in flattened_field_vars:
616627
if isinstance(var, ConvInfo):
617628
# We're a regular ol' field
618629
pass
@@ -688,7 +699,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
688699
out_c = out_c + "}\n"
689700

690701
out_c = out_c + "static inline " + struct_name + " " + struct_name + "_init (" + self.c_fn_args_pfx + ", jobject o"
691-
for var in field_vars:
702+
for var in flattened_field_vars:
692703
if isinstance(var, ConvInfo):
693704
out_c = out_c + ", " + var.c_ty + " " + var.arg_name
694705
else:
@@ -707,7 +718,7 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
707718
out_c = out_c + "\tcalls->" + fn_name + "_meth = (*env)->GetMethodID(env, c, \"" + fn_name + "\", \"" + java_meth_descr + "\");\n"
708719
out_c = out_c + "\tCHECK(calls->" + fn_name + "_meth != NULL);\n"
709720

710-
for var in field_vars:
721+
for var in flattened_field_vars:
711722
if isinstance(var, ConvInfo) and var.arg_conv is not None:
712723
out_c = out_c + "\n\t" + var.arg_conv.replace("\n", "\n\t") +"\n"
713724
out_c = out_c + "\n\t" + struct_name + " ret = {\n"
@@ -728,24 +739,30 @@ def native_c_map_trait(self, struct_name, field_vars, field_fns, trait_doc_comme
728739
out_c = out_c + "\t\t." + var.var_name + " = " + var.var_name + ",\n"
729740
out_c = out_c + "\t\t.set_" + var.var_name + " = NULL,\n"
730741
else:
731-
out_c = out_c + "\t\t." + var[1] + " = " + var[0] + "_init(env, clz, " + var[1] + "),\n"
742+
out_c += "\t\t." + var[1] + " = " + var[0] + "_init(env, clz, " + var[1]
743+
for suparg in var[2]:
744+
if isinstance(suparg, ConvInfo):
745+
out_c = out_c + ", " + suparg.arg_name
746+
else:
747+
out_c = out_c + ", " + suparg[1]
748+
out_c += "),\n"
732749
out_c = out_c + "\t};\n"
733-
for var in field_vars:
750+
for var in flattened_field_vars:
734751
if not isinstance(var, ConvInfo):
735752
out_c = out_c + "\tcalls->" + var[1] + " = ret." + var[1] + ".this_arg;\n"
736753
out_c = out_c + "\treturn ret;\n"
737754
out_c = out_c + "}\n"
738755

739756
out_c = out_c + self.c_fn_ty_pfx + "int64_t " + self.c_fn_name_define_pfx(struct_name + "_new", True) + "jobject o"
740-
for var in field_vars:
757+
for var in flattened_field_vars:
741758
if isinstance(var, ConvInfo):
742759
out_c = out_c + ", " + var.c_ty + " " + var.arg_name
743760
else:
744761
out_c = out_c + ", jobject " + var[1]
745762
out_c = out_c + ") {\n"
746763
out_c = out_c + "\t" + struct_name + " *res_ptr = MALLOC(sizeof(" + struct_name + "), \"" + struct_name + "\");\n"
747764
out_c = out_c + "\t*res_ptr = " + struct_name + "_init(env, clz, o"
748-
for var in field_vars:
765+
for var in flattened_field_vars:
749766
if isinstance(var, ConvInfo):
750767
out_c = out_c + ", " + var.arg_name
751768
else:

liblightningjni_debug.so

3.88 MB
Binary file not shown.

liblightningjni_release.so

557 KB
Binary file not shown.

src/main/java/org/ldk/batteries/ChannelManagerConstructor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ public ChannelManagerConstructor(LDKNetwork network, UserConfig config, byte[] c
8181
channel_monitors = new TwoTuple[0];
8282
channel_manager_latest_block_hash = null;
8383
this.chain_monitor = chain_monitor;
84-
channel_manager = ChannelManager.constructor_new(fee_estimator, chain_monitor.as_Watch(), tx_broadcaster, logger, keys_interface, config, network, current_blockchain_tip_hash, current_blockchain_tip_height);
84+
BestBlock block = BestBlock.constructor_new(current_blockchain_tip_hash, current_blockchain_tip_height);
85+
channel_manager = ChannelManager.constructor_new(fee_estimator, chain_monitor.as_Watch(), tx_broadcaster, logger, keys_interface, config, network, block);
8586
}
8687

8788
/**
@@ -118,6 +119,7 @@ public void chain_sync_completed(ChannelManagerPersister persister) {
118119
need_persist = true;
119120
}
120121
events = this.chain_monitor.as_EventsProvider().get_and_clear_pending_events();
122+
121123
if (events.length != 0) {
122124
persister.handle_events(events);
123125
need_persist = true;
@@ -129,7 +131,7 @@ public void chain_sync_completed(ChannelManagerPersister persister) {
129131
return;
130132
}
131133
if (lastTimerTick < System.currentTimeMillis() - 60 * 1000) {
132-
this.channel_manager.timer_chan_freshness_every_min();
134+
this.channel_manager.timer_tick_occurred();
133135
lastTimerTick = System.currentTimeMillis();
134136
}
135137
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.ldk.enums;
2+
3+
/**
4+
* Represents an IO Error. Note that some information is lost in the conversion from Rust.
5+
*/
6+
public enum LDKIOError {
7+
LDKIOError_NotFound,
8+
LDKIOError_PermissionDenied,
9+
LDKIOError_ConnectionRefused,
10+
LDKIOError_ConnectionReset,
11+
LDKIOError_ConnectionAborted,
12+
LDKIOError_NotConnected,
13+
LDKIOError_AddrInUse,
14+
LDKIOError_AddrNotAvailable,
15+
LDKIOError_BrokenPipe,
16+
LDKIOError_AlreadyExists,
17+
LDKIOError_WouldBlock,
18+
LDKIOError_InvalidInput,
19+
LDKIOError_InvalidData,
20+
LDKIOError_TimedOut,
21+
LDKIOError_WriteZero,
22+
LDKIOError_Interrupted,
23+
LDKIOError_Other,
24+
LDKIOError_UnexpectedEof,
25+
; static native void init();
26+
static { init(); }
27+
}

0 commit comments

Comments
 (0)