Ming Ke Ming (名可名) -- Account Module (Python)
This document introduces a common Account Module for decentralized user identity authentication.
Copyright © 2018-2019 Albert Moky
0. Meta
The Meta was generated by your private key, it can be used to build a new ID for entity, or verify the ID/PK pair.
It consists of 4 fields:
Field | Description |
---|
type | Meta Algorithm Version |
key | Public Key |
seed | Entity Name |
fingerprint | Signature to generate address |
0.0. Meta Type
0x01
Default version0x02
BTC version0x03
Extended BTC version0x04
ETH version0x05
Extended ETH version
0.1. Key
A public key (PK) was bound to an ID by the Meta Algorithm.
0.2. Seed
A string as same as ID.name for generate the fingerprint.
0.3. Fingerprint
THe fingerprint field was generated by your private key and seed:
data = seed.encode('utf-8')
fingerprint = private_key.sign(data)
1. ID
The ID is used to identify an entity(user/group). It consists of 3 fields and 2 extended properties:
Field | Description |
---|
name | Same with meta.seed |
address | Unique Identification |
terminal | Login point, it's optional. |
type | Network type |
The ID format is name@address[/terminal]
.
1.0. ID Type
The network type of a person is 8
, and group is 16
:
class NetworkType(IntEnum):
MAIN = 0x08
GROUP = 0x10
POLYLOGUE = 0x10
CHATROOM = 0x30
PROVIDER = 0x76
STATION = 0x88
THING = 0x80
ROBOT = 0xC8
1.1. Name
The Name field is a username, or just a random string for group:
- The length of name must more than 1 byte, less than 32 bytes;
- It should be composed by a-z, A-Z, 0-9, or charactors '_', '-', '.';
- It cannot contain key charactors('@', '/').
user_name = "Albert.Moky"
group_name = "Group-9527"
1.2. Address
The Address field was created with the Fingerprint in Meta and a Network ID:
def check_code(data: bytes) -> bytes:
return sha256(sha256(data))[:4]
class BTCAddress(Address):
@classmethod
def new(cls, data: bytes, network: NetworkType=0) -> Address:
"""Generate address with fingerprint and network ID
:param data: fingerprint (signature/key.data)
:param network: address type
:return: Address object
"""
prefix = chr(network).encode('latin1')
digest = ripemd160(sha256(data))
code = check_code(prefix + digest)
address = base58_encode(prefix + digest + code)
return BTCAddress(address)
When you get a meta for the entity ID from the network,
you must verify it with the consensus algorithm before accept its public key.
1.3. Terminal
A resource identifier as Login Point.
2. Samples
ID
ID1 = "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj"
ID2 = "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk"
Meta
{
"version" : 0x01,
"key" : {
"algorithm" : "RSA",
"data" : "-----BEGIN PUBLIC KEY-----\nMIGJAoGBALB+vbUK48UU9rjlgnohQowME+3JtTb2hLPqtatVOW364/EKFq0/PSdnZVE9V2Zq+pbX7dj3nCS4pWnYf40ELH8wuDm0Tc4jQ70v4LgAcdy3JGTnWUGiCsY+0Z8kNzRkm3FJid592FL7ryzfvIzB9bjg8U2JqlyCVAyUYEnKv4lDAgMBAAE=\n-----END PUBLIC KEY-----",
"mode" : "ECB",
"padding" : "PKCS1",
"digest" : "SHA256"
},
"seed" : "hulk",
"fingerprint" : "jIPGWpWSbR/DQH6ol3t9DSFkYroVHQDvtbJErmFztMUP2DgRrRSNWuoKY5Y26qL38wfXJQXjYiWqNWKQmQe/gK8M8NkU7lRwm+2nh9wSBYV6Q4WXsCboKbnM0+HVn9Vdfp21hMMGrxTX1pBPRbi0567ZjNQC8ffdW2WvQSoec2I="
}
(All data encode with BASE64 algorithm as default, excepts the address)