Applications Google
Menu principal

Post a Comment On: Moron Lab

"Urbit: functional programming from scratch"

43 Comments -

1 – 43 of 43
Blogger Matthew said...

Herakleitos would approve.

January 14, 2010 at 9:20 AM

Blogger newt0311 said...

Moving to a more practical subject, may I suggest Google Wave as the starter to Urbit. It is a distributed document update system which seems like it can be worked into a distributed document storage system.

January 14, 2010 at 10:49 PM

Blogger C. Guy Yarvin said...

Google Wave is an extremely fine piece of technology, though I'm not yet clear on its social uses. Also, the operation-rewriting distributed-editing algorithm it uses (I forget the exact terminology), is an excellent example of a difficult protocol to implement. A lot of work seems to have gone into both this and the UI.

However, I would not call GW "distributed," because it has no decentralized or mobile state - at least, that is externally visible. Your Google Wave wave is sitting on a (logical) server somewhere, collecting everyone's wavy little dribbles of thought as generated by their browsers - precisely like any other Web app.

I think GW is best compared to a simpler piece of technology - the revision-control server. This is also in the Urbit ballpark, perhaps closer.

A source-code control system is not exactly a static functional namespace - or, at least, not a very powerful one, because not capable of general-purpose programming. Mercurial is not an application server; Urbit could easily be used as a revision-control server. However, the static namespace is already there and quite useful.

January 15, 2010 at 6:00 AM

Blogger newt0311 said...

Indeed. We need to work on access as well.

Heck, the closest analogue to Urbit right now is probably DNS. If we increase payload size from a few bytes to a few megabytes and then add authentication on top, we would basically have what VJ was talking about in a broadcast system. The biggest problems left then would be the centralized DNS root servers.

January 15, 2010 at 6:28 AM

Blogger Stanislav Datskovskiy said...

Your intended target resembles my own: a globally-unified cache hierarchy.

My aim is for RAM to be purely a cache of disk (in an entirely user/programmer-transparent way) and disk in turn will behave merely as a cache of a global address space. Fetch what you like, read/execute that which you can decrypt.

