Problem Statement - Under new legislative requirements passed into law in Australia in 2018, all businesses providing exchange services into digital currencies such as Bitcoin need to be registered with AUSTRAC and need to complete due diligance with respect to AM/CT risk and to complete certain KYC checks depending on the above risks.
By implementing the following steps, we provide a way for a user to complete the KYC process once and have this verification available to other service providers in the Digital Exchange Service industry.
In order of this initial verification attestation to be valuable to other service providers, it must cover all of the checks required under Australian legislation. Initially this will be to complete 100 Points of Identification and a PEP check. Other verifications can be added at leter stages as required.
An entity will also have to be registered with AUSTRAC as the Designated Business Group (DBG) in order for other entities to use the verification undertaken by the DBG.
Using uPort or other wallets and ERC780 contracts to make portable KYC attestations. Users will be able to verify their idenity once, use many across financial services. This demo is on the Rinkeby network.
This code will enable white label KYC portals to be deployed.
There is provision in the existing legislative framework for this type of co-ordinated KYC approach to be undertaken. http://www.austrac.gov.au/chapter-3-designated-business-groups#what
The process to add a new user to the KYC smart contract is:
- New users visits the portal https://id.blockchainaustralia.org
- Complete an online form
- The website is configured to use our KYC vendor RapidID - https://rapidid.com.au/home
- A call to RapidID's REST API is posted
- If verified, the data is hashed and submitted to the Ethereum blockchain
To verify a users 100 points of ID, they are asked to sign a message from the private key that holds their attestations.
- The exchange website generates a unique message for that user. Eg I Lucas Cullen, am the owner of the address 0xa25Fe077D33F93816ad06A4F7dCE2f3808D0108529-08-2018
- User generates the signed message from a wallet or service, such as https://www.myetherwallet.com/signmsg.html
- If the signature is valid, the exchange can assert the user is correct
{
"address": "0xa25fe077d33f93816ad06a4f7dce2f3808d01085",
"msg": "I Lucas Cullen, am the owner of the address 0xa25Fe077D33F93816ad06A4F7dCE2f3808D0108529-08-2018",
"sig": "0xad44f6f7d4cc87859437734546df99baafe343dac71452aea08aea7beaf754c97880513568163c28bccfca135a4e100bbc6c3d3a663737b31506d2f9f3fe34901b",
"version": "3",
"signer": "MEW"
}
There is one smart contract.
- The KYC proxy that implements business logic functions, such as "points value"
Based on the 100 Point ID check Australia.
Key | Class | Document Type | Point Value | Key as Bytes32 |
---|---|---|---|---|
BIRTHCERTIFICATE | Primary | Birth Certificate | 70 | 0x42495254484345525449464943415445 |
PASSPORT | Primary | Passport | 70 | 0x50415353504f52540a |
DRIVERSLICENCE | Secondary | Driver’s Licence | 40 | 0x445249564552534c4943454e4345 |
RESIDENTALCOUNTRY | NA | Country of Residence | 0 | 0x5245534944454e54414c434f554e545259 |
Classes represented in the smart contract as an enum
enum Class {
Primary,
Secondary
}
Once documents have been certified, their Key and the hash of the JSON object are added to the users public key.
struct Document {
Key,
Hash,
Date,
Verified
}
KYC contracts will determine the users KYC state, based on local laws. These will be deployed from parties, such as Blockchain Australia. Finanical services will call these top level contracts to determine their users KYC status.
Primary and secondary documents are represented as JSON in the following formats. The hash of the document is then added to the ERC780 register contract.
{ 'BIRTHCERTIFICATE': '0x00' }
| Key | Eg Value | | --- | --- | --- | | Key | BIRTHCERTIFICATE | | Name | JOHN DOE | | Issued | 2018-01-01 |
{
Key: 'BIRTHCERTIFICATE',
Name: 'JOHN DOE',
Issued: '2018-01-01'
Documents: [
]
}
{
BirthDate: '2005-08-21',
FamilyName: 'Smith',
GivenName: 'Larry',
RegistrationState: 'NSW',
RegistrationDate: '2005-08-27',
RegistrationYear: '2005',
RegistrationNumber: '500156',
CertificateNumber: '1758461',
DatePrinted: '2012-07-27'
}
{
BirthDate: '1985-02-08',
FamilyName: 'Lee',
GivenName: 'Mary',
LicenceNumber: '94977000',
StateOfIssue: 'ACT',
Country: 'AUS'
}
Flattening the object
{\"uPortAddress\":null,\"CountryCode\":\"AUS\",\"Key\":\"DRIVERSLICENCE\",\"BirthDate\":\"1985-02-08\",\"GivenName\":\"Mary\",\"FamilyName\":\"Lee\",\"LicenceNumber\":\"94977000\",\"StateOfIssue\":\"ACT\"}
Eg SHA-256 hash 0xa9dc32cc4b5416158dabefae23c8c6bd000841755a58e4c29e920af2705df604
Name | Public Key | Url |
---|---|---|
Blockchain Australia | 0xa25Fe077D33F93816ad06A4F7dCE2f3808D01085 | https://blockchainaustralia.org/kyc |
ConsenSys | 0x00 |
The "100" points proxy contract will iterate through the underling claims contact 0xc9ed21ffcc88a5072454c43bdfdbbe3430888b19
. Using the key and points values from the above table, will then aggrate the total.
contract Points {
}
Vendor | Private Key | Public Key |
---|---|---|
"Blockchain Australia" | 0x3b3617c923fc5d7ea2aa1fc10d98e5b15cf1ade7b463c2dc929a1d2498137472 | 0xa25Fe077D33F93816ad06A4F7dCE2f3808D01085 |
ERC 780 specs ethereum/EIPs#780
First iteration of this is now available at uport-project/ethereum-claims-registry!
It's also deployed to the following addresses:
Rinkeby (id: 4) 0xc9ed21ffcc88a5072454c43bdfdbbe3430888b19
https://rinkeby.etherscan.io/address/0xc9ed21ffcc88a5072454c43bdfdbbe3430888b19 https://github.com/uport-project/ethereum-claims-registry
100 Point ID check Australia https://www.homeaffairs.gov.au/Licensing/Documents/100-points-identification-guidelines.pdf
uPort App Public Key 0x04b9d33dbc805cbc574b849d6f55e5022a5d07f4df46e6001d9bfb08b306d7a62ac3ca37ffa70abac019be6ab2ffb3db7045e63b755e65d9b73a6438531b75e712
Address 2ofGDsP2Rb51Bt76jVjSzresYwxgKcqyGbs
or 0x94D61685D2B7b656C38e7bedAca4f5743d1362c4
Azure web app https://kyc-token.azurewebsites.net/
Deployment creds lucascullen Test1234
ISO 3166-1 Country codes