두개의 가장 큰 차이점
1.4버전에서는 shim과 peer 라이브러리를 가져와서 사용
import(
"github.com/hyperledger/fabric/core/chaincode/shim"
sc "github.com/hyperledger/fabric/protos/peer"
)
2.2버전에서는 contractapi 라이브러리를 가져와서 사용
1.4버전에서는 chaincode코드 파일내에서 적집 access해서 사용을 하였지만 2.2버전으로 바뀌면서 contractapi안에 shim, peer를 따로 별도로 사용을 하게 되었음.
import(
"github.com/hyperledger/fabric-contract-api-go/contractapi"
)
왜 이렇게 바꾸었을까?
chaincode 작성 시 Init함수와 Invoke함수를 작성 시에 함수호출이나 인자값을 넘길 때 오류가 발생할 수도 있기에 별도로 개발자가 구현을 하지 않고 contractAPI에서 처리를 하게 해주었다.
개발자 입장에서는 편하게 chaincode를 작성할 수 있게 되었다.
그래서 원래는 외부에서 함수를 호출하는 부분이 Init, Invoke함수이기에 함수명을 맨 앞 부분을 대문자로 설정해 주었지만, 2.2버전으로 넘어오게 되면서 Invoke함수는 contractAPI쪽에 따로 빠져서 chaincode내에 작성되어 있는 함수를 호출하기에 chaincode함수이름 자체도 맨앞 부분에 대문자로 설정해줘야 된다.
잘 이해가 되지 않는다면,
2.2버전부터는 chaincode작성 시 함수이름을 소문자가 아닌 대문자로 설정하는 것으로 기억하자
fabcar의 예제로 조금 더 자세한 비교를 해보자
2.2버전 ChangeCarOwner
func (s *SmartContract) ChangeCarOwner(ctx contractapi.TransactionContextInterface, carNumber string, newOwner string) error {
car, err := s.QueryCar(ctx, carNumber)
if err != nil {
return err
}
car.Owner = newOwner
carAsBytes, _ := json.Marshal(car)
return ctx.GetStub().PutState(carNumber, carAsBytes)
}
1.4버전 changeCarOwner
func (s *SmartContract) changeCarOwner(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 2 {
return shim.Error("Incorrect number of arguments. Expecting 2")
}
carAsBytes, _ := APIstub.GetState(args[0])
car := Car{}
json.Unmarshal(carAsBytes, &car)
car.Owner = args[1]
carAsBytes, _ = json.Marshal(car)
APIstub.PutState(args[0], carAsBytes)
return shim.Success(nil)
}
함수명
1.4버전에서는 changeCarOwner와 같이 소문자로 작성을 하였도 상관이 없었지만 2.2버전에서 넘오면서는 ChangeCarOwner로 함수명을 작성을 해야지 오류가 나지 않는다. 이유에 대해서는 위에 설명해놓았다.
2.2 버전에는 Dapp을 이용해서 chaincode를 호출할 경우 contractapi에서 첫번째 글자를 자동으로 대문자로 변경해주기 때문에 dapp부분에서는 호출을 가능하다.
인자
2.2버전 - carNumber string, newOwner string
1.4 버전 - args []string
확실하게 이름으로 인자를 가져오므로써 개발자들이 편리하게 개발을 할 수 있게 변경되었다. 1.4버전에서는 slice를 이용해서 args[0], args[1]로 가져와서 쓰다보면 헷갈 릴 경우가 빈번히 발생하기 때문에 이러한 문제들을 해결하는 방식으로 업그레이드가 되었다고 볼 수 있다.
'BlockChain > ChainCode' 카테고리의 다른 글
shim interface 및 chain code 실행시키기 (0) | 2022.08.09 |
---|---|
ChainCode 작성을 위한 GO언어 설치법 (0) | 2022.07.28 |
두개의 가장 큰 차이점
1.4버전에서는 shim과 peer 라이브러리를 가져와서 사용
import(
"github.com/hyperledger/fabric/core/chaincode/shim"
sc "github.com/hyperledger/fabric/protos/peer"
)
2.2버전에서는 contractapi 라이브러리를 가져와서 사용
1.4버전에서는 chaincode코드 파일내에서 적집 access해서 사용을 하였지만 2.2버전으로 바뀌면서 contractapi안에 shim, peer를 따로 별도로 사용을 하게 되었음.
import(
"github.com/hyperledger/fabric-contract-api-go/contractapi"
)
왜 이렇게 바꾸었을까?
chaincode 작성 시 Init함수와 Invoke함수를 작성 시에 함수호출이나 인자값을 넘길 때 오류가 발생할 수도 있기에 별도로 개발자가 구현을 하지 않고 contractAPI에서 처리를 하게 해주었다.
개발자 입장에서는 편하게 chaincode를 작성할 수 있게 되었다.
그래서 원래는 외부에서 함수를 호출하는 부분이 Init, Invoke함수이기에 함수명을 맨 앞 부분을 대문자로 설정해 주었지만, 2.2버전으로 넘어오게 되면서 Invoke함수는 contractAPI쪽에 따로 빠져서 chaincode내에 작성되어 있는 함수를 호출하기에 chaincode함수이름 자체도 맨앞 부분에 대문자로 설정해줘야 된다.
잘 이해가 되지 않는다면,
2.2버전부터는 chaincode작성 시 함수이름을 소문자가 아닌 대문자로 설정하는 것으로 기억하자
fabcar의 예제로 조금 더 자세한 비교를 해보자
2.2버전 ChangeCarOwner
func (s *SmartContract) ChangeCarOwner(ctx contractapi.TransactionContextInterface, carNumber string, newOwner string) error {
car, err := s.QueryCar(ctx, carNumber)
if err != nil {
return err
}
car.Owner = newOwner
carAsBytes, _ := json.Marshal(car)
return ctx.GetStub().PutState(carNumber, carAsBytes)
}
1.4버전 changeCarOwner
func (s *SmartContract) changeCarOwner(APIstub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 2 {
return shim.Error("Incorrect number of arguments. Expecting 2")
}
carAsBytes, _ := APIstub.GetState(args[0])
car := Car{}
json.Unmarshal(carAsBytes, &car)
car.Owner = args[1]
carAsBytes, _ = json.Marshal(car)
APIstub.PutState(args[0], carAsBytes)
return shim.Success(nil)
}
함수명
1.4버전에서는 changeCarOwner와 같이 소문자로 작성을 하였도 상관이 없었지만 2.2버전에서 넘오면서는 ChangeCarOwner로 함수명을 작성을 해야지 오류가 나지 않는다. 이유에 대해서는 위에 설명해놓았다.
2.2 버전에는 Dapp을 이용해서 chaincode를 호출할 경우 contractapi에서 첫번째 글자를 자동으로 대문자로 변경해주기 때문에 dapp부분에서는 호출을 가능하다.
인자
2.2버전 - carNumber string, newOwner string
1.4 버전 - args []string
확실하게 이름으로 인자를 가져오므로써 개발자들이 편리하게 개발을 할 수 있게 변경되었다. 1.4버전에서는 slice를 이용해서 args[0], args[1]로 가져와서 쓰다보면 헷갈 릴 경우가 빈번히 발생하기 때문에 이러한 문제들을 해결하는 방식으로 업그레이드가 되었다고 볼 수 있다.
'BlockChain > ChainCode' 카테고리의 다른 글
shim interface 및 chain code 실행시키기 (0) | 2022.08.09 |
---|---|
ChainCode 작성을 위한 GO언어 설치법 (0) | 2022.07.28 |