Reference
TCC-0003 Address verification words
The six public words that stand for a Tenrai address. The word list, the derivation from the address, the text form and the strength.
On this page
| Number | TCC-0003 |
|---|---|
| Status | Final |
| Category | Wallet |
| Identifier | Hash domain TRAI_ADDRESS_WORDS_V1 |
This convention specifies the six public words that stand for a Tenrai address, version 1. They let two people compare an address on two screens or read it out over the phone. Wallets show them as "Address Verification Words"; at the send review they appear as "Recipient fingerprint".
The words are no secret, no recovery phrase and no proof of ownership. Anyone who knows the address can compute them. For ownership see TCC-0004.
Word list
The list is crates/primitives/src/address_words_v1.txt in the node repository: 2,048 lower-case ASCII words, one per line, LF line endings, sorted, the last line also ending in LF. Its SHA-256 is
55149311582c84d0baafbbbb98ad8329e5c365fba3be78ccb2aaf180a4ddc344Every word has 4 to 8 letters and a unique first four letters. No word is in the BIP-39 English list, so the words are never mistaken for a recovery phrase. The list never changes; a different list would be version 2.
Derivation
digest = sha384_domain_hash("TRAI_ADDRESS_WORDS_V1",
[ hrp, address_version, lock ])
index_i = bits 11*i .. 11*i+10 of digest, most significant bit first,
for i = 0 .. 5
words = list[index_0] .. list[index_5]| Field | Content |
|---|---|
hrp | ASCII HRP of the address: trai, ttrai or dtrai |
address_version | One byte, 0x01 |
lock | The 41-byte spend lock carried by the address |
sha384_domain_hash is the length-framed SHA-384 that Tenrai uses for every commitment, see Hashing:
sha384_domain_hash(domain, fields) =
SHA-384( u16_be(len(domain)) || domain ||
u64_be(count(fields)) ||
u64_be(len(field_0)) || field_0 ||
u64_be(len(field_1)) || field_1 || ... )The six indices use the first 66 bits of the digest; bit 0 is the most significant bit of byte 0.
The HRP is part of the hash, so the same key gives different words on mainnet, testnet and development. Testnet and testnet100 share ttrai and therefore their words. Threshold addresses have words like any other address.
Text form
The canonical text is the six words in order, separated by single spaces: windmill talc frosty fjord frothy sorghum. Interfaces may show them as windmill · talc · frosty · fjord · frothy · sorghum. Next to the words every wallet says: "These words are public and are not your recovery phrase."
Strength
Finding a key whose address has the same six words as a chosen address takes about 2^66 key generations.
Vectors
crates/wallet/tests/vectors/address-words-v1.json in the node repository holds addresses on all three networks, a threshold address and fixed locks, each with the digest, the six indices and the words.
