Skip to content

JirapusNon/smart-contract

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

369 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CircleCI

NDID Smart Contract

tendermint ABCI app

Note

Test this app with command below

TENDERMINT_ADDRESS=http://localhost:45000 go test -v

Add new validator (For testing)

get PubKey from pub_key.data in priv_validator.json

curl -s 'localhost:45000/broadcast_tx_commit?tx="val:PubKey"'

Prerequisites

Setup

  1. Create a directory for the project

    mkdir -p $GOPATH/src/github.com/ndidplatform/smart-contract
  2. Clone the project

    git clone https://github.com/ndidplatform/smart-contract.git $GOPATH/src/github.com/ndidplatform/smart-contract
  3. Get dependency (tendermint ABCI)

    cd $GOPATH/src/github.com/ndidplatform/smart-contract/abci
    dep ensure

Run IdP node

  1. Run ABCI server

    cd $GOPATH/src/github.com/ndidplatform/smart-contract
    
    DB_NAME=IdP_DB go run abci/server.go tcp://127.0.0.1:46000
  2. Run tendermint

    cd $GOPATH/src/github.com/ndidplatform/smart-contract
    
    tendermint --home ./config/tendermint/IdP unsafe_reset_all && tendermint --home ./config/tendermint/IdP node --consensus.create_empty_blocks=false

Run RP node

  1. Run ABCI server

    cd $GOPATH/src/github.com/ndidplatform/smart-contract
    
    DB_NAME=RP_DB go run abci/server.go tcp://127.0.0.1:46001
  2. Run tendermint

    cd $GOPATH/src/github.com/ndidplatform/smart-contract
    
    tendermint --home ./config/tendermint/RP unsafe_reset_all && tendermint --home ./config/tendermint/RP node --consensus.create_empty_blocks=false

Run AS node

  1. Run ABCI server

    cd $GOPATH/src/github.com/ndidplatform/smart-contract
    
    DB_NAME=AS_DB go run abci/server.go tcp://127.0.0.1:46002
  2. Run tendermint

    cd $GOPATH/src/github.com/ndidplatform/smart-contract
    
    tendermint --home ./config/tendermint/AS unsafe_reset_all && tendermint --home ./config/tendermint/AS node --consensus.create_empty_blocks=false

Run in Docker

Required

Run

docker-compose -f docker/docker-compose.yml up

Build

./docker/build.sh

Note about docker

IMPORTANT NOTE

  1. You must start IDP, RP and AS nodes in order to run the platform.

  2. After starting BOTH nodes, please wait for

    Commit
    Commit
    

    to show in the first terminal (go run abci ...) of both processes before starting api processes.

  3. When IDP node and RP node run on separate machines, please edit seeds in config/tendermint/{RP or IdP}/config/config.toml to match address of another machines.

Technical details to connect with api

Interact with api in BASE64 format data.

Broadcast tx format

functionName|parameter|nonce|base64(sign(param+nonce))|nodeID

Query format

functionName|parameter

Create transaction function

InitNDID

Parameter

{
  "node_id": "NDID",
  "public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEA30i6deo6vqxPdoxA9pUpuBag/cVwEVWO8dds5QDfu/z957zxXUCY\nRxaiRWGAbOta4K5/7cxlsqI8fCvoSyAa/B7GTSc3vivK/GWUFP+sQ/Mj6C/fgw5p\nxK/+olBzfzLMDEOwFRbnYtPtbWozfvceq77fEReTUdBGRLak7twxLrRPNzIu/Gqv\nn5AR8urXyF4r143CgReGkXTTmOvHpHu98kCQSINFuwBB98RLFuWdVwkrHyzaGnym\nQu+0OR1Z+1MDIQ9WlViD1iaJhYKA6a0G0O4Nns6ISPYSh7W7fI31gWTgHUZN5iTk\nLb9t27DpW9G+DXryq+Pnl5c+z7es/7T34QIDAQAB\n-----END RSA PUBLIC KEY-----\n"
}

Expected Output

log: "success"

RegisterNode

Parameter

Posible role is RP,IdP and AS