Distributed Hash Table plus trust metric for the namespace. In fact, abstract over the mechanism for distributed storage, distributed namespace control, and distributed-everything-else with a general-purpose multiparty computation protocol (http://en.wikipedia.org/wiki/Secure_multi-party_computation).

The following will probably sound far more critical than I intend it to. In general, I am a long-time fan of your work - under each of your names.

Algebraic types and immutability: Yuck. Your Haskellian / type-theoretical mis-spent youth is showing. Actual computers contain rewritable storage and will likely always contain it. This is something to be celebrated, not a set of genitalia to be shamefully hidden behind a Christian fig leaf.

http://www.lisperati.com/landoflisp/
Read to the end.

It appears that you have bought into one of the more damaging fallacies peddled by the bureaucrats who replaced computer scientists (as per your excellent essay): that mathematical process can be substituted for genuine understanding, if only we adopt some "hair shirt" paradigm of computation. In reality, there is no substitute for the ability to load a system entirely into one's head and understand it as you might understand arithmetic.

"Jets" are the proverbial "Sufficiently Smart Compiler." The seal between a core of Maxwellian purity and the world of filthy expedient compromises which lies outside must be absolutely perfect - like the seal on the airlock of a multi-generational starship. In fact, building the airlock at all is a terrible idea. Anyone who whines about being welded into the hull doesn't belong on the journey.

Think of every high level language with a C FFI you've used. Having the FFI is not harmless. It colors the programmer's thoughts. It destroys the Master-Of-All-I-Survey majesty of the entire system. Another way must be found. The foundational abstractions must be high-level: http://www.loper-os.org/?p=55

Cutting to the chase: working around the physical limitations of the actual electron-pushing aspect of computation has introduced a flood of ugliness. Your formalism is beautiful, yet it makes no mention of how to prevent a repeat influx of The Ugly. One of us will have to give a (constructive) proof that this is in fact possible.

Right now my bet is on you making it to the finish line first - I started from the (current, artificial) bottom (x86-64) and ended up falling through the floor, mucking about in the underworld of Verilog, clock generators, logic analyzers, and other distractions. And solder rots the brain. On the other hand, a top-down approach risks a Haskellian fate.

January 15, 2010 at 7:52 AM

Blogger C. Guy Yarvin said...

Stanislav,

Thanks for your intelligent comment! You would be amazed at the number of people I've met who have built or imagined something vaguely like this. Urbit is a combination of very well-known ideas, which for some reason I've never seen all together in one place. I encourage you to try the Nock challenge - I suspect you'll enjoy it.

I've also enjoyed a few of your essays. I agree with you that all other software sucks.

I take exception, however, to the inference that any of my misspent youth was misspent on Haskell! I actually do not know Haskell. I also do not know any dialect of Lisp. (I did take one Lisp class, 20 years ago, at Brown- hated it, forgot everything.)

I am actually an OS guy by both training and expertise. And my ignorance of all existing FP systems is intentional, I assure you, rather than indolent. Am I here to praise Caesar? Is FP, to date, a success? You see what I mean.

So when I say "type inference" or the like, all I mean that when I generate Nock from Watt, I first compute

Watt(src) => gene

Mill(type gene) => [type formula]

then can run

Nock(subject formula) =>product

This is the entire formal toolchain. You will see that Mill, the Watt-to-Nock miller, takes a type and a gene, the latter obviously being some kind of AST, and the former being the type of the subject. It produces a type and a formula, the former being the type of the product, and the latter being Nock - ie, "functional assembly language," if you will.

So, if this interface for the Mill function strikes you as inherently mathemolatrous, by all means, continue to assume that I misspent my youth on Haskell! You'll be wrong on both.

In fact, if I had to write "hello, world" in Haskell to avert the death penalty, it would take at least a look at the tutorial. If Haskell supporters admit that Haskell has failed, apologize for inflicting on the world, and agree to at least consider defecting to Urbit, I will apologize for this ignorant attitude. Obviously, a lot of fine work has gone into Haskell. A lot of fine work has gone into a lot of things. It has not necessarily made them fine.

As for jets, yes: they can be screwed up. It is simply taboo to make a system call within a jet. If the OS would let you discard privileges (or has VM instructions that will let you), you could prevent this perfectly and run foreign jets. Otherwise, I would not advise this.

But basically, what you're doing when you write a C jet to accelerate a Watt function: writing your program twice in two different languages. Within a system that is very well-placed to compare the two. If you jet-propel something, it is probably important and should therefore be double-checked. I've found this really quite convenient.

Also, it's not at all the case that you can't write a Maxwellian C interpreter within an Maxwellian functional language, such as Urbit. If you then jet-propel that interpreter, it can be made quite fast. Then, fast machine-level execution requires no other jets - which puts you even farther away from that cursed FFI (foreign-function interface).

Finally, please don't assume that I'm the same person as my good friend Mencius! Some personal blogs pretend to be group blogs. For others, it's just the other way around. Who knows what lurks in the shadows of the Internet? Perhaps it should continue to lurk there...

January 15, 2010 at 11:38 AM

Blogger C. Guy Yarvin said...

newt,

You're quite right - the most important work is protocol work. This comes in two parts: the internal structure of the card itself, and possible networks for routing cards (plus envelope).

For the latter, I think, some kind of hash chording is ideal. Chord networks are very well-known and very resilient. I have no special insights in this area.

The former starts with identity and cryptography, then percolates up into the application layer. Here my designs become rougher and a slight vaporous quality appears.

January 15, 2010 at 11:41 AM

Blogger C. Guy Yarvin said...

Stanislav,

I should add, on rereading your comment, that it's not just that one can write a C interpreter in Watt. Rather, one can write an x86-64 interpreter in Watt (and a C compiler in Watt). A jet implementing the latter has a number of very effective ways to do it - especially given the new virtualization instructions.

At least, if your CPU is an x86-64! And even if this is somehow screwed up, machine-code translation is not *that* bad.

Thus can we mount into the clouds on wings of nouns, yet wallow with the eagles in the biker bar of machine code. We're so abstract, we're actually concrete. The solder reappears.

How does this virtual CPU work? Just take a really king-sized atom, and call it an address space. Take some smaller ones - call them registers. Then, write a step function. If you can't do this and have the result turn out right, the CPU is poorly defined. It probably isn't.

It doesn't matter how impractical your specification of this virtual CPU is - the definition just has to be correct. Such a function will never be run naively except in testing. A virtual CPU will always come with its own custom jet.

January 15, 2010 at 11:50 AM

Blogger Stanislav Datskovskiy said...

C. Guy Yarvin said:

How does this virtual CPU work? Just take a really king-sized atom, and call it an address space. Take some smaller ones - call them registers. Then, write a step function.

I have a suspicion that the entire scheme is vulnerable to Gödelization.

More later. I promise.

January 15, 2010 at 11:54 AM

Blogger newt0311 said...

@Yarvin,

I am not sure a linear chord is the best of technologies. It is too inflexible (for one thing, peers do not decide which documents they are going to archive).

An adaptive algorithm like the routing algorithms we have today seem much more suitable.

A card could simply we a fixed-size immutable chunk of data. Every card "creator" gets a unique 128-bit ID (whose lookup can also be distributed) and can use any of a 128-bit address space for the fixed size immutable cards. These static cards can then be used as the building blocks of a dynamic name-space.

January 15, 2010 at 12:25 PM

Blogger Unknown said...

Ahem. Teaching a cryptography course in Budapest does not make me a CS professor. :-)

