Rusty Russell's avatar
Rusty Russell
rusty@rusty.ozlabs.org
npub179e9...lz4s
Lead Core Lightning, Standards Wrangler, Bitcoin Script Restoration ponderer, coder. Full time employed on Free and Open Source Software since 1998. Joyous hacking with others for over 25 years.
Paused my reading of The Mandibles for Xmas day: It's not exactly holiday reading. It's one thing to know nothing stops this train. It's another thing to read through a detailed description of what the slow inevitable crash looks like: It's like the right brain equivalent of When Money Dies.
Rusty Russell's avatar
Rusty Russell 2 weeks ago
Since I'm taking a few weeks vacation, I've decided to seriously try to learn rust. My method in this case is to ask ChatGPT to guide me (but not write for me!) a library ("crate") that I've always wanted to write and never got around to. Of course, I get a lot of feedback on appropriate rust styling, but some of it veers into things I feel are deeper constraints. In this case, I had an open function, which took a struct containing some flags, such as "writeable", "create if didn't exist". It didn't like the fact that I asserted if you set create and didn't set writeable. Here is my response: --- Re: assert!(). I dislike APIs which allow misuse. Callers of a library should not rely on such checks in the library, in fact the concept of adding an InvalidOptions error type is offensive. A recoverable error is strictly a worse api than an unignorable error. But a compile time error is better. We should use an enum READONLY, WRITE_MUST_EXIST, WRITE_MAY_CREATE. --- Of course, it's a waste of time for me to lecture it on style, but I can't help myself!!
Rusty Russell's avatar
Rusty Russell 3 weeks ago
Happy VPN-day Australia, to those kids who celebrate!
Rusty Russell's avatar
Rusty Russell 1 month ago
Seriously considering putting two RTX 6000 in my upcoming build machine. Puts the price up an order of magnitude, but truly private AI might be a worthwhile investment. Never played with GPUs before, so informed thoughts welcome?
Rusty Russell's avatar
Rusty Russell 1 month ago
With my bike being repaired, I've been doing more walking. Australian cities are really optimised for driving, but I must say it gives me a lot of time to reflect on broader issues, probably a decent way to increase my nostr posting!
Rusty Russell's avatar
Rusty Russell 1 month ago
@Jameson Lopp recently posted on X about the danger of "store and forget" for Bitcoin over decades. Unfortunately he's right. Originally I stored my raw private keys and UTXOs (on paper, care taken) figuring that was standard. Then bitcoin core stopped supporting them! Other wallets tend only to support them for sweeping, and I wonder how long. If I were storing funds today I would use BIP39. BIP93 is cool and more general, but not widely supported, and I don't know what support will look like in a decade.
Rusty Russell's avatar
Rusty Russell 1 month ago
Christian Decker made a side comment on my PR about a potential further optimization for Postgres. I spent an hour on it, trying to get it to fit in our db API. Since my wife was out with friends last night, so I dived into the implementation in earnest after the kids in bed. Man, this is a horrible API which forces you to understand the design and history of PostgreSQL. Until v14, the async API only supports one request at a time. (Surprise!!) You must explicitly turn on pipelining. Then you get one or more responses per request, with NULL between them. This is because you can have multiple SQL statements per string, or other modes which split responses like this (?). You can no longer use non-pipelining APIs, once you turn this on. You can't use PQsendQuery in pipeline mode. You need to use the lower level PQsendQueryParams with NULL params. This is documented as literally "You can't use this in pipeline mode" without explanation (the docs otherwise imply it's just a convenient wrapper). This is why you should always check your error returns! And your code will still block forever. You need to explicitly flush the pipeline, otherwise it's cached locally. There are multiple different APIs to do this, and I'm not sure which to use yet. Also, if you get an error in a SQL query, you need to drain the pipeline, turn pipeline mode off and on again. Finally, the documentation warns that you are in danger of deadlock unless you turn on non-blocking mode. This makes some sense: the server won't read more commands if you're not reading, but I would prefer it to buffer somewhere. This whole API seems to be implemented by and for people who have deep familiarity with PostgreSQL internals. Hope the latency gain for CLN is worth it!
Rusty Russell's avatar
Rusty Russell 2 months ago
I think I got nerd sniped into implementing online compaction for CLN's gossip store. Mainly from people agitating that we should use a DB for gossip messages. This will speed startup and reduce memory usage. And it's only going to take me a couple of days' work, depending on how many side-cleanups I do. It can be hard to tell a flawed implementation of a good idea from a bad idea. But trust me, this is gonna be great!
Rusty Russell's avatar
Rusty Russell 2 months ago
I think finding a bug where printf("%*.s") was used instead of printf(".*s") was the point at which I realized that some C issues cannot be mitigated with better tooling...
Rusty Russell's avatar
Rusty Russell 2 months ago
I hate price talk, but if you're going to do it, please understand that "market cap" is a very rough *ceiling* on current value. It's neither the amount of money which has gone in, nor the amount of money which can come out. So the order of magnitude is useful to compare against other assets. But abusing it in terms of profits and losses is a category error, and I assume done mainly because it's so easy to measure. Grump over.