inkan's avatar
inkan
dv@www.inkan.cc
npub16xnp...6z6l
inkan's avatar
inkan 3 days ago
For anyone curious to try the Inkan prototype, here's roughly what's involved in setting up an identity: 1. Get the Inkan Management Utility (a Linux AppImage): 2. Run it on a current Linux system. I've tested it on Ubuntu 24.04 and Tails 7.7.2. Ideally the utility should be run on an airgapped system (I like to use Tails with networking disabled as a proxy for an airgapped machine). Once you open the utility, I suggest using the "Quick identity setup" path for your first identity; it's the most straightforward. 3. The utility will produce the chain of key pairs that make up your identity, a master at the top, one or more intermediates, and a signer at the bottom. Keep the master and intermediate keys safely offline (encrypted on a USB stick or two is fine). The signer keypair you can move to your regular online machine, since that's the key you'll use day-to-day. Once you have the signer's pubkey, send it over to me on Nostr (@inkan) or to contact@inkan.cc so I can allowlist it at www.inkan.cc. Once you've been allowlisted, go on to step 4. 4. The utility also creates an Ethereum transaction that registers your identity on-chain. The easiest way to get it broadcast is via a sponsor. They cover the gas and broadcast it for you, so you don't need to hold any ETH yourself. Alternatively, you can sign and pay for it within the utility, then broadcast the signed transaction yourself. 5. Once the transaction has confirmed on Ethereum and your signer pubkey is allowlisted at www.inkan.cc, you're ready to log in. Go to www.inkan.cc, log in with NIP-07 using your signer key, and complete the setup wizard. Reach out at any step if you get stuck or have questions, happy to help. Also, if ETH or finding a sponsor is what's keeping you from trying Inkan, let me know. I'd like to get a sense of how much of a hurdle this is. View quoted note →
inkan's avatar
inkan 4 days ago
A short explainer of the Inkan identity system. ▌ What is Inkan? Inkan enables online identities whose private key can be created in cold storage and stay there permanently. The key never has to touch an internet-connected device and does not have to be kept close at hand. The identity itself can nonetheless be used easily for everyday online authentication, like posting, replying, messaging, or signing in to services. ▌ How does it work? Inkan builds on the Nostr protocol which facilitates the distribution of digitally signed content. The idea behind Inkan is that the identity-securing key never has to sign that content itself. It can delegate signing authority to delegatee keys, which handle the everyday signing on its behalf. If a delegatee key is ever lost or stolen, it can be replaced. ▌ Delegations between keys Delegations are time-indexed two-place relations. Between any two key pairs, at any moment in time, the first key pair either delegates signing authority to the second or it doesn't. When it does, the second key is authorized to sign on the first's behalf. When it doesn't, the second key has no such authority. Delegations are either direct or indirect. A direct delegation arises when one key has expressly declared that it delegates signing authority to another. An indirect delegation arises because, on Inkan's concept of delegation, the relation is transitively closed: if X delegates to Y and Y delegates to Z, then X also indirectly delegates to Z. ▌ How is a direct delegation created? A direct delegation from key pair X to key pair Y is created when both key pairs digitally sign a "Declaration of Delegation of Signing Authority" by which X declares that it delegates signing authority to Y, and Y declares that it accepts. The signed declaration must then be recorded on-chain (Inkan uses Ethereum). The delegation begins at the time of the block in which the declaration was recorded, and remains in effect until it is revoked. One special case: the above holds only if neither X nor Y has previously permanently invalidated itself. If either has, no delegation relationship is created, even though the declaration sits on-chain. (See "What is permanent key invalidation?" below.) As part of the delegation declaration, X and Y also specify whether X can revoke the delegation unilaterally, or whether Y's consent is required. The default is unilateral revocation by X. This matters most if Y's private key is ever lost: with unilateral revocation, the user can still revoke using X alone; if Y's consent is required, they cannot (since they no longer have access to Y, and thus can no longer use Y to sign the revocation declaration). For most users, unilateral revocation is recommended for this reason. ▌ How is a direct delegation terminated? A direct delegation from key pair X to key pair Y is terminated when X digitally signs a "Declaration of Revocation of Signing Authority," by which it revokes the signing authority it had delegated to Y. If the original delegation declaration specified that Y's consent is required for revocation, Y must also sign; otherwise, X's signature alone is enough. The signed revocation declaration must then be recorded on-chain. If it carries all required signatures, the delegation relationship terminates at the time of the block in which the declaration was recorded. One final wrinkle: when a delegation declaration and a revocation declaration between the same X and Y land in the same Ethereum block, the revocation is by convention treated as occurring first, and the delegation as occurring thereafter. So from that block on, the delegation is in effect (assuming neither X nor Y has been permanently invalidated). The convention is just a tiebreaker for cases that block timestamps can't order. ▌ What is permanent key invalidation? The third type of declaration in Inkan is the "Declaration of Permanent Invalidation of a Key Pair." It is signed by the key pair invalidating itself, declaring that, from then on, this key pair can no longer participate in any direct delegation relationship, either as delegator or as delegatee. Once signed, the invalidation declaration must be recorded on-chain. It takes effect at the time of the block in which it was recorded. From that point on, all existing direct delegations in which the invalidated key pair was delegator or delegatee are terminated, and no new direct delegations involving it can come into existence, even if a delegation declaration naming it is later recorded on-chain. The main use is invalidating a compromised master key. Such a key has no delegator, so ordinary revocation isn't available. Permanent invalidation lets the user withdraw it from the Inkan ecosystem entirely. ▌ Delegation timelines An Inkan-enabled client can read the three types of declarations on the blockchain and, for any given pubkey and any past moment up to the present, compute the direct delegation relationships that the pubkey was involved in at that moment. The indirect ones follow by transitive closure. So for any pubkey, the client can compile a complete timeline showing every direct and indirect delegation relationship that pubkey has been involved in at any time, up to the present moment. At www.inkan.cc, registered users can view such timelines for any pubkey that has been involved in delegations and trace them back to the underlying declarations recorded on-chain. ▌ Bitcoin timestamping of Nostr events Inkan needs an objective, auditable rule for when the act of signing each Nostr event is deemed to have occurred. To achieve this, Inkan uses OpenTimestamps (OTS) to anchor Nostr events to Bitcoin blocks. An OTS proof for an event establishes that the event and the cryptographic artifact that constitutes its "signature" existed by the time of a specific Bitcoin block. Inkan then treats an event's 'created_at' field (the signer's self-declared timestamp) as its objective signing time if an OTS proof shows the event and its signature existed shortly after that time. The "shortly after" window is user-configurable (default: four hours). Events without such a proof are treated as if they had no valid digital signature at all, are not displayed by the client, and are not attributed to any delegator. ▌ Attribution of Nostr events Under this framework, we know, for any past time T and any two keys X and Y, whether X delegated (directly or indirectly) signing authority to Y at T. And for any event that Y has signed, with both a valid cryptographic signature and a valid OTS anchor, we have an objective signing time, i.e. the event's 'created_at'. Putting this together gives us the necessary ingredients for a well-defined attribution rule: an event E is attributed to key X if and only if some key Y validly signed E at time T and, as of T, X delegated signing authority to Y. So, for example, a text note signed by a delegatee Y during a valid delegation period from X appears on X's timeline and is displayed there under X's profile as if posted by X, even though X's own key never signed it. ▌ Setting up and managing an Inkan identity Inkan provides a tool, the "Inkan Management Utility," that automates the creation of the key pairs and the delegations running through them that constitute an identity. The utility can also create key replacements and permanent invalidations. The utility runs without network access and is intended to be used on an amnesic, air-gapped system such as Tails (with networking disabled), so that nothing persists after shutdown and the master key is never exposed to a networked host. The utility is available as a Linux AppImage: Users should set up their identity by building a chain of delegations (master → intermediate(s) → signer) rather than a single master-to-signer delegation. By transitive closure, events signed by the bottom-of-chain signer are attributed to the master. Revocations only require the immediate delegator above the affected signer, so it is not necessary to keep private keys above that immediate delegator close at hand. In particular, the master, once it has signed the chain's initial top-level delegation during the identity's creation ceremony, can stay in cold storage indefinitely. Generated key pairs can be backed up in encrypted form on USB sticks; multiple copies in separate locations are easy and recommended. Only the current signer key and the delegator immediately above that signer need to be reachable. The rest can be stored in relatively inaccessible locations. The Ethereum gas fees required for on-chain recording of delegation, revocation and invalidation declarations can be paid by the user directly or by a sponsor. Sponsored payment lets a user create and manage an Inkan identity without holding ETH, and without revealing any private key information to the sponsor. Setting up an Inkan identity takes some up-front ceremony, but ongoing use does not. The initial work is to create key pairs, sign the declarations that wire the keys into delegation relationships, and record these declarations on-chain. This is a one-time effort and is in large part automated through the management utility. After that, most of the keys can be put away and not be touched again, with only the signing key sitting "hot" on internet-connected devices for everyday signing, and the immediate delegator of the signing key kept close at hand so that it can perform key rotations if the signer is lost or compromised, or preemptively on a periodic basis. ▌ Using the client — two profiles, one identity When using the Inkan client, you log in with your signer key and sign events with it, just as you would with any other Nostr client. These events appear on the signer's profile page (as in any other client), but in addition they also appear on the profile pages of each of its delegators, including, especially, your top-level identity. You can set the signer's profile (avatar, banner, display name, etc.) by publishing a kind-0 event as usual. In addition, Inkan includes a mechanism by which the signer can set profiles for its current delegators. This allows your top-level identity to maintain a profile without having to sign any Nostr event itself. Your identity's profile is what you present yourself with to the world. Others should follow and interact with the identity, not with the signer beneath it. The signer is ephemeral and expected to be replaced sooner or later. The identity is expected to be permanent and is the appropriate object to which followers should attach.
inkan's avatar
inkan 4 days ago
Inkan enables you to revoke and replace key pairs when your private key has been lost or stolen. You can also perform periodic key rotations preemptively. You can do all this in a decentralized manner. That way Inkan gives you a permanent online identity that only you control, and that you can be confident you can keep over the long term. Inkan is open for testing and comment. Let me know if you'd like to try it out.
inkan's avatar
inkan 0 months ago
Question for all Ethereum enthusiasts around here: Say you have a smart contract to which users can submit transactions for which they have to pay gas fees. You'd like to offer them the service of paying these gas fees on their behalf so they don't have to go go through the trouble of having to get their own ETH. But it's also important that msg.sender always be the address of the privkey with which the user signed the underlying transaction (rather than say the address of the payor). Is there an (easy?) way to do this? #ethereum
inkan's avatar
inkan 1 month ago
You don't need key signing parties to bind pubkeys to their owners. What you need are pubkeys that have an association with their owners which remains stable over the long term. That's because, given enough time, you'll always have plenty of opportunity to observe all kinds of cues and signals that will tell you who is behind a pubkey, at least to the extent to which the owner wants to reveal that information to you. For example, over time you'll be able to tell whether the owner is a bot or a human, what their interests are, their writing style, what communities they are part of etc. And if they want you to know their name or other "personally identifiable information," there will be almost always be easy mechanisms by which they can convince you that they are who they say they are. It seems very unlilely that AI's ability to impersonate will change this, either now or in the future.
inkan's avatar
inkan 1 month ago
The pubkey @npub10ukg...x0x9 has never ever signed a single Nostr event. Yet that pubkey has recently gained its first real-life follower. I admittedly don't know whether they'll decide to stick around or not. But it's a small milestone in the (very early) history of Inkan.