Hyperledger Indy ( indy-vdr)

hop6·2021년 8월 20일
0

Indy-vdr (Verifiable Data Registry)

GitHub에 보면,
This library is derived from Hyperledger Indy SDK for the more limited use case of connecting to an Indy Node blockchain ledger. It is written in Rust and currently includes a Python wrapper and a standalone proxy server.

보다 좁은 범위의 사용처( 원장 풀에 접속하고, 해당 원장에 트랜잭션을 보내거나 원장의 데이터를 가져올 수 있는 )에서 사용된다고 하는데, 그렇다면 Indy-sdk 보다 가벼운지 확인할 필요가 있어 보인다.
일단 Indy-sdk는 golang을 지원하지 않는데 Indy-vdr은 golang을 지원한다. 그것만으로 쓸 이유가 충분할 경우가 있을 것 같다…

코드를 보면, did를 생성하거나 쿼리할 수 있고 request도 작성하여 트랜잭션을 보낼 수 있다.

Golang wrappers도 제공해줘서 간단하게 golang으로 테스트를 해보려고 한다.

코드를 작성하기 전에… Indy-vdr을 빌드하고 libindy-vdr 라이브러리를 알맞은 위치에 놓아줘야 한다.
( 테스트 환경은 Ubuntu 18.04 )

$ git clone https://github.com/hyperledger/indy-vdr.git
$ cd Indy-vdr

// Rust 설치
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ cargo build --lib

// 해당 작업 안하면 go run할 때 라이브러리 못찾는다고 에러 뜸…
$ cp /home/USERNAME/indy-vdr/target/release/deps/libindy_vdr.* /use/local/lib

$ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

준비는 다 되었으니 이제 코드를 작성한다…

main.go

package main

import (
        "encoding/json"
        "fmt"
        "io"
        "os"

        "github.com/hyperledger/indy-vdr/wrappers/golang/vdr"
)

type ReadReply struct {
        Type          string      `json:"type"`
        Identifier    string      `json:"identifier,omitempty"`
        ReqID         uint32      `json:"reqId"`
        SeqNo         uint32      `json:"seqNo"`
        TxnTime       uint32      `json:"TxnTime"`
        Data          interface{} `json:"data"`
        SignatureType string      `json:"signature_type,omitempty"`
        Origin        string      `json:"origin,omitempty"`
        Dest          string      `json:"dest,omitempty"`
        Ref           uint32      `json:"ref,omitempty"`
        Tag           string      `json:"tag,omitempty"`
}


func main() {
        genesisFile, err := getGenesisFile()
        if err != nil {
                fmt.Print(err)
                return
        }

        defer  genesisFile.Close()

        client, err := vdr.New(genesisFile)
        if err != nil {
                fmt.Print(err)
                return
        }

        err = client.RefreshPool()
        if err != nil {
                fmt.Print(err)
                return
        }

        rply, err := client.GetNym("4zRGZz6aGepQvqSbeguWp9")
        if err != nil {
                fmt.Print(err)
                return
        }

        toByte, _ := json.Marshal(rply)

        var response ReadReply
        err = json.Unmarshal(toByte, &response)

        if response.Data == nil {
                fmt.Print("non exists did")
                return
        }

        fmt.Println("Exist!")
        fmt.Println(response.Data)
}

func getGenesisFile() (genesisFile io.ReadCloser, err error) {
        genesisFile, err = os.Open("./pool_transactions_genesis")
        if err != err {
                return
        }
        return
}

Indy network의 pool_transactions_genesis를 이용하여 client를 생성하고 did를 원장으로부터 쿼리하는 코드다.

GitHub repo에 들어가서 파라미터의 타입과 리턴값만 잘 신경써주며 작성하면 된다.

좀 더 사용해봐야 알겠지만, go로 작성하고 싶은데 Indy-sdk 는 golang으로 지원해주지 않아 aries framework 를 써야하나 싶었던 나에게는 아주 반가운 라이브러리인 것 같다.

4개의 댓글

comment-user-thumbnail
2023년 7월 9일

안녕하세요 혹시 아무리 빌드를 해도 /indy-vdr/target/release/deps 해당 위치에선 libindy_vdr. 관련 파일들이 없어서, cp /home/USERNAME/indy-vdr/target/release/deps/libindy_vdr. /use/local/lib 해당 명령어를 실행할 수가 없는데요, 이 경우에는 어떻게 해야 할까요?

1개의 답글