{
  "node_id": "IdP1",
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwx9oT44DmDRiQJ1K0b9Q\nolEsrQ51hBUDq3oCKTffBikYenSUQNimVCsVBfNpKhZqpW56hH0mtgLbI7QgZGj9\ncNBMzSLMolltw0EerF0Ckz0Svvie1/oFJ1a0Cf4bdKKW6wRzL+aFVvelmNlLoSZX\noCpxUPQq7SMLoYEK1c+e3l3H0bfh6TAVt7APOQEFhXy9MRt83oVSAGW36gdNEksm\nz1WIT/C1XcHHVwCIJGSdZw5F6Y2gBjtiLsiFtpKfxQAPwBvDi7uS0PUdN7YQ/G69\nb0FgoE6qivDTqYfr80Y345Qe/qPGDvfne7oA8DIbRV+Kd5s4tFn/cC0Wd+jvrZJ7\njwIDAQAB\n-----END PUBLIC KEY-----\n",
  "master_public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArdcKj/gAetVyg6Nn2lDi\nm/UJYQsQCav60EVbECm5EVT8WgnpzO+GrRyBtxqWUdtGar7d6orLh1RX1ikU7Yx2\nSA8Xlf+ZDaCELba/85Nb+IppLBdPywixgumoto9G9dDGSnPkHAlq5lXXA1eeUS7j\niU1lf37lwTZaO0COAuu8Vt9GcwYPh7SSf4/eXabQGbo/TMUVpXX1w5N1A07Qh5DG\nr/ZKzEE9/5bJJJRS635OA2T4gIY9XRWYiTxtiZz6AFCxP92Cjz/sNvSc/Cuvwi15\nycS4C35tjM8iT5djsRcR+MJeXyvurkaYgMGJTDIWub/A5oavVD3VwusZZNZvpDpD\nPwIDAQAB\n-----END PUBLIC KEY-----\n",
  "node_name": "IdP Number 1 from ...",
  "role": "IdP",
  "max_ial": 3,
  "max_aal": 3
}

Expected Output

log: "success"

RegisterMsqDestination

Parameter

{
  "users": [
    {
      "hash_id": "ece8921066562be07ba4ec44449646fc3b48d6b8a660a2e1e6a4bc7117edebba",
      "ial": 3
    }
  ],
  "node_id": "IdP1"
}

Expected Output

log: "success"

AddService

Parameter

{
  "service_id": "statement",
  "service_name": "Bank statement"
}

Expected Output

log: "success"

DeleteService

Parameter

{
  "service_id": "statement"
}

Expected Output

log: "success"

RegisterServiceDestination

Parameter

{
  "service_id": "statement",
  "node_id": "AS1",
  "min_ial": 1.1,
  "min_aal": 1.2
}

Expected Output

log: "success"

RegisterMsqAddress

Parameter

{
  "node_id": "IdP1",
  "ip": "192.168.3.99",
  "port": 8000
}

Expected Output

log: "success"

CreateRequest

Parameter

{
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6",
  "min_idp": 1,
  "min_aal": 3,
  "min_ial": 3,
  "timeout": 259200,
  "data_request_list": [
    {
      "service_id": "statement",
      "as_id_list": [
        "AS1",
        "AS2"
      ],
      "min_as": 1,
      "request_params_hash": "hash"
    }
  ],
  "request_message_hash": "hash('Please allow...')",
  "mode": 3
}

Expected Output

log: "success"

CreateIdpResponse

Parameter

{
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6",
  "aal": 3,
  "ial": 3,
  "status": "accept",
  "signature": "signature",
  "identity_proof": "Magic"
}

Expected Output

log: "success"

SignData

Parameter

{
  "service_id": "statement",
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6",
  "signature": "sign(data,asKey)"
}

Expected Output

log: "success"

SetNodeToken

Parameter

{
  "node_id": "RP1",
  "amount": 100
}

Expected Output

log: "success"

AddNodeToken

Parameter

{
  "node_id": "RP1",
  "amount": 111.11
}

Expected Output

log: "success"

ReduceNodeToken

Parameter

{
  "node_id": "RP1",
  "amount": 61.11
}

Expected Output

log: "success"

SetPriceFunc

