---
# System prepended metadata

title: I-am-human Backend Flow

---

# I-am-human Backend Flow

Author: Oleksiy Pyltsov

## Summary

`i-am-human' project provides an opportunity to check that the owner of the NEAR account is a unique person. Soulbound Tokens (SBT) of various types are minted on the account, which confirms this. [Spec for i-am-human v1.0](https://hackmd.io/@Kazander/ryHHniFqi#51-Known-Issues).

For one type of SBT, a system is used in which the verification of a person's uniqueness takes place through verification at [GoodDollar](https://gooddollar.org). This document describes the flow of interaction between all components, including the Backend.

## Components

The following components are involved in this flow:

- Frontend - interacts with the user
- Backend - makes checks that cannot be done in Frontend or Smart Contract
- Smart Contract - mints SBT for NEAR account
- GoodDollar - web3 protocol that, among other things, checks the uniqueness of a person using a face scan.

## Backend

The Frontend will provide a GoodDollar account, and in response, the Backend will send a cryptographically signed proof verifying that the account has successfully undergone a face scan procedure. This procedure is executed during the initial `claim` of GoodDollar tokens. The Backend verifies whether the `claim` function of the GoodDollar smart contract has been invoked (they use blockchain  [Fuse](https://fuse.io)). After generating the proof, the Backend will sign it with their private key and transmit it back to the Frontend.

TODO /api-call

## Flow

```mermaid
sequenceDiagram
    Frontend->>Backend: GoodDollar auth token
    Backend->>Backend: Check on Fuse that account calls claim()
    Backend->>Frontend: Proof signed by Backend key
    Frontend->>Smart Contract: mint(backend_proof, proof_signature)
    Note over Smart Contract: verify gooddollar address uniqueness, signature, mint SBT
```

The following actions will be taken:

- Frontend 
  - sends an auth token, as it was received from GoodDollar. The parameters we are interested in: blockchain address (a.value), signature (sig) and creation time (nonce.value)
- Backend
  - verifies the signature in the auth token
  - verifies that the blockchain address called the `claim` method in the GoodDollar smartcontract and it completed successfully
  - forms a proof, the format of which is described below, and signs with his ed25519 private key
  - sends proof and signature to Frontend, or an error
- Frontend
  - receives a response from the Backend
  - calls the `sbt_mint` function on behalf of the user, where it passes the proof and signature
  - displays to the user that he received an SBT or an error
- Smart Contract
   - checks that proof and signature are valid
   - checks that the NEAR account does not have an SBT
   - checks that SBT is not registered on the GoodDollar blockchain address
   - mint SBT

### Backend Proof format

```json
{
  "gooddollar": "0x388C818CA8B9241b393131C08a736A67ccB19297",
  "expire": 1676565421
}
```
