Generating Addresses

Generation Address

Presently, Neptune has two types of addresses, Generation Addresses and Symmetric Addresses. The latter type is used internally for sending funds to the same client from which they originate, like with change and composer UTXOs. Generation addresses are the type you want for addresses that third parties can send funds to.

A generation address looks like this:

nolgam1y9765mhpwlv3syglda3qrfjn97rw4chgtkv76c85z5z7wm5l2emkwnhkshmpwcwyxy0dnzd3e75k7fkr8khm86usptf4g2ztxl0hlnmulttnqeqf96zwgumr27jg96ymgr70s3ms4a2nmj5qku46m83hg8cr2awk9pq38vusn76v9w5j5gqcq06kp5njj7ndfvwyr8xn7k6crsh4hmj4xu9ayxx08xp68uquy9ecr37d9v38ef43ygcxmeveqw57acp306cu6wmxx4xt40js8emp5ly6tjla7t7xx4gsd0uxv8ukh36v4dv69jfj6wjrrud5wjmpv4l96dhl6uq5ynqkgyeg9njuxfm8qfuxu8y53pqwuxch2y2ujwggea3snfkyq8w8yxs7ls7h8fkmn48rahj0k5rtqak762tepd9ks7sy34rvfa74f24zzk8h52k6tq2ru35ua8m36pjlr9gppwa9un20na4654peju8u95zlg9ev09edlnedla5vry8h92gkrz7g8vrw7jtt6xjasgu0eshtvlywz25zr5408mxu3l8s9lmgh5fsylampmfkyna64kykp2jetmsr8cese5fxa6u3s785lswpy3n2mu4fptvfmw20w4gsdqxlj7qnns3eunwahhwp7x48dq8auqjh3lqgmhek9fkfewdnrmqxhf0h8z7le5e3pknvlh0nc92wqfd5wx2n75m8tss6j8nkl2ajk2apf9qqr44y40l5dqydwxe9pwfssrvu08swlt9e9dwrdhlukcjq82ch9e9jmttjw7xkchaqt0fz49d4shddldghhy53dk0uewf0zx2mhs2qa05uc4wgpsxnc2ravardxprjlq0pqgnn5rk2v855aw8j67h20cghlfw29a5ph9dyz5c6shamer48shun52hqhylkj7fxfkdq2hnafjty2n8aaam5luthtkd4gt8xw6w9mum92twdzme07ly2wx6gtm688ctdr8c9gvj7vkgflr8eacmarwev2r3g0rpthdgsa8x2prvjyuh4y3yh6gv6ll49h237uk55c6kzj9wc93n7lw9x4cpwy2f3czd2amrhtjv55rtvmngc9jel62e22q3a064agv9xg34ekzwxxvqx4n87alzt05rtdcndfefhw6w6et45nvp0ngvgpzuum9sfj5kpfse3hravn5hs22j84e4udlt4qpf60nvqc48squmxxeq7kljtfjawmag6quzdt0ec0yvz3wttkalja5wcd27c8lje3v0ver2etkevp4xkjdmprkg0ggf9smp5c0ecw66vfghe7uyv6smyr06l860wvhx0nrdryur6daneu6tk2fah9xw2ww8qcce00q37hkf6w23t5sc2sjthn9uljesw7gqrjsn64h4dhhezmzr7t08tmyu5pwejynt9jqtdhc6525nf6k0ex3e7r28re9ng28ralugdq52ke5zvvrm3u7wjayhlh0hajn2dykmqllc7kegt3lzcn2m3d0v7ede54hc7zxfwyzg0v07k02n8lpjyf7cv5hwuw3ug86zp8dctwpfgww9a405r58ekxkzlwsq02lvsc8q6safkp637km4vuqleew7x9at5cd86jv4rp3yvm4dplcjcnnyupjvq8k5qdds7ywm3lpxeyumyqykjja6casllszplfwgszj9wsqhvzhucjkmtj9u9qnj7jhphftnkscs7vx4yzp4ft6u6p9g7akfmqpqzyuw7vqgyr7ajdjuamvrzu7q20udznpv3yvs0e6wv7xq8hml0xyr3m9xh8aupunf5c34fk92gw7zlyjhntk9dlp4k2qu80r9vzgl4p2f9gpgn2gjxkmgfm7t7enwzhux65xz3nnqeu2m4sc9ml7cwrsrjkvllh8radkcsxr4vs27e03y95lexx4qmzsp20x58lymumpvu5kq6w4mmcrn3tsu5k8gygz98r748zvea8tdd3mwkdd9zhdsdlx6e6chssuxysvdmlhly5fw7husa7q6huama23rd3e8jchfks5v8jmp04jcy96ac0gys3k8jggjxlnsgervnrskzw88fxp29xapy7syyzvlszahgx62x8nag9tj9lek9v7hqknzgp5phm93lcxv6x4qsj6tl7sxuzdr2ad7jjez9trw750kzuc3jrqvd0gd9d0h2w86nvkj3g8xq0t6zfw3n58v2569mrrz9v9uxqrwsjlgu59lqxlnxdjmrpda0jeq5dlvedzyn34m6ru7rmy9t8u9pawl9c9zh28p76dneexjezge7d2hfuj5pjas26gdslgdh956zaxszwczmspnjkmnptjvxdhcv893mdrzn2eqaxlymhyrzulnjkykvgxtd7xsglk5nm9mqcx3e6m92k0wvzaqjun6x6vu4t2ay2n9p73pvputgxjk60yy39qp3p3t2pehctptfjrzmfch6cwxmp5e2m7dav249z96ax0jw0nk4weegr9td7cnvrqrn0dlft8865kfuaf078s4drj9uaux07lshp6xm804wcu60zhwnnlsezuadn803r3qnft92vpsa8xp33aje26prsvrqhyr3zkdpddld5sp2d9n9vtu6kc6u0wm50jpxhwvt0vcyku3a4m7f7mu9j0ju80mapzz003nlmecvthzsz9stxyv4j7jkcvg8kc49e0tpucu4tuntezq87mgzla24p00txs2wyf3yatyvmwgtl40lx729e9js2v44a2p8pxeh3uv0nwq0x4c3kyujzlnvc23c2d8jl4kma3tjnc5qmv24yhhxtqldrxf5jyyquc3sch7ecwwgz7aafjyktzutr0xs2xakkfqv669549ax69sjp2mc8r7dantffe2mgwgstt3xj9j48nmk3yn24m8ap40ljq2zgd04vvxa8at9snp8skwf93pj2c5h3d4lvmjsl2sh6x5zm3fmfa235pryhqr6yy9jypvgc3qt78x0wnegu7jqyufx5xv5mdm9pkx5fkypqus05mrk8sydmmjxzcjdlmk5y7f3cjd5npa8pjsmj4pxj6lvqdnagdwfxyewl9hjhwc96maa530ypasl4ts4d3p4f3s5cvqr2xpfxld52xjj3w3m989j2kgcsumz2ns7960ymssv4slz7uwgjt87a520eeq7t9lyedfahauanxc7zpjtr7ug2p9ggykmlqnz0wjsjez3kzae49896z4z97lzufw5tl8ar0nzqy0q3nhsk0d05nj36c0w9he93sedujmw2hc69yh9v4mr2w0frxf8chj84esh9z8kukqa5gsd28fl5fqmqle05x6h98hw9hny77fpc0muc2hu2mch8mjuppt0g2492mggtyt3f0sw3uapz0tug87xgnv64nxdt7jpcm53gd39dnhe0nxzdufmnzq9sh0dhk0n2falgsvuv4xtay3

