# Developer Key

To access SendingNetwork's developer resources, developers are kindly requested to initiate the process by requesting a developer key through email. This key is essential for unlocking access to all the Edge Network features and capabilities.&#x20;

This guide shows how to create and use your Developer Key for accessing the Edge Network.

## Create Developer Key

To obtain a developer key and unlock our platform's potential, please follow these steps:

1. Send an email to ***<developer@sending.network>*** with the subject line: "Developer Key Request".
2. In the email, kindly provide your name and a brief overview of your project, outlining its purpose and scope.

Our team will promptly review your request and provide you with the necessary developer key to accelerate your integration process.

## Use Developer Key

SendingNetwork recommends securely storing the developer key on your self-controlled server and developing a backend API to access the server for signature retrieval during login.

Kindly establish a secure key server for the proper management of your developer key. Additionally, it is necessary to develop a backend API to receive a challenge from the client and return the Ethereum ECDSA signature from your key server. Please

The key verification process occurs during user login, and the workflow is as follows:

1. Check existing DIDs linked to the current wallet address.
2. Get login message using one of the DIDs or the wallet address if no DID is found.
3. Request a message signature with the developer key.
4. Request a message signature with the user wallet account.
5. Login by sending both signatures to the SDN server.

<figure><img src="https://2753396368-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F1hPSqZauZ9JZ15UAJezj%2Fuploads%2FxvwT11YrLo5WgRlqnWhn%2Fimage.png?alt=media&#x26;token=01e836d2-110f-47e0-acc4-7d8b2839a178" alt=""><figcaption></figcaption></figure>

### Ethereum ECDSA Signature

The server uses the *Ethereum ECDSA* algorithm for signing. Below is an example code in *Golang*:

```go
package main

import (
	"github.com/ethereum/go-ethereum/accounts"
	"github.com/ethereum/go-ethereum/common/hexutil"
	"github.com/ethereum/go-ethereum/crypto"
)

func main() {
	// replace with your private key (hex encoding)
	keyHex := "81a36f13408b99c59f604e75c2614e6df97c6afb10ba728ad7c7dc423d4b2f4b"
	// message to be signed
	message := "hello"
	privateKey, _ := crypto.HexToECDSA(keyHex)
	messageHash := accounts.TextHash([]byte(message))
	signature, _ := crypto.Sign(messageHash, privateKey)
	signatureHex := hexutil.Encode(signature)
	println(signatureHex)
}
```

## Login Flow Example

Check out the code snippet below that gives you a glimpse of how a regular login works, with the added step of verifying the developer key. The example is given in JavaScript, please refer to the specific sdk for more information.

```javascript
import ethers from "ethers";
import crypto from "crypto";
import sdk from "sendingnetwork-js-sdk";
import request from "request";


const login = (base_url) => {    // Pass the server URL as input value
    const prefix = 'did:pkh:eip155:1:';
    var privateKey = '';
    if (privateKey == '') {
      var id = crypto.randomBytes(32).toString('hex');
      privateKey = '0x' + id;
      console.log('SAVE BUT DO NOT SHARE THIS:', privateKey);
    }
    var client = sdk.createClient({
      baseUrl: base_url,
      request: request,
    });
    var wallet = new Wallet(privateKey);
    const address = wallet.address;
    const { data } = await client.getDIDList(`${address}`);
    let [did] = data;
    if (!did) {
      const {
        did: newDid,
        message: cMessage,
        updated: cUpdated,
      } = await client.createDID(`${prefix}${address}`);
      did = newDid;
      let signature = await wallet.signMessage(cMessage);
      await client.saveDID(newDid, {
        signature,
        operation: 'create',
        updated: cUpdated,
        address: `${prefix}${address}`,
      });
    }
    const { message: lMessage, updated } = await client.preDIDLogin(did);
    // request signature with wallet account
    let sign = await wallet.signMessage(lMessage);
    
    // request signature with server developer key
    let serverSign = await serverSignMessage(lMessage);
    
    let identifier = {
      did,
      token: sign,
      app_token: serverSign,
    };

    let deviceId = localStorage.getItem('mx_device_id') || null;

    let loginParams = {
      type: 'm.login.did.identity',
      updated,
      identifier,
      device_id: deviceId,
    };

    const { access_token, user_id, device_id } = await client.DIDLogin(
      loginParams,
    );
};
```
