NEP: 6 Title: Wallet Standard Author: Erik Zhang <erik@neo.org> Type: Standard Status: Final Created: 2017-09-14 Requires: 2, 3
This NEP describes a wallet standard that allows the wallet files to be shared between the various implementations of NEO.
Currently, different client programs generate different wallet files. They have different file formats, different ways of storing, and different ways of encrypting. It is difficult for users to migrate between different client programs because the wallet files are not in the same format. Although migration can be achieved by exporting the private key, it is cumbersome for wallets with multiple private keys. We need an universal wallet format that allows users to migrate across all platforms safely and easily without having to change the wallet file or export the private keys.
The wallet standard should consider both security and cross-platform compatibility. For security, we require the implementations to use the NEP-2 mechanism to encrypt or decrypt the private keys. For cross-platform, we use the JSON format to describe the wallet files, so that the contents of the wallet files can be easily recognized on each platform.
A wallet file in JSON format has the following basic structure:
{ "name": "MyWallet", "version": "1.0", "scrypt": {}, "accounts": [], "extra": null }
name
is a label that the user has given to the wallet.
version
is currently fixed at 1.0
and will be used for functional upgrades in the future.
scrypt
is a ScryptParameters object which describes the parameters of the SCrypt algorithm used for encrypting and decrypting the private keys in the wallet.
accounts
is an array of Account objects which describe the details of each account in the wallet.
extra
is an object that is defined by the implementor of the client for storing extra data. This field can be null
.
ScryptParameters object has the following structure:
{ "n": 16384, "r": 8, "p": 8 }
n
is a parameter that defines the CPU/memory cost. Must be a value 2^N.
r
is a tuning parameter.
p
is a tuning parameter (parallelization parameter). A large value of p can increase computational cost of SCrypt without increasing the memory usage.
Account object has the following structure:
{ "address": "AQLASLtT6pWbThcSCYU1biVqhMnzhTgLFq", "label": "MyAddress", "isDefault": true, "lock": false, "key": "6PYWB8m1bCnu5bQkRUKAwbZp2BHNvQ3BQRLbpLdTuizpyLkQPSZbtZfoxx", "contract": {}, "extra": null }
address
is the base58 encoded address of the account.
label
is a label that the user has given to the account.
isDefault
indicates whether the account is the default change account.
lock
indicates whether the account is locked by the user. The client shouldn't spend the funds in a locked account.
key
is the private key of the account in NEP-2 format. This field can be null
(for watch-only address or non-standard address).
contract
is a Contract object which describes the details of the contract. This field can be null
(for watch-only address).
extra
is an object that is defined by the implementor of the client for storing extra data. This field can be null
.
Contract object has the following structure:
{ "script": "21036dc4bf8f0405dcf5d12a38487b359cb4bd693357a387d74fc438ffc7757948b0ac", "parameters": [], "deployed": false }
script
is the script code of the contract. This field can be null
if the contract has been deployed to the blockchain.
parameters
is an array of Parameter objects which describe the details of each parameter of the contract function. For more information about the Parameter object, see the descriptions in NEP-3: NeoContract ABI.
deployed
indicates whether the contract has been deployed to the blockchain.
All old-format wallets should be able to be converted to this new JSON format easily. If these wallet files contain some extra data, they can be stored in the extra
fileds.