Parameter

{
  "func": "CreateRequest",
  "price": 99.99
}

Expected Output

log: "success"

CloseRequest

Parameter

{
  "requestId": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6",
  "response_valid_list": [
    {
      "idp_id": "IdP1",
      "valid_proof": true,
      "valid_ial": true
    }
  ]
}

Expected Output

log: "success"

TimeOutRequest

Parameter

{
  "requestId": "ef6f4c9c-818b-42b8-8904-3d97c4c11111",
  "response_valid_list": [
    {
      "idp_id": "IdP1",
      "valid_proof": false,
      "valid_ial": false
    }
  ]
}

Expected Output

log: "success"

AddNamespace

Parameter

{
  "namespace": "CID",
  "description": "Citizen ID"
}

Expected Output

log: "success"

DeleteNamespace

Parameter

{
  "namespace": "Tel"
}

Expected Output

log: "success"

UpdateNode

Parameter

{
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArdcKj/gAetVyg6Nn2lDi\nm/UJYQsQCav60EVbECm5EVT8WgnpzO+GrRyBtxqWUdtGar7d6orLh1RX1ikU7Yx2\nSA8Xlf+ZDaCELba/85Nb+IppLBdPywixgumoto9G9dDGSnPkHAlq5lXXA1eeUS7j\niU1lf37lwTZaO0COAuu8Vt9GcwYPh7SSf4/eXabQGbo/TMUVpXX1w5N1A07Qh5DG\nr/ZKzEE9/5bJJJRS635OA2T4gIY9XRWYiTxtiZz6AFCxP92Cjz/sNvSc/Cuvwi15\nycS4C35tjM8iT5djsRcR+MJeXyvurkaYgMGJTDIWub/A5oavVD3VwusZZNZvpDpD\nPwIDAQAB\n-----END PUBLIC KEY-----\n",
  "master_public_key": ""
}

Expected Output

log: "success"

CreateIdentity

Parameter

{
  "accessor_id": "accessor_id",
  "accessor_type": "accessor_type",
  "accessor_public_key": "accessor_public_key",
  "accessor_group_id": "accessor_group_id"
}

Expected Output

log: "success"

AddAccessorMethod

Parameter

{
  "accessor_id": "accessor_id_2",
  "accessor_type": "accessor_type_2",
  "accessor_public_key": "accessor_public_key_2",
  "accessor_group_id": "accessor_group_id",
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
}

SetValidator

Parameter

{
  "public_key": "5/6rEo7aQYq31J32higcxi3i8xp9MG/r5Ho5NemwZ+g=",
  "power": 0
}

Expected Output

log: "success"

SetDataReceived

Parameter

{
  "requestId": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6",
  "service_id": "statement",
  "as_id": "AS1"
}

Expected Output

log: "success"

UpdateNodeByNDID

Parameter

{
  "node_id": "IdP1",
  "max_ial": 2.3,
  "max_aal": 2.4
}

Expected Output

log: "success"

UpdateIdentity

Parameter

{
  "hash_id": "ece8921066562be07ba4ec44449646fc3b48d6b8a660a2e1e6a4bc7117edebba",
  "ial": 2.2
}

Expected Output

log: "success"

DeclareIdentityProof

Parameter

{
  "identity_proof": "Magic",
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
}

Expected Output

log: "success"

UpdateServiceDestination

Parameter

{
  "service_id": "statement",
  "min_ial": 1.4,
  "min_aal": 1.5
}

Expected Output

log: "success"

UpdateService

Parameter

{
  "service_id": "statement",
  "service_name": "Bank statement (ย้อนหลัง 3 เดือน)"
}

Expected Output

log: "success"

Query function

GetNodeMasterPublicKey

Parameter

{
  "node_id": "RP1"
}

Expected Output

