Skip to content

Commit 3f80bdd

Browse files
authored
Merge pull request #623 from 0xPolygonID/feature/support-custom-networks
feat: Support custom networks
2 parents 4427dc2 + ea7c195 commit 3f80bdd

File tree

8 files changed

+88
-5
lines changed

8 files changed

+88
-5
lines changed

.env-api.sample

+1
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ ISSUER_API_IDENTITY_BLOCKCHAIN=polygon
1111
ISSUER_API_IDENTITY_NETWORK=mumbai
1212
ISSUER_API_UI_KEY_TYPE=BJJ
1313
ISSUER_API_ENVIRONMENT=local
14+
ISSUER_CUSTOM_DID_METHODS='[{"blockchain":"linea","network":"testnet","networkFlag":"0b01000001","chainID":59140}]'

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,12 @@ In order to make the UI work, we will need configure some env variables in the `
175175
ISSUER_API_UI_SERVER_URL={PUBLICLY_ACCESSIBLE_URL_POINTING_TO_ISSUER_API_UI_SERVER_PORT}
176176
```
177177
178+
> **_NOTE:_** It is possible to register custom did methods. This field accepts an array of objects in JSON format.</br>
179+
> Example:
180+
```
181+
ISSUER_CUSTOM_DID_METHODS='[{"blockchain":"linea","network":"testnet","networkFlag":"0b01000001","chainID":59140}]'
182+
```
183+
178184
2. Generate Issuer DID:
179185
180186
```bash

cmd/issuer_initializer/main.go

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ func main() {
4747

4848
log.Config(cfg.Log.Level, cfg.Log.Mode, os.Stdout)
4949

50+
services.RegisterCustomDIDMethods(cfg.CustomDIDMethods)
51+
5052
if err := cfg.Sanitize(ctx); err != nil {
5153
log.Error(ctx, "there are errors in the configuration that prevent server to start", "err", err)
5254
return

cmd/platform/main.go

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ func main() {
5353
return
5454
}
5555

56+
services.RegisterCustomDIDMethods(cfg.CustomDIDMethods)
57+
5658
log.Config(cfg.Log.Level, cfg.Log.Mode, os.Stdout)
5759

5860
if err := cfg.Sanitize(ctx); err != nil {

cmd/platform_ui/main.go

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ func main() {
6767
return
6868
}
6969

70+
services.RegisterCustomDIDMethods(cfg.CustomDIDMethods)
71+
7072
storage, err := db.NewStorage(cfg.Database.URL)
7173
if err != nil {
7274
log.Error(ctx, "cannot connect to database", "err", err)

go.sum

+2-4
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,8 @@ github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
355355
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
356356
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
357357
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
358+
github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M=
359+
github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
358360
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
359361
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
360362
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
@@ -559,12 +561,8 @@ github.com/iden3/go-schema-processor v1.3.1 h1:LJfFInfYGMOp0bTKKC17R8q4XI+VtqhFL
559561
github.com/iden3/go-schema-processor v1.3.1/go.mod h1:NwJ1nuGdRlCFaN1/V6mS0AOAdvpLcGf4KKq0mluLG7U=
560562
github.com/iden3/go-schema-processor/v2 v2.2.0 h1:sYPqLs72pEWXIfF0/MOv9AFm3+IGutRM3yClWRrjheg=
561563
github.com/iden3/go-schema-processor/v2 v2.2.0/go.mod h1:Ovsrk0839NZgHtoW4hVLAmHoOsHAQZuVNUXd7sIOkLQ=
562-
github.com/iden3/go-schema-processor/v2 v2.3.1 h1:cjsfUZNgyPoHQDEES4vuVod948QC9l35QkoEIat0ghc=
563-
github.com/iden3/go-schema-processor/v2 v2.3.1/go.mod h1:BcHVDZyn8q8vUlL+XpOo7hpwXmEjxzO8ao1LkvFsM+k=
564564
github.com/iden3/iden3comm/v2 v2.1.0 h1:op2X3y/H9khizcdoYKf3iRAQFt/l5dsip47sJu1kv7Q=
565565
github.com/iden3/iden3comm/v2 v2.1.0/go.mod h1:G+ufR/M28O3PKMVrkUqCuoYfjiEkGFWvf8oF2BmFC6c=
566-
github.com/iden3/iden3comm/v2 v2.2.0 h1:cftP0uP8+/1+9r/Fin1FDbSDZuqIoXZv+EITw3/bS5Q=
567-
github.com/iden3/iden3comm/v2 v2.2.0/go.mod h1:IBdraWsFyChVTArxaE2zr4ALhw7eetJFpEukj2qimeg=
568566
github.com/iden3/merkletree-proof v0.0.4 h1:o1XXws6zb7+BBDQYXlo0GPUH+jUY3+GxkT88U1C4Sb8=
569567
github.com/iden3/merkletree-proof v0.0.4/go.mod h1:D49CVDG/tshMiZuDCxWjGJoNplRg9y9XIlg9/eMSYOc=
570568
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=

internal/config/config.go

+54-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package config
22

33
import (
44
"context"
5+
"encoding/json"
56
"errors"
67
"fmt"
78
"net/url"
89
"os"
910
"path/filepath"
1011
"regexp"
1112
"runtime"
13+
"strconv"
1214
"strings"
1315
"time"
1416

@@ -46,7 +48,8 @@ type Configuration struct {
4648
IPFS IPFS `mapstructure:"IPFS"`
4749
VaultUserPassAuthEnabled bool
4850
VaultUserPassAuthPassword string
49-
CredentialStatus CredentialStatus `mapstructure:"CredentialStatus"`
51+
CredentialStatus CredentialStatus `mapstructure:"CredentialStatus"`
52+
CustomDIDMethods []CustomDIDMethods `mapstructure:"-"`
5053
}
5154

5255
// Database has the database configuration
@@ -90,6 +93,43 @@ type Ethereum struct {
9093
TransferAccountKeyPath string `tip:"Transfer account key path"`
9194
}
9295

96+
// CustomDIDMethods struct
97+
// Example: ISSUER_CUSTOM_DID_METHODS='[{"blockchain":"linea","network":"testnet","networkFlag":"0b01000001","chainID":59140}]'
98+
type CustomDIDMethods struct {
99+
Blockchain string `tip:"Identity blockchain for custom network"`
100+
Network string `tip:"Identity network for custom network"`
101+
NetworkFlag byte `tip:"Identity network flag for custom network"`
102+
ChainID int `tip:"Chain id for custom network"`
103+
}
104+
105+
// UnmarshalJSON implements the Unmarshal interface for CustomNetwork
106+
func (cn *CustomDIDMethods) UnmarshalJSON(data []byte) error {
107+
aux := struct {
108+
Blockchain string `json:"blockchain"`
109+
Network string `json:"network"`
110+
NetworkFlag string `json:"networkFlag"`
111+
ChainID int `json:"chainId"`
112+
}{}
113+
114+
if err := json.Unmarshal(data, &aux); err != nil {
115+
return err
116+
}
117+
if len(aux.NetworkFlag) != 10 || aux.NetworkFlag[:2] != "0b" {
118+
return errors.New("invalid NetworkFlag format")
119+
}
120+
flag, err := strconv.ParseUint(aux.NetworkFlag[2:], 2, 8)
121+
if err != nil {
122+
return err
123+
}
124+
125+
cn.Blockchain = aux.Blockchain
126+
cn.Network = aux.Network
127+
cn.NetworkFlag = byte(flag)
128+
cn.ChainID = aux.ChainID
129+
130+
return nil
131+
}
132+
93133
// Prover struct
94134
type Prover struct {
95135
ServerURL string
@@ -344,6 +384,17 @@ func Load(fileName string) (*Configuration, error) {
344384
if err := viper.Unmarshal(config); err != nil {
345385
log.Error(ctx, "error unmarshalling configuration", "err", err)
346386
}
387+
388+
jsonStr := viper.GetString("CUSTOM_DID_METHODS")
389+
var customDIDMethods []CustomDIDMethods
390+
if jsonStr != "" {
391+
if err := json.Unmarshal([]byte(jsonStr), &customDIDMethods); err != nil {
392+
log.Error(ctx, "error unmarshalling custom networks", "err", err)
393+
return nil, err
394+
}
395+
}
396+
config.CustomDIDMethods = customDIDMethods
397+
347398
checkEnvVars(ctx, config)
348399
return config, nil
349400
}
@@ -452,6 +503,8 @@ func bindEnv() {
452503
_ = viper.BindEnv("APIUI.IdentityNetwork", "ISSUER_API_IDENTITY_NETWORK")
453504
_ = viper.BindEnv("APIUI.KeyType", "ISSUER_API_UI_KEY_TYPE")
454505

506+
_ = viper.BindEnv("ISSUER_CUSTOM_DID_METHODS")
507+
455508
viper.AutomaticEnv()
456509
}
457510

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package services
2+
3+
import (
4+
core "github.com/iden3/go-iden3-core/v2"
5+
"github.com/polygonid/sh-id-platform/internal/config"
6+
)
7+
8+
// RegisterCustomDIDMethods registers custom DID methods
9+
func RegisterCustomDIDMethods(customdDids []config.CustomDIDMethods) {
10+
for _, cdid := range customdDids {
11+
params := core.DIDMethodNetworkParams{
12+
Method: core.DIDMethodPolygonID,
13+
Blockchain: core.Blockchain(cdid.Blockchain),
14+
Network: core.NetworkID(cdid.Network),
15+
NetworkFlag: cdid.NetworkFlag,
16+
}
17+
core.RegisterDIDMethodNetwork(params, core.WithChainID(cdid.ChainID))
18+
}
19+
}

0 commit comments

Comments
 (0)