start	end	text
0	10160	Cool. Hi, I'm IDK. I normally work with the I2P project, also work a little bit on IPFS.
10160	20140	And I'm here today to talk about mostly what I've been doing with, I guess, a Monero-linked project called I2P0.
22660	28180	I'm not sure how closely you guys develop with them, but I think that they work with you pretty closely.
31020	43260	Mostly about what I2P0 is, but mostly about what I did with it and what I think other people can learn from what I did with it.
43260	46040	And I call it tricky bundles.
47000	59160	So, I2P's got sort of a bunch of different distributions, and they all connect you to this overarching thing that we call the invisible internet.
59160	68900	And the core Java I2P router has this kind of... this long-standing... we all kind of sign up for...
68900	78260	where you have to install Java and a number of dependencies in advance of actually using it.
78260	95260	And it ends up being about 25 clicks from standard Windows 10 installation to having a working I2P router and browser on top of that.
95540	100660	But on the other hand, you get a whole bunch of other stuff with it.
100660	125100	And all these things are sort of intended as kind of application primitives for building things with I2P, but they also present user interfaces that can be kind of adapted to existing apps as well.
125100	131520	For example, we have a BitTorrent client, and we have an I2P tunnel and things like that.
132940	142280	But obviously, the problem with this is that it's pretty difficult to install for new folks, and that's the problem that I2P0 addresses.
143140	145040	But there's another problem.
148180	149560	Oh, man.
151360	153680	Let me back up a moment.
154940	168680	I like to refer to Java I2P as sort of the core utils of I2P in that it provides everything that you need, but not a lot of people use core utils directly.
168680	173060	They mostly use their file.
174280	179660	It's all kind of wrapped around that if it is involved at all.
182980	197220	And so it kind of begs the question, should we be building out-of-tree apps that incorporate I2P as a way of providing them with something that they need?
197220	209000	And I say something that they need because anonymity is a big part of what we do, but it's not the only thing that we can do for you.
209000	210440	A little bit more later.
211760	212800	Okay.
213240	216120	But there's a problem.
216120	227100	And the problem is this 25-step installation procedure, which, again, I2P0 solves.
230660	234180	Let me back up again for a moment here.
237520	240800	I'm not a great public speaker all the time.
245920	259860	Because I2P is written in Java, which is obviously the JVM, for it to call between non-JVM languages.
259860	280140	So if somebody wants to write their application in something a little more popular than Java these days, like, say, for at least maybe getting started, like Python, then they have to count on somebody to resolve this dependency for them.
283660	286080	And the bottom line is this...
288460	304740	because it means that most everybody who might install your app is going to fail before they even get started because they have to install I2P.
305700	320060	So, you know, I'm just reiterating a bunch of reasons what you probably already thought of that are good reasons to make something like I2P0, which you guys obviously already understand.
326910	335770	But it also elucidates something about our architecture, which is that apps and routers are not tightly coupled.
337070	360030	You join the network and your app requests resources from the network in the form of tunnels or destinations or bandwidth or whatever, but the actual interaction with the network, that's all kind of abstracted away and handled by the router, which is great, especially in the case of SAM, makes things very easy.
364590	373910	There are kind of a lot of applications that are not going to be distributed through, say, Debian main.
374190	390410	They're going to be written by people who wrote them independently, and they're going to have kind of rapid development cycles. Sometimes they're going to be distributed by anonymous people who can't maybe buy certificates sometimes.
391410	394770	And all this gets pretty complicated.
398310	413030	So I think that we should develop a new set of best practices for embedding I2P routers in apps that are not necessarily I2P routers themselves.
421300	440080	I2P0 solves this issue. It only really solves the dependency on Java issue. It doesn't actually resolve the capabilities of the I2P router in question.
442040	446560	So I took a stab at making that job a lot easier.
453440	454440	Now...
454440	475240	I'm going to talk about why this might be desirable. There are two sort of broad categories of out-of-tree I2P apps that relate to the problem in question.
475240	490720	There are ones that bundle I2P themselves and ones that don't. And there is a torrent client that bundles a whole I2P router inside of it. They release...
491660	518560	It's a complete implementation that works by linking to our Java libraries. And if you install it on a machine where there's an I2P router already, you end up with two running I2P routers, even though this piece of software actually has the capability to use the existing I2P router and thus less resources.
519200	522980	But you have to go in and do it in the advanced configuration.
527160	539300	Whether or not there's an I2P router capable of working with our app before we actually do it, or before we actually start our own embedded I2P router.
542960	545360	Got a little ahead of my slides here.
547200	560040	So how do we prevent this? Well, what we've got to do is we've got to probe for different I2P capabilities. And it turns out that...
560040	575540	There is, but I don't think any of them are necessarily 100% reliable. So I like to take into account each and every one of them in sequence here.
578100	587760	First of all, we can check and see if I2P is installed to the default paths. Obviously, this breaks if it's installed to a non-default path.
587760	599020	So we can have a little rule in there that maybe looks for it in a portable installation under a specific directory, but we can't handle every single thing this way.
599020	613060	Moreover, it doesn't actually give us information about whether I2P is running or not. It's a useful thing to know, but it is not in and of itself enough information for us to use.
614480	627100	We can look at the output of PS. It's simple enough to do on every platform. It gives us information about the installed state and the running state.
627180	640240	But it doesn't give us any information about the APIs that are available, at least not without some extra effort, really only on Java I2P as far as I know. It might not apply to I2PD.
644480	645000	But...
648280	660020	Also, some systems, GR security, will limit the output of PS by user. And obviously, if it's a service install, you can't do that there. So it's brittle there too.
662100	674040	So the next thing, and where it gets a little bit more interesting, is we check for a usable I2CP or SAM v3 port. And this doesn't have to be complicated.
674100	683680	In terms of I2CP, there aren't a lot of libraries that implement the whole specification in other languages, so you probably will end up using SAM.
686320	692600	That said, though, there's also a command line tool that will do this that I wrote as part of this project.
694420	708740	This gives you a lot more information about I2P. It tells you that it's running. It gives you the opportunity to create a destination and validate that you are, in fact, talking to who you think you're talking to.
710980	724820	That said, though, SAM v3 is not enabled by default on the core Java I2P router, so it might fail in that case too. But you'll always have an I2CP port, and that will always work.
727040	754420	And then the last thing is to check proxy.i2p. And this is just an HTTP request over localhost 4444, just like the regular Java I2P proxy uses for when you're configuring your browser, you know, taking something over cURL or whatever, to proxy.i2p, which is a loopback address.
754420	768780	And what it'll reply with is either proxy is ready or proxy is not ready, you know, tunnels need to be built, or whatever.
770980	782780	And that gives you almost as much information as talking to I2CP just for one request back and forth to validate that I2P is there.
782780	786100	And it'll work everywhere.
786400	805760	So once you've established that there's an I2P router running or not, I think that this should roughly be the default when you start your application.
805760	820020	So you should check for the presence of a running I2P router first, and then probe for the API capabilities that you want. If all you need is an HTTP proxy, only ask for the HTTP proxy.
821260	824760	If all you need is SAM, only ask for SAM.
824760	838940	And once that comes back, you'll either know whether the API is available or not, and just start your application.
838940	852420	If not, check the default paths for an I2P router that's already installed by the user before we got there.
852420	858800	If it's available, try and start it. If it's not available, go to the next step.
859680	868620	If you can't discover an I2P router, go ahead and unpack a copy of I2P0.
871700	875620	Start I2P0, then immediately start SAM.
876480	883040	Use that to establish any tunnels for your application, and I'll get to why in just a second.
884280	900740	Now, I glossed over some details in this slide about waiting for certain things to become available. I would like to let available for you to review because these are next to impossible to read on this TV, and I'm sorry for that.
903390	921730	Now, there's still a problem with this approach in terms of the resources. It's not currently possible to run SAM freestanding of either the Java I2P or C++ I2PD routers.
921730	938830	That said, though, I2P0 is pretty darn close. We can live with that for a while until unbundled SAM v3 is a working thing.
944340	954020	So what I created out of this is called Go Zero and Zero Bundle, which is a library that supports it.
954020	970000	And all it does is treats I2P0 as a static resource, handles installation, start, stop, and management on behalf of the I2P router, or the I2PD router, rather, from a Go application.
970000	992820	These also all correspond to command line interfaces, or command line interface apps, rather, that you can use to manage an embedded I2P, just about any kind of app, because we can generate a .a file and link it to a C program.
992820	1015700	It's huge. It will add some overhead to your app, so that is a bit of a drawback. But it is exactly the same overhead that you would have added in another place had you bundled I2P0 with your app as a zip, which, of course, is also valid and possible to do with Go Zero.
1017720	1039720	I2CP check is sort of a re-envisioned piece of the core utils puzzle for people who want to bundle I2P routers with their application in a zip file, in particular, I2P0.
1041880	1069700	What they do is they do this API probing and path probing to detect pre-existing I2P routers or determine if I2P routers are ready. So if you want to build a launcher script for your I2P enabled app, but don't want to actually embed it inside of the app, then you can use these to do all your discovery and API probing needs.
1070540	1082940	And then lastly, the thing that I am beginning to build with this is a replacement for a somewhat ill-fated I2P browser project.
1082940	1105120	For those of you that don't know, we attempted to build an I2P browser toward the beginning of last year, worked on it for about a year, and concluded that the Mozilla code base was moving a little too fast for us to keep up and also develop the Java I2P router at the same time.
1105120	1119840	So I spent my time looking for ways to make that process a little bit easier for us to manage, and this was part of what I came up with.
1121200	1133980	Because we're so decoupled from the applications themselves, I believe this probing is kind of a necessary process.
1136520	1140160	Actually multiple I2P routers on the same machine.
1140560	1155100	During the I2P browser process, and at the time, I was developing on an Acer Aspire C720 with 4 gigs of RAM. It was not fun. It was very challenging.
1157820	1172750	And so that was a thing that we needed that we never got around to doing in that one, which I did with this project.
1174250	1186550	I really want to see I2P0 in all the things. I want to see it in every app that uses I2P right now that does not bundle a router with it.
1186570	1201830	I think that it stands a really good chance of smoothing over our install issues, and if done properly, we don't ever have to worry about using too many resources.
1208230	1228460	And, well, I think that is about the end of what I have. If there are any questions, I can see them in the Jitsi, maybe?
1234880	1237920	Yeah, thank you. Thank you so much. I'm looking to see if there's any questions.
1237920	1247220	I don't see any on YouTube or IRC. I also don't see them on Discord either.
1248280	1250580	It looks like it was pretty self-explanatory.
1252140	1262200	Yeah, nothing too complicated here. Very useful from my point of view, but nothing terribly complicated in this presentation.
1265000	1267400	Got it, got it.
1270600	1279580	Okay, I guess, how familiar are you with the efforts to integrate I2P in Monero in a deeper level?
1279580	1291920	I know it's integrated through I2P0 with the Monero daemon and Monero CLI to some extent.
1291920	1295500	Are you aware of those efforts? Do you communicate with anyone that works on those projects?
1295500	1303740	I've been seeing myself with those efforts, I would say.
1303800	1313920	I've been getting myself more familiar with them over the past two months as our browser project is kind of...
1314340	1322280	well, my browser project at this point. It's a mistake to identify it with I2P exactly at this point.
1322280	1324780	This is something I did on the weekend.
1325500	1332500	But yeah, I've been familiarizing myself with the process there, and I think actually the...
1335360	1341300	to making some suggestions. It could be scripted already.
1342500	1349380	But I'm not sure that that's something that is something that people want to do yet.
1351320	1352500	Okay, cool.
1360210	1363350	I don't see any other questions coming in.
1366160	1368580	Do you normally post your slides anywhere?
1370600	1377700	I don't have them up yet, but I will put them up as soon as the presentation is over. I got to reboot this other laptop.
1381980	1387760	Got it, got it. I'm wrapping up my trivia thing that's on right after this. I'm writing a last final question.
1391040	1394180	Let's see. Okay.
1437880	1442500	All right. Well, if no one else has any questions, we gave it a bit of time.
1442740	1447040	Well, then I'm going to say thank you so much, IDK, for joining us.
1447040	1449960	It was great to have you describe what you've been working on.
1449960	1454100	And it's always good to hear what other privacy projects are going on.
1454100	1459280	I know it was really useful for me to have known what I2P was before I learned about crypto,
1459280	1462520	because we've had these decentralized systems out for a while.
1462520	1466220	And sort of people are like, oh, Bitcoin is the only decentralized thing.
1466220	1471100	And they kind of forget everything else exists in a comical sense.
1471940	1479740	I think the community can definitely learn a lot from looking at I2P, just because you've been around forever.
1479900	1489880	Yeah, almost. If it were a person, we could vote. It's about 18 years now.
1489880	1491660	Crazy, crazy stuff.
1492640	1494320	All right. Well, thank you so much.