{
  "master_public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1QXXrV7X1b8uFL1PW7+F\nimlAwxwbEMG5hFru1CN8WsRt8ZVQIkXRpiwNNXh1GS0Qmshnv8pKaNCZ5q5wFdUe\nlYspZHVRbIkHiQAaEU5yG9SyavHsDntUOd50PQ3nC71feW+ff8tvQcJ7+gqf8nZ6\nUAWpG4bvakPtrJ81h4/Qc23vhtbcouP0adgdw6UA0kcdGhTESYMBU0dx/NNysvJh\nNx36z2UU6kbQ3a2/bINEZAgLfJ7/Y+/647+tc7bUYdqj3dNkbnk1xiXh5dTLsiow\n5Xvukpy2uA44M/r2Q5VRfbH2ZrBZlgf/XEOZs7zppySgaTWRB5eDTm+YxxyOyykn\n8wIDAQAB\n-----END PUBLIC KEY-----\n"
}

GetNodePublicKey

Parameter

{
  "node_id": "RP1"
}

Expected Output

{
  "public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAwCB4UBzQcnd6GAzPgbt9j2idW23qKZrsvldPNifmOPLfLlMusv4E\ncyJf4L42/aQbTn1rVSu1blGkuCK+oRlKWmZEWh3xv9qrwCwov9Jme/KOE98zOMB1\n0/xwnYotPadV0de80wGvKT7OlBlGulQRRhhgENNCPSxdUlozrPhrzGstXDr9zTYQ\noR3UD/7Ntmew3mnXvKj/8+U48hw913Xn6btBP3Uqg2OurXDGdrWciWgIMDEGyk65\nNOc8FOGa4AjYXzyi9TqOIfmysWhzKzU+fLysZQo10DfznnQN3w9+pI+20j2zB6gg\npL75RjZKYgHU49pbvjF/eOSTOg9o5HwX0wIDAQAB\n-----END RSA PUBLIC KEY-----\n"
}

GetIdpNodes

Parameter

{
  "hash_id": "ece8921066562be07ba4ec44449646fc3b48d6b8a660a2e1e6a4bc7117edebba",
  "min_ial": 3,
  "min_aal": 3,
}

Expected Output

{
  "node": [
    {
      "node_id": "IdP1",
      "name": "IdP Number 1 from ...",
      "max_ial": 3,
      "max_aal": 3
    },
    {
      "node_id": "IdP2",
      "name": "",
      "max_ial": 3,
      "max_aal": 3
    }
  ]
}

GetAsNodesByServiceId

Parameter

{
  "service_id": "statement"
}

Expected Output

{
  "node": [
    {
      "node_id": "AS1",
      "name": "AS1",
      "min_ial": 1.1,
      "min_aal": 1.2,
      "service_name": "Bank statement"
    }
  ]
}

GetMsqAddress

Parameter

{
  "node_id": "IdP1"
}

Expected Output

{
  "ip": "192.168.3.99",
  "port": 8000
}

GetRequest

Parameter

{
  "requestId": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
}

Expected Output

{
  "closed": true,
  "timed_out": false,
  "request_message_hash": "hash('Please allow...')",
  "mode": 3
}

GetRequestDetail

Parameter

{
  "requestId": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
}

Expected Output

{
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6",
  "min_idp": 1,
  "min_aal": 3,
  "min_ial": 3,
  "request_timeout": 259200,
  "data_request_list": [
    {
      "service_id": "statement",
      "as_id_list": [],
      "min_as": 1,
      "request_params_hash": "hash",
      "answered_as_id_list": [
        "AS1"
      ],
      "received_data_from_list": [
        "AS1"
      ]
    }
  ],
  "request_message_hash": "hash('Please allow...')",
  "response_list": [
    {
      "ial": 3,
      "aal": 3,
      "status": "accept",
      "signature": "signature",
      "identity_proof": "Magic",
      "private_proof_hash": "Magic",
      "idp_id": "IdP1",
      "valid_proof": true,
      "valid_ial": true
    }
  ],
  "closed": true,
  "timed_out": false,
  "special": false,
  "mode": 3
}

GetNodeToken

Parameter

{
  "node_id": "RP1"
}

Expected Output

{
  "amount": 100
}

GetPriceFunc

Parameter

{
  "func": "CreateRequest"
}

Expected Output

{
  "price": 99.99
}

GetUsedTokenReport

Parameter

{
  "node_id": "AS1"
}

Expected Output