Note the prefix nolgam and the separator 1 at the start. All generation addresses have this feature. The remaining part is the actually payload, and it is different from address to address.

The address is bech32m-encoded, meaning that a) it has (some) error detection capacity, and b) ambiguous characters like "1", "b", "i", and "o" have been removed (except for the separator). These features are useful for users who want to type the entire string character by character. While that's possible, given the length it is preferable to just copy and paste.

Why is it so long? In short, it is the cost of post-quantum security. The longer answer is that the address encodes among other things a lattice-based public key, which is used to encrypt information about the UTXO that only the intended recipient should know.

Privacy

Users should note that generation addresses contain receiver identifiers which is copied into the transaction so as to alert the beneficiary of an incoming payment. This design choice voids the need to scan all transactions announced in a certain time-window and trial-decrypt the associated ciphertexts. However, it also means that different payments to the same generation address can be linked as payments to the same person.

Even when repeated payments are made to the same generation address, in the general case not even the sender (let alone third parties) can tell whether either of the payments have since been spent.

Users who want to avoid incoming payments from being linked should either a) generate a new generation address for every incoming payment; or b) use off-chain UTXO notifications.

Public Announcements

By default, a transaction that sends funds to a generation address includes a public announcement which contains a ciphertext that only the recipient of the transferred funds can decrypt. This ciphertext contains UTXO info such as the amount but also the sender randomness, which is a key piece of information required by the mutator set. Besides the ciphertext, the public announcement also contains the recipient identifier.

The benefit of using public announcements to transmit this information is that the blockchain acts as a robust back-up solution: all funds can be recovered from the user's secret seed phrase and historical block data. The drawback is a) the (marginal) loss of privacy when generation addresses are reused; and b) the larger size of transactions, which under reasonable economic assumptions means more fees are required. Using off-chain UTXO notifications instead addresses both drawbacks.

Determinism

All generation addresses are deterministically generated from the wallet secret seed and a derivation index. The derivation index is initially set to 0 and increases by one each time a new address is generated. This construction ensures that if the wallet file should be lost, the exact same sequence of generation addresses can be reproduced from the backed-up seed phrase.

Using neptune-dashboard

  • Make sure a node is running: > neptune-core.
  • Start neptune-dashboard in a new console window > neptune-dashboard.
  • Navigate to the "Receive" tab. Your current generation address is shown.
  • Press Enter to generate a new generation address.
  • Press C to enter into console mode, where you can copy the address.
  • Press Enter to exit console mode.

Using neptune-cli

Next Address

To generate the next generation address without going through the dashboard, neptune-cli is your friend:

  • Make sure a node is running: > neptune-core.
  • > neptune-cli next-generation-address.

Nth Address

The previous two methods require a running node in order to read the derivation index and increment it. To generate a generation address with a given derivation address, run > neptune-cli nth-receiving-address n and replace n by the index.

Premine Receiving Address

For premine recipients, the command is > neptune-cli premine-receiving-address.