본문 바로가기

GoLang

GoLang 실습

peer위에 코드가 돌아가는 것이다.

코드에 쓰인 특정 기능이 작동할때는 chain-code를 peer위에다가 설치 및 배포 하여 실행하는 것이다.

go lang 프로그램에 반드시 있어야 하는 것 => main function (메인함수)
또한 이 메인함수는 패키지당 단 1개만 있어야 한다.

golang 패키지

"encoding/json"

  • json 마샬링을 위한 패키지
    "fmt"
  • println를 사용할 수 있게 해주는 패키지
    "strconv"
  • 스트링 컨버젼스 > 스트링 형태의 자료를 다양한 다른 자료형으로 변경, 다른 자료형들을 스트링 형태로 변경해주는 스트링컨버팅을 위한 패키지

위처럼 이름만 적혀있는 패키지는 glang에서 기본적으로 탑재 되어있는 패키지

"github.com/hyperledger/fabric-contract-api-go/contractapi"

  • 스마트컨트랙트를 다루게 해주는 패키지
    • 패브릭 개발자가 만들었을 것이다.
    • 예를 들어 getMyData라는 함수(기능)을 만들었다고 치자.
      그 기능을 만든 것은 나지만 그걸 사용하는 쪽을 어디일까?
    • DAPP*
    • dapp은 다른 pc에서 돌고 있다.
    • 체인코드는 peer라는 공간에서 돌고있다.application이 여러가지 올라가 있는데 내가 원하는 기관에만 특정 체인코드를 작동하게 하고 싶을때 private network를 사용한다고 볼 수 있다.
    • 내 dapp이 패브릭 개발자가 만들어놓은 peer에게 부탁해서 함수를 찾는다.
      그럼 peer가 peer내에서 체인코드를 찾아서 실행시켜준다.
  • 체인코드는 체인코드 개발자가 만들었다면 peer는 누가 개발을 했을까?

peer에서 chain code를 실행시키려면 사이에 패키지가 필요하다.
dapp에서 함수이름을 적어주면 그걸 peer가 찾아와서 호출해준다.
어떻게 부를 것인지? 어떻게 찾고 호출할 것인지?

peer(코어 프로그램) -> chain code1을 실행시켜야 한다. (함수를 가져다 써야한다) -> peer가 cc1의 함수이름을 알아야한다.
이때 cc1에 있는 모든 함수이름을 peer에 적어놓을 수 없으니 반대로.

  • invoke()
  • init()
    peer 내부적으로 위에 2개 함수만 사용한다.
    그래서 위 2개 함수에 맞추어서 코드를 만들어 넘겨준다. 그것이 interface

인터페이싱 (interface)

  • cc1에 interface 객체를 써준다. peer에서 인터페이스를 기반으로 함수를 실행시킨다.

chain code를 peer로 넘겨줄때 cc가 제시함 contractapi의 도움을 받아 적절한 형태로 변형 후 peer에게 전달을 해주는 것이다.

 

 

### sdk의 역할
Software Development Kit

  1. 특정 software에서 platform에 있는 기능을 쓰고 싶을때
    • platform에 있는 기능을 software에사 쓸 수 있게끔 길을 터주는 역할(api)
  2. software에서 만든 기능을 platform에서 사용하고 싶을때

위의 상황같은 경우는 software는 chaincode, sdk는 contractAPI, platform은 peer라고 볼 수 있다.

chain code는 내가 만든 코드. 이 코드를 golang으로 돌아가는 peer에 전해줘야함.
어떻게 어떤 형식으로 전해야하는지 모른다.
chain code를 만든사람이 전달할 수 있는 모든 형식을 알고 사용할 수 없기 때문에 sdk에서 그걸 도와주는 것이다.

func main() {
    chaincode, err := contractapi.NewChaincode(new(SmartContract))
}

 

chaincode의 실행가능한 객체 형식을 만들어주는 함수가 NewChaincode.
거기서 실행가능한 코드 결과값이 들어오는 변수가 chaincode
이때 코드를 실행하다 에러가 발생했을때 에러가 들어오는 변수가 err

### new라는 문법은?
- 구조체를 생성하는 문법 즉 생성자
- SmartContract라는 구조체에 맞춘 빈껍데기를 만든 것 이다.

api와 그 안의 함수는 fabric개발자가 만든 것인데 거기서 코드 개발자가 만든 구조체를 어떻게 실행시킬 수 있는가?


- SmartContract 구조체가 NewChaincode의 인터페이스 형식을 따라서 만들었기 때문에 작동할 수 있다.
- contractapi.Contract로 type Contract(GetAfterTransaction, GetInfo...etc)를 가지고 있는 객체로써 SmartContract 구조체 안에 존재하기에 NewChaincode의 인터페이스인 ContractInterface 구조를 따를 수 있다.