[
  {
    "method": "RegisterServiceDestination",
    "price": 1,
    "data": ""
  },
  {
    "method": "SignData",
    "price": 1,
    "data": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
  }
]

GetServiceDetail

Parameter

{
  "service_id": "statement"
}

Expected Output

{
  "service_name": "Bank statement"
}

GetNamespaceList

Parameter

Expected Output

[
  {
    "namespace": "CID",
    "description": "Citizen ID"
  }
]

CheckExistingIdentity

Parameter

{
   "hash_id": "hash(ns+id)"
}

Expected Output

{
  "exist": true
}

GetAccessorGroupID

Parameter

{
  "accessor_id": "accessor_id_001"
}

Expected Output

{
  "accessor_group_id": "accessor_group_id"
}

GetAccessorKey

Parameter

{
  "accessor_id": "accessor_id_001"
}

Expected Output

{
  "accessor_public_key": "accessor_public_key"
}

GetServiceList

Parameter

Expected Output

[
  {
    "service_id": "statement",
    "service_name": "Bank statement"
  }
]

GetNodeInfo

Parameter

{
  "node_id": "IdP1"
}

Expected Output

{
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArdcKj/gAetVyg6Nn2lDi\nm/UJYQsQCav60EVbECm5EVT8WgnpzO+GrRyBtxqWUdtGar7d6orLh1RX1ikU7Yx2\nSA8Xlf+ZDaCELba/85Nb+IppLBdPywixgumoto9G9dDGSnPkHAlq5lXXA1eeUS7j\niU1lf37lwTZaO0COAuu8Vt9GcwYPh7SSf4/eXabQGbo/TMUVpXX1w5N1A07Qh5DG\nr/ZKzEE9/5bJJJRS635OA2T4gIY9XRWYiTxtiZz6AFCxP92Cjz/sNvSc/Cuvwi15\nycS4C35tjM8iT5djsRcR+MJeXyvurkaYgMGJTDIWub/A5oavVD3VwusZZNZvpDpD\nPwIDAQAB\n-----END PUBLIC KEY-----\n",
  "master_public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArdcKj/gAetVyg6Nn2lDi\nm/UJYQsQCav60EVbECm5EVT8WgnpzO+GrRyBtxqWUdtGar7d6orLh1RX1ikU7Yx2\nSA8Xlf+ZDaCELba/85Nb+IppLBdPywixgumoto9G9dDGSnPkHAlq5lXXA1eeUS7j\niU1lf37lwTZaO0COAuu8Vt9GcwYPh7SSf4/eXabQGbo/TMUVpXX1w5N1A07Qh5DG\nr/ZKzEE9/5bJJJRS635OA2T4gIY9XRWYiTxtiZz6AFCxP92Cjz/sNvSc/Cuvwi15\nycS4C35tjM8iT5djsRcR+MJeXyvurkaYgMGJTDIWub/A5oavVD3VwusZZNZvpDpD\nPwIDAQAB\n-----END PUBLIC KEY-----\n",
  "node_name": "IdP Number 1 from ...",
  "role": "IdP",
  "max_ial": 3,
  "max_aal": 3
}

CheckExistingAccessorID

Parameter

{
  "accessor_id": "accessor_id"
}

Expected Output

{
  "exist": true
}

CheckExistingAccessorGroupID

Parameter

{
  "accessor_group_id": "accessor_group_id"
}

Expected Output

{
  "exist": true
}

GetIdentityInfo

Parameter

{
  "hash_id": "ece8921066562be07ba4ec44449646fc3b48d6b8a660a2e1e6a4bc7117edebba",
  "node_id": "IdP1"
}

Expected Output

{
  "ial": 3
}

GetDataSignature

Parameter

{
  "node_id": "AS1",
  "service_id": "statement",
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
}

Expected Output

{
  "signature": "sign(data,asKey)"
}

GetIdentityProof

Parameter

{
  "idp_id": "IdP1",
  "request_id": "ef6f4c9c-818b-42b8-8904-3d97c4c520f6"
}

Expected Output

{
  "identity_proof": "Magic"
}

About

NDID tendermint ABCI app

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Go 98.7%
  • Shell 1.3%