An implementation of The Kimberley Process's certificate issuance and validation system built on the Ethereum blockchain.
My complete thoughts on diamonds, the diamond industry and The Kimberley Process are available here: http://romancingthestones.diamonds
The Kimberley Process (KP) is a joint government, industry and civil society initiative to stem the flow of conflict diamonds – rough diamonds used by rebel movements to finance wars against legitimate governments.
Implementation of the KP is outlined in the KPCS Core Document.
In order to bring both transparency and integrity to the KP, my proposal is to put the entirety of the certificate issuance process, including all participants, authorities, observers, agents and parties, on the Ethereum blockchain. The specific features of the blockchain (cryptographically-enforced security, immutability, transparency, public availability of data) could be a dramatic improvement over the current system of paper certificates and their known weaknesses, such as forgery, varying certificate security features and design, and overly-generous expiration dates (and therefore the possibility of re-use).
A more general overview of my proposal is available here on Medium.com
Member countries that are participants in The Kimberley Process. Here is a current list of participant countries
An authority designated by the Particpant with the power to issue certificates. For example, the Ministry of Mines and Mineral Resources (Sierra Leone). These authorities do not issue certificates directly, but rather delegate those powers to specific employees, or agents.
An individual designated by a Participant Authority with the power to issue certificates.
An entity or individual acting as either the source or destination of the shipment of rough diamonds over international borders, ie a rough diamond trader, manufacturer or mining company.
- the importing party we are sending the shipment to
- the source participant
- the destination participant
//Certificate.sol:
function Certificate(address _kpcs,
address _exporter,
address _importer,
address _participantSource,
address _participantDestination)
...
}
Each certificate must contain the following data:
-
Participants
- Origins: geological origins where goods were mined from. Note: This value is not set directly, but is derived from the origins of the parsels.
- Source: participant country the shipment is being sent from.
- Destination: participant country the shipment is being sent to.
-
Agents
- Exporting: agent delegated by source participant's exporting authority the power to sign certificates.
- Importing: agent delegated by destination participant's importing authority the power to sign certificates.
-
Parties
- Exporting: entity or individual goods are being sent from
- Importing: entity or individual goods are being sent to
-
Parsels
- An array consisting of parsels of goods included in the shipment. Data includes:
- carats
- value
- geological origins
- An array consisting of parsels of goods included in the shipment. Data includes:
//Certificate.sol
function addParsel(uint carats,
uint value,
address[] origins) {
...
}
Each parsel contains:
- Carats
- Assessed value
- Addresses of participant countries of geological origins
Finally, the creator must call: Certificate.completedAddingParsels
to complete the parsel addition process, and request the authorities and parties to sign the certificate
- Importing party
- Exporting authority's agent
- Importing authority's agent
//Certificate.sol
function sign() {
...
}
Upon receipt of the last required signature (order is unimportant), the certificate is issued and shipment is cleared for the final step: validation.
This ensures that all participants noted on the certificate are recognized by the main instance of KPCS, therefore validating the certificate and adding a reference to it to from the main KPCS instance.
//Certificate.sol:
function markAsReceived() {
...
}
Upon acknowleged receipt of the shipment, the importing authority marks the certificate as received, completing the certificate. Note: according to the KPCS Core Document, this step is optional.