P.S. I do know some people who did solve your challenge but didn't bother to submit it to you.

January 15, 2010 at 12:26 PM

Blogger Unknown said...

I still don't like the fact that Nock relies on arbitrary-precision integers and yet cannot do anything with them except for checking for equality and incrementing. This means that real software without jet-power might not even be possible to run once.

I stick by my original proposal: let atoms be bits and let the selector take lists of bits (e.g. nouns like [0 1 1 1] instead of atoms like 14).

This way, raw Nock shall be sufficiently powerful to play with, even if you still need jets to make some things sufficiently fast for whatever purpose. What this means in practice, that for many-many tasks we can skip the tedious work of writing jets; just compile our stuff to raw Nock and run it.

Also, I abhor any idea of digital feudalism. One Verisign is already too much. There is a better solution to Zooko's triangle:

Cryptographic hash suffixes: the identifiers are long (e.g. 256-bit) numbers, BUT you are allowed to use any suffix thereof assuming the security risks that come from that. In practice, 64 bit suffixes will almost always do and they are:

1. Not much more taxing on the human brain than telephone numbers.
2. Sufficiently secure against casual pre-image attacks.
3. Sufficiently unique for large numbers of named entities.

January 16, 2010 at 12:16 AM

Blogger C. Guy Yarvin said...

I still don't like the fact that Nock relies on arbitrary-precision integers and yet cannot do anything with them except for checking for equality and incrementing. This means that real software without jet-power might not even be possible to run once.

Correct - real software without jet-power is not even possible to run once. I don't see how restricting atoms to 0 and 1 would help with this! Alas, real software with a 1-page interpreter will probably always be a pipe dream.

The question is whether you trust your jets. Once you trust your jets, you start forgetting that they're there. Logically, they're not. But do you trust your jets?

Indeed, a bad jet can really screw you up. The worst failure mode is one in which the Nock formula is *not* working as intended, but the C code *is*. When this happens you start drifting away from Maxwellian computing, very fast.

To avoid this horror, my interpreter has not a jet-propulsion switch but a jet-propulsion knob. So at -O0, you are running pure Nock. At -O1, dec is jet-propelled, but add isn't. At -O14, parsing is jet-propelled. And so on.

January 16, 2010 at 9:06 AM

Blogger C. Guy Yarvin said...

P.S. I do know some people who did solve your challenge but didn't bother to submit it to you.

Fortunately, they're not too late!

January 16, 2010 at 9:08 AM

Blogger newt0311 said...

@Yarvin and Daniel

