[Go lang] 하이퍼레저 패브릭 체인코드 shim & peer - Init & Invoke
shim / peer / Init / Invoke / GetState / PutState / GetFunctionAndParameters
⭐ 하이퍼레저 패브릭 1.4 ver 기준
package main
import (
"bytes"
"encoding/json" // Marshal 사용
"fmt"
"strconv"
"github.com/hyperledger/fabric/core/chaincode/shim"
sc "github.com/hyperledger/fabric/protos/peer"
)
shim & peer 설치 라이브러리 인터페이스
shim
라이브러리에 내장된 함수
1. GetState( )
👉 원장의 데이터를 읽어올때 사용하는 함수
2. PutState( )
👉 원장의 데이터를 집어넣을때 사용하는 함수
3. GetFunctionAndParameters( )
👉 트랜잭션이 들어왔을때 트랜잭션 내용에 대해서
스마트컨트랙트의 이름과 스마트컨트랙트를 동작시키는데
필요한 파라미터들을 잘라주는 함수
function, args := stub.GetFunctionAndParameters()
👉 Func & Para
들어온 데이터를 스마트컨트랙트 함수 이름과
스마트컨트랙트가 동작하기 위한 파라미터들이 배열형식으로 들어온다
함수 이름과 파라미터를 잘라서 사용할수 있도록 처리
Json 형식으로 데이터를 받는 이유
-
사람이 읽기가 편하다 (적당한 들여쓰기와 데이터시작 시점의 레벨)
-
전송하는 데이터가 바이트 형식이기 때문에 인터넷(네트워크)을 통한 데이터 전달이 가능하다 (데이터 저장용)
Init 함수
func (s *SmartContract) Init(APIstub shim.ChaincodeStubInterface) sc.Response {
return shim.Success(nil)
}
shim
과peer
를 불러와서 체인코드를 작성한다면
⭐Init
과Invoke
를 필수로 써줘야한다
-
개발자가 체인코드를 작성하면 관리자에게 보내준다
-
관리자는 블록체인(패브릭)에 자신의
peer
에게 체인코드를 설치 (copy) -
패브릭 네트워크에 체인코드를 활성화 시킨다 (배포)
-
체인코드를 배포하게되면
-
peer
는 체인코드 컨테이너를 생성 -
해당 체인코드를 체인코드 컨테이너에 보내고 컴파일
-
그럼 트랜잭션을 받을 준비한다
-
체인코드가 활성화 된 후에 제일먼저 실행되는게 Init 함수다 ⭐
-
shim.Success(nil)
👉 체인코드를 배포를 시킨 관리자에게 -
관리자에 요청한 체인코드의 작업이 성공적으로 끝났다는 뜻
-
배포를 했을때 문제가 있다면
Init
함수가 실행되지 않음
Invoke 함수
func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
-
체인코드 배포가 끝나고 어플, 웹서버가 동작을하게 되면
-
사용자가 자신의 단말기(컴퓨터, 핸드폰, IOT 등)로 인터넷을 통해 트랜잭션을 일으킬때
-
트랜잭션 내용이 패브릭 네트워크내에
peer
에게 전달 -
peer
는 트랜잭션을 받아서 -
자신이 보유하고 있는 체인코드 컨테이너쪽에 그 트랜잭션을 보낸다
-
그리고 시뮬레이션을 돌림
-
그때 호출되는게
Invoke
함수이다 -
사용자가 블록체인에 트랜잭션을 일으켰을때
-
데이터를 써 넣는다거나 / 읽어오거나 / 요청하거나 / 데이터를 저장할때
-
반드시 호출되는게
Invoke
함수이다 -
Invoke
함수가 호출되어 동작하게되면peer
는 트랜잭션을 받은것이다