It seems like jets are an indication of a fundamental problems with Nock. Nock does not reflect the underlying reality of the machine.

Either use something that is closer to assembly (and therefore may be slightly impure but at least doesn't need to be tainted by jets) or redesign the machine to evaluate Nock effectively.

Right now, you are writing the program (any program) twice effectively. Yes, this is only in the compiler but that is just like using a library. The first time, written in the pure Nock fashion is not even used and the second time, which is used is "impure" so whatever benefit Nock provided is lost. Without a guaranteed means of verifying the equivalence of the two blobs of code, Nock is just a very expensive waste of time.

January 16, 2010 at 9:17 AM

Blogger C. Guy Yarvin said...

Also, I abhor any idea of digital feudalism. One Verisign is already too much.

But two Verisigns would be better than one, n'est ce pas?

I agree that there's something terribly wrong with the Verisign model. If you can conceptualize what's wrong with it, it might help you consider alternatives.

In practice, 64 bit suffixes will almost always do

I would say that cryptographically, 128-bit suffixes will almost always do. 64 makes me nervous, as does the word "casual." But hey, you're the crypto man.

The problem is: 64 isn't good enough. From the user perspective. From the user perspective, you really start cooking with gas when you get down to 32. Fingerprint suffixes will no longer do.

So the solution is: both. Identities above 2^64 are 128-bit hash suffixes ("wild"). Identities below 2^64 are assigned feudally ("civil").

Urbit has both its city and its barbarians. The existence of wild identities helps keep the civil sphere honest - ie, if it degenerates into a digital despotism, everyone who wants to remain free just has to remember longer names. Of course, there are a number of other safeguards...

January 16, 2010 at 9:20 AM

Blogger Stanislav Datskovskiy said...

newt0311 said:

or redesign the machine to evaluate Nock effectively.

I'm about to try implementing a Nock processor in an FPGA. This promises to be entertaining.

January 16, 2010 at 9:23 AM

Blogger newt0311 said...

@Stanislav

It will be. How do you plan on handling memory management?

January 16, 2010 at 9:24 AM

Blogger C. Guy Yarvin said...

newt,

The jet isn't really "impure" in the functional sense, because it doesn't have side effects. In fact, it needs no OS privileges - just a block of memory.

Yes, you are writing your function twice! I have done quite a bit of this, so I can speak to the experience. The result is (a) not twice as much work, and (b) much more than twice as reliable.

Moreover, you don't have to do this in ordinary programming. You have to do this where, in a non-Maxwellian environment, you'd just write a native method. Even Java would probably be improved if all native methods (that were native only for speed, not for system calls) had to come with a parallel specification in pure Java.

Nock is actually not that hard to compile to machine code, I think. At least, relative to other languages in its class. However, this is a significant engineering project which I'd rather not have in the critical path. Slow interpreters with optimized library routines are well-known to be viable...

January 16, 2010 at 9:32 AM

Blogger C. Guy Yarvin said...

Without a guaranteed means of verifying the equivalence of the two blobs of code, Nock is just a very expensive waste of time.

Well, a guaranteed means is a lot to ask for! Mathematically, I mean. However, if you dial optimization down and run the Nock formula, the jet still runs. And its result is compared to the formula's result.

So if ya want verification - that's a research project. However, if you can be content with mere testing, this process will test your code quite unobtrusively and effectively.

January 16, 2010 at 9:38 AM

Blogger newt0311 said...

@Yarvin

The jet isn't really "impure" in the functional sense, because it doesn't have side effects. In fact, it needs no OS privileges - just a block of memory.

Without a new OS (and even with perhaps), the above simply cannot be verified. Unless you are the only one writing jets, your solution is unsatisfactory.

Even Java would probably be improved if all native methods (that were native only for speed, not for system calls) had to come with a parallel specification in pure Java.

Believe me when I say that Java does not have many of these. Most Java methods which do not need system calls are in Java. However, the reason they can do this is because JVM bytecode can be run efficiently on x86 computers.

Nock is actually not that hard to compile to machine code, I think. At least, relative to other languages in its class.

The entire class is nearly impossible to work with. Even GHC takes a few short-cuts from pure lambda calculus and whether you like it or not, GHC is the closest that you are looking at here.

Slow interpreters with optimized library routines are well-known to be viable...

Interpreters can not run themselves like compilers can compile themselves.

However, if you can be content with mere testing, this process will test your code quite unobtrusively and effectively.

If testing is all that Nock gives, it is a worthless idea. Testing can be done quite well without Nock. Everybody knows what they want their program to do. The problem is making sure that the program actually does it. Testing is what everybody does today and clearly (according to you), it is not sufficient.

Example: If you want to jet a parser, the testing better have damn good coverage. Far better to have an automated system of parser generation and then be able to define a parser in a few lines.

In an earlier post:I would say that cryptographically, 128-bit suffixes will almost always do.

Famous last words.

Actually, from the user perspective, anything in terms of bits is too much. Notice now that nobody remembers a slew of phone numbers. They remember a bunch of names (sometimes) and use a mapping to go back and forth. The same applies to the internet.

The same solution is needed for Urbit (that is why I wanted to use Urbit as the base layer and build a dynamic file system on top). Assign identifiers with whatever number of bits you want (enough so that we don't run out) and then make a mapper back and forth. Digital feudalism will work quite well here as it has worked for DNS and IP addresses (which are pretty much exactly the same problems -- uniquely naming entities). If people want a strong identity match, they will have to contact the entity and get some keys themselves. This can be done through the web of security that VJ talked about. In practice, I think that this will be almost equivalent to the digital feudalism idea (unless I am misunderstanding your digital feudalism idea which is quite possible) but slightly better because there is some verification.

January 16, 2010 at 9:59 AM

Blogger Stanislav Datskovskiy said...

newt0311 said:

How do you plan on handling memory management?

For now, something like the usual cons cells (like the SCHEME79 chip.)

January 16, 2010 at 10:10 AM

Blogger newt0311 said...

@Stanislav

Good luck.

January 16, 2010 at 10:46 AM

Blogger C. Guy Yarvin said...

Example: If you want to jet a parser, the testing better have damn good coverage. Far better to have an automated system of parser generation and then be able to define a parser in a few lines.

By "parser" I actually mean "metaparser," ie, a function whose arguments are a text file and a constructive grammar. So, yes. It's this that gets the jet. It's not your grammar that gets the jet, because the typical formula in the grammar is just doing some consing.

Everybody knows what they want their program to do. The problem is making sure that the program actually does it.

Well, what you're testing is that two programs are equivalent. You could have written the same bug twice - but that's a lot more unlikely.

There are two ways to test: with two programs, and with one program and a bunch of hand-checked test cases. I prefer the former.

Actually, from the user perspective, anything in terms of bits is too much. Notice now that nobody remembers a slew of phone numbers. They remember a bunch of names (sometimes) and use a mapping to go back and forth. The same applies to the internet.

Consider the way Facebook does it. There are three Facebook identities: the ID, a number that appears to be about 32 bits; the real name, which is not unique; and the username or handle, which is unique and first-come first-served.

The Facebook ID is not memorable, as such. However, it's straightforward to write a function which invertibly maps a 32-bit number to a string which *is* memorable. I've done this. The function could probably be improved, but here are some random examples:

176.215.16.104 == "divzip-dibbel"
30.122.0.74 == "pobmol-dabmek"
149.229.247.52 == "nitvas-siztif"

Not exactly high technology. But you'll see that the latter is a lot more memorable than the former - not as memorable as a human name, of course, but not too far from a classic handle such as "monkey79." And unlike either, it does not require a central directory.

Now, on top of this namespace, you'd certainly want to maintain a *real* namespace that would bind human names to these entities. There's no substitute for human names. However, if you have a numeric identity which is significantly more memorable than, say, phone numbers, you have a simple, solid layer on which to build a human name directory at a higher level.

Human names are the most memorable. But managing human names, both individual and corporate, is a huge business problem. If you have a lower-level identity system which is usable, clean and simple, you have a good substrate on which to build the higher-level names.

This is why Facebook started with IDs and built human names above it, then added usernames. My guess is that if Facebook could make IDs more memorable in this trivial way, usernames would not be needed.

But, of course, Facebook IDs make you basically a serf of Facebook. No one should have to be a digital serf...

January 16, 2010 at 11:14 AM

Blogger C. Guy Yarvin said...

Stanislav,

I'll second that - FPGA nock would be mondo cool. Of course eventually it will need FPGA jets, as well. Unfortunately, my hardware chops are almost nil, so I really have no other advice! Still, the beauty of a small spec is that it needs no guru...

January 16, 2010 at 11:17 AM

Blogger newt0311 said...

@Yarvin

There are two ways to test: with two programs, and with one program and a bunch of hand-checked test cases. I prefer the former.

Then why bother with Nock? It is quite possible (and easy) to make a human understandable language with easy semantics -- scheme being one possible example. Then the scheme version can be tested. Of course, there is an even better solution -- the scheme version can be compiled and testing is not necessary. Mathematical equivalence in that is case is indeed guaranteed by the compiler.

As to your "memorable" 32-bit numbers. They don't seem to help. Also, the routing framework which helps to find the number is much more an overlord than the name-resolution system. If somebidy is really so worried about the naming system, they can come up with their own registry as a person can now (try to) do with IP addresses and bookmarks.

January 16, 2010 at 11:43 AM

Blogger Unknown said...

Two Verisigns are not viable: the second will be bought up by the first in short order, because one is more profitable than two. Hence Thawte's acquisition.

But why not use suffixes (or prefixes) of wild names and let people decide how long a suffix they want to use? PGP got it right with the fingerprint (160 bits), the long ID (64 bits) and the short ID (32 bits). Yes, I can generate a key that matches anybody's short ID, but they can always fall back to using longer IDs, so I won't bother attacking even 32-bit names, but they can (and do) collide by accident as well. Now, 64-bit ID's are substantially more difficult to attack (requires huge botnets or specialized hardware), and they do not collide by accident. And still, you can always fall back to the fingerprint.

Now, this same idea can be generalized by letting people use arbitrarily long suffixes (or prefixes) of their wild names. Spanish aristocrats have done so quite successfully. Also, for most students of cryptography Al-Kindi means Abū Yūsuf Yaʻqūb ibn Isḥāq al-Kindī even though there have been quite a few Al-Kindi's out there.

January 16, 2010 at 1:12 PM

Blogger Unknown said...

I like the knob idea, but the problem with Nock is that you cannot fully turn the knob to raw Nock, because it won't execute once in the programmer's lifetime. Hence my suggestion with binary atoms.

January 16, 2010 at 1:16 PM

Blogger C. Guy Yarvin said...

I'm not a PGP geek, and I've never seen either a 32-bit, or I think a 64-bit suffix, in the wild. I didn't even know they existed. Thank you for explaining them - I now know how they work, too.

In the PGP context, these short IDs are pretty cool. In the Urbit world, they don't really work, and here's why.

The trouble with this approach is that the suffix is (in many cases) enough for verification of an identity that is already communicated through another channel. But it is not enough to serve as the root of a namespace.

If you can say "/id/file," id needs to be unambiguous - not only can collisions be attacked, but even resolution becomes very problematic.

January 16, 2010 at 4:57 PM

Blogger C. Guy Yarvin said...

I like the knob idea, but the problem with Nock is that you cannot fully turn the knob to raw Nock, because it won't execute once in the programmer's lifetime.

Sure you can - this is a stateless system, after all. It doesn't have to boot. You can't process packets and resolve names, but you can turn the knob to raw Nock and test add, multiply, etc.

There's also a lot of opportunities for metacircularity in this system. Nothing stops you from writing a raw Nock interpreter within a jet-propelled Nock environment.

(Normally even metacircularity will be accelerated, though. For example, one thing I think we'll see at the Urbit level is Nock with an extra operator 7 - dereference Urbit path.)

January 16, 2010 at 5:03 PM

Blogger newt0311 said...

@Daniel

The User IDs are not designed to be a security measure (at least not anymore). The cryptographic (and nearly impossible to fake) hash signatures are. If you rely on the 32 or 64 bit IDs for validating keys, you have a problem.

@Yarvin

Why mix identification and validation?

Any organization has a unique ID and a certificate with lots of identifying information and a cryptographically secure signed hash liking the organization to the ID. There is no need for there to be a link between the keys an organization uses and the ID it has. IMO, such a link is a terrible idea. What happens when an organization wants to revoke a key but not its ID or vice versa?

What is the point in creating this useless link?

Also, I think my last comment was approaching the heart of my problem with Nock: what is the purpose? Yeah you find it aesthetically pleasing but so what? Nock isn't useful to program in because it is too low level. It is not useful as an IR because it is too far from machine language. It exists in limbo as a marginally interesting CS project. VJ's idea of broadcast documents is very much possible without Nock. Heck, it is quite doable in our current ecosystem of URIs and protocols (modulo network externalities).

January 16, 2010 at 8:00 PM

Blogger Unknown said...

@newt: But we are talking about references here. Also, you can safely rely on 64-bit IDs for validating keys as long as the value that you are protecting is less than the cost of the attack, which is actually quite often the case. As long as it is the user's choice, it's not a problem.

For example, suppose that weather forecasts are signed with some key. I am perfectly content with referring to that key by its 32-bit ID, because there is very little risk involved on my part. Other people, who rely on those weather forecasts for some economic activity, might be more cautious as to what they accept, so they might go up with the bit count.

January 17, 2010 at 12:29 AM

Blogger newt0311 said...

@Daniel

If that is all you need, use X.509 certs. They are relatively easy to get -- only a few dollars per year (which for an organization is a pittance) and the risk from a central authority is far far lower than the risk of forgery from a 32 or 64-bit ID.

PGP is quite capable of using X.509 certs seamlessly.

If you have a friend, then exchanging verified certs should be easy and you can sign the certs yourself.

January 17, 2010 at 12:47 AM

Blogger Unknown said...

@newt: That's absolutely unacceptable. Actually any amount of money is unacceptable for identifiers.

January 17, 2010 at 6:12 AM

Blogger C. Guy Yarvin said...

For example, suppose that weather forecasts are signed with some key. I am perfectly content with referring to that key by its 32-bit ID, because there is very little risk involved on my part.

Exactly. The trouble is that this works when you're trying to validate a weather forecast that you've referenced by other means. When you're trying to find the data from the name, however - dereferencing /ID/weather - teh ugly emerges.

VJ's idea of broadcast documents is very much possible without Nock.

Yes, it is! However, if you're trying to standardize a *functional* rather than a simply passive namespace, you need to standardize functions. This is the purpose of Nock, in two words: standardizing functions.

As for Nock as an IR, this will be a lot clearer once you can see and play with Watt. IR is a very general term. Nock should not be confused with RTL, but it is definitely intermediate and it's definitely a representation.

January 17, 2010 at 9:52 AM

Blogger C. Guy Yarvin said...

Two Verisigns are not viable: the second will be bought up by the first in short order, because one is more profitable than two. Hence Thawte's acquisition.

I missed this comment and need to respond to it.

What's unacceptable (to me) is monopoly or near-monopoly ownership of a namespace. I'm not opposed to paying for identifiers, because any sort of short identifier experiences contention in a successful system; that contention needs to be resolved; it can only be resolved economically.

Moreover, not only is there no real contention for wild identities, there is even no real contention for 48-bit identities. Contention only begins at 32 - and it only begins once the system is quite successful. For the foreseeable future, even short identities are free (as in beer).

So: let me answer your question. If you have two, the pressure to amalgamate is great, because one has monopoly power. If you have, say, 255, however -

Small amalgamations do not confer any monopoly power. To become Verisign, you need *all* 255. This is quite difficult to acquire, especially if the 255 are distributed widely and among holders with benign (ie, non-mercenary) ulterior motives.

Such as EFF. If EFF had had Thawte's rootkey, would it have sold out? Highly doubtful. The trouble with browser rootkeys is that the system evolved in a ridiculously ad-hoc manner - nobody was actually trying to design a stable oligarchical regime that would not collapse into a monarchy.

Not that monarchy is the end of the world. But oligarchy is far more desirable from the user's point of view. And since there is contention, anarchy is not an option - someone has to rule.

January 17, 2010 at 10:03 AM

Blogger newt0311 said...

@Yarvin

Yes, it is! However, if you're trying to standardize a *functional* rather than a simply passive namespace, you need to standardize functions. This is the purpose of Nock, in two words: standardizing functions.

Except, there is nothing about Urbit that is defined in terms of what it does internally. All we need to know it that Urbit, somehow implemented, when given a card and a deck returns some information and that upon addition to the deck, still returns the same information. How the urbit function goes about doing this seems rather irrelevant. You yourself said that how a computer acts is up to itself. As for the "deck", it seems better seen as a massive bitstream that we lesser mortals like to call "software" and "the internet." We need know no more.

January 18, 2010 at 12:13 PM

Blogger C. Guy Yarvin said...

It's quite essential what the function is - if you want to move your deck from one hosting service to another! After all, it's not really a proper migration if it doesn't mean the same thing in the new place as the old.

You'll observe that standardized, general-purpose hosting is one thing a lot of people want, but none of them seem to have...

January 19, 2010 at 2:43 PM

Blogger newt0311 said...

@Yarvin

Then what exactly is AWS, Rackspace, etc...?

We do have a standardized functional language -- x86 and x86_64.

January 19, 2010 at 2:47 PM

Blogger C. Guy Yarvin said...

Sorry - the word I was looking for was "portable."

Have you ever called AWS and asked them if they could port your image over to Rackspace? If the answer is "no," ask to speak to the manager. :-)

Moreover, an x86-64 virtual server in the sky, even if AMI or some other virtual image format could be standardized, is about the most cumbersome and unmanageable thing in the world. The difference between it and Urbit is like the difference between a tank and a car. "Let them drive tanks" is not a valid objection to my plan to build cars!

January 19, 2010 at 3:02 PM

Blogger newt0311 said...

@Yarvin,

Have you ever called AWS and asked them if they could port your image over to Rackspace? If the answer is "no," ask to speak to the manager. :-)

Good point. However, that seems like a problem that will be fixed in time.

Moreover, an x86-64 virtual server in the sky, even if AMI or some other virtual image format could be standardized, is about the most cumbersome and unmanageable thing in the world.

First off, AMIs are already standardized. You can even download them off of S3 if you are interested. Its a self-contained (efficient?) compressed set of files which tell Amazon systems everything needed to run an instance. AFAIK Amazon uses Xen which is sufficiently standardized to be available to anybody who runs linux.

The probable (to me) reason we don't have a standard format for machine images is that the market simply isn't large enough for this.

Also, do you have any guarantee or argument whatsoever for asserting that Nock decks will not be similarly cumbersome? Nock code is certainly more cumbersome than ASM and machine code which doesn't bode well.

January 19, 2010 at 5:32 PM

Blogger C. Guy Yarvin said...

I agree that something like AMI can be standardized. However, this is simply not a *consumer* interface to the cloud. It is an industrial-computing interface.

AMI obviously does not standardize any higher protocol or application layers. The problem of how you port your AWS account to Rackspace is a solvable problem with present approaches. The problem of how you port your MySpace account to Facebook, or your Yahoo account to Google, or whatever, is not.

This is what I mean by "a tank, not a car." I hope it clarifies the matter...

January 19, 2010 at 7:27 PM

Blogger newt0311 said...

@Yarvin,

A functional namespace is not needed to move a facebook account to MySpace. A file namespace seems sufficient.

Are you thinking of something along the likes of Google's Django hosting solution?

January 20, 2010 at 12:15 AM

You can use some HTML tags, such as <b>, <i>, <a>

This blog does not allow anonymous comments.

Comment moderation has been enabled. All comments must be approved by the blog author.

You will be asked to sign in after submitting your comment.
Please prove you're not a robot