C Oracle Blockchain Platform에서 EVM으로 Solidity Smart Contracts 실행
Oracle Blockchain Platform에서 체인 코드로 배포된 이더리움 가상 머신(EVM)을 사용하여 Solidity 스마트 계약을 실행할 수 있습니다.
EVM은 이더리움 네트워크에서 Solidity 스마트 계약을 실행합니다. EVM은 Hyperledger Burrow 프로젝트를 통해 생성되었으며 Hyperledger Fabric에 통합되었습니다. 이 프로젝트를 통해 Hyperledger Fabric 허가 블록체인 플랫폼을 사용하여 Solidity와 같은 EVM 호환 언어로 작성된 이더리움 스마트 계약과 상호 작용할 수 있습니다. 참조: Hyperledger Fabric EVM chaincode.
- EVM 체인코드 패키지를 Oracle Blockchain Platform에 업로드합니다.
- 채널에 EVM 체인 코드를 배치합니다.
- 리믹스 IDE를 사용하여 Solidity 스마트 계약에 대한 바이트 코드를 생성합니다.
- 배포된 EVM 체인 코드에 스마트 계약 바이트 코드를 배포합니다. 배치에서 반환된 주소를 사용하여 트랜잭션을 보냅니다.
fabric-chaincode-evm:release-0.4에서 테스트되었으며 다른 릴리스에서는 작동하지 않을 수 있습니다.
EVM 체인코드 패키지 설정
스마트 계약을 배포하려면 먼저 EVM 체인코드 패키지를 설정해야 합니다. 체인코드 패키지 폴더를 생성하려면 다음 단계를 완료합니다.
- 다음 GitHub 저장소에서 EVM 체인코드 패키지(
.zip파일)를 다운로드합니다. Hyperledger Fabric EVM chaincode - 다운로드한 파일
fabric-chaincode-evm-release-0.4.zip의 압축을 풉니다. - 추출된 파일에서
fabric-chaincode-evm-release-0.4/evmcc디렉토리로 이동합니다. go.sum파일과vendor디렉토리를 삭제합니다.go mod명령을 사용하여 모든 종속 Go 모듈을 공급업체에 제공합니다.go mod tidy go mod vendorfabric-chaincode-evm-release-0.4/emvcc/vendor/github.com/hyperledger디렉토리로 이동합니다./hyperledger디렉토리에fabric-chaincode-evm/evmcc디렉토리를 생성합니다.- 다음 폴더를
fabric-chaincode-evm-release-0.4/evmcc디렉토리에서fabric-chaincode-evm-release-0.4/evmcc/vendor/github.com/hyperledger/fabric-chaincode-evm/evmcc디렉토리로 이동합니다./address/event/eventmanager/mocks/statemanager

- 최상위 레벨
fabric-chaincode-evm-release-0.4/evmcc폴더를.zip형식으로 압축하고 이름을 바꿉니다. 다음 단계에서는evmcc.zip를 예제 이름으로 사용합니다.
Oracle Blockchain Platform에 EVM Chaincode 배포
EVM 체인코드 패키지를 생성한 후 Oracle Blockchain Platform에 배포합니다.
- Oracle Blockchain Platform 콘솔에 로그인합니다.
- 체인코드 탭에서 새 체인코드 배포를 선택합니다.
- 빠른 배치를 선택하고 다음 정보를 입력합니다.
- 패키지 레이블: 체인 코드 패키지에 대한 설명을 입력합니다.
- 체인코드 언어: GoLang.
- 체인 코드 이름: 체인 코드의 이름을 입력합니다. (예:
soliditycc) - 버전:
v1. - Init-required: 선택하지 않은 상태로 둡니다.
- 채널: 체인코드를 설치할 채널을 선택합니다.
- 체인코드 소스: 이전 단계에서 생성한
evmcc.zip패키지를 업로드합니다.
정보를 제출한 후 EVM 체인코드는 체인코드 페이지에 표시되며 설치하도록 선택한 각 채널에 배치된 체인코드로 나열됩니다.
Solidity 스마트 계약 생성 및 컴파일
- 브라우저 기반 리믹스 IDE(https://remix.ethereum.org/)를 엽니다.
- Solidity 스마트 계약을 이미 작성한 경우 Remix로 가져옵니다.
- Solidity 스마트 계약서가 작성되지 않은 경우 리믹스에서 Solidity 파일(
.sol파일)을 만들고 다음 단계 중 하나를 수행합니다.- Solidity에 익숙하다면 자신만의 스마트 계약 파일을 만드세요.
- Solidity 설명서에 제공된
SimpleStorage샘플 코드 사용: 단결성: 스마트 계약 소개 - 이 예제에 사용되는 샘플 코드를 사용합니다. 이 코드는
string name값을 입력으로 사용하고set(name)및get()함수를 사용하여 출력 문자열과 동일한 값을 출력합니다.pragma solidity ^0.4.0; contract Myname { string public yourName; function set(string name) public { yourName = name; } function get() public view returns (string) { return yourName; } }
- 스마트 계약을 컴파일합니다. 리믹스에서 통합 컴파일러 패널을 열고 스마트 계약 탭이 열려 있는지 확인하여 컴파일할 파일로 선택하고 컴파일러 버전을 최신 4로 설정합니다. X 버전, 컴파일 순으로 선택합니다.

- 파일이 컴파일된 후 Bytecode 아이콘을 선택하여 바이트 코드를 JSON 문서로 클립보드에 복사합니다.
- 복사한 바이트 코드를 텍스트 편집기에 붙여넣고 저장합니다.
스마트 계약 배포
"object" 필드입니다. 샘플 스마트 계약의 EVM 바이트 코드입니다."object": "608060405234801561001057600080fd5b50610410806100206000396000f30060
8060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463
ffffffff1680634ed3885e1461005c5780636d4ce63c146100c5578063d97d663014610155575b600080fd5b34801561
006857600080fd5b506100c3600480360381019080803590602001908201803590602001908080601f01602080910402
602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101
e5565b005b3480156100d157600080fd5b506100da6101ff565b60405180806020018281038252838181518152602001
91508051906020019080838360005b8381101561011a5780820151818401526020810190506100ff565b505050509050
90810190601f1680156101475780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b34801561016157600080fd5b5061016a6102a1565b60405180806020018281038252838181518152602001
91508051906020019080838360005b838110156101aa57808201518184015260208101905061018f565b505050509050
90810190601f1680156101d75780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b80600090805190602001906101fb92919061033f565b5050565b6060600080546001816001161561010002
03166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615
6101000203166002900480156102975780601f1061026c57610100808354040283529160200191610297565b82019190
6000526020600020905b81548152906001019060200180831161027a57829003601f168201915b505050505090509056
5b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190
818152602001828054600181600116156101000203166002900480156103375780601f1061030c576101008083540402
83529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003
601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f01
6020900481019282601f1061038057805160ff19168380011785556103ae565b828001600101855582156103ae579182
015b828111156103ad578251825591602001919060010190610392565b5b5090506103bb91906103bf565b5090565b61
03e191905b808211156103dd5760008160009055506001016103c5565b5090565b905600a165627a7a72305820a990d4
0b57c66329a32a18e847b3c18d6c911487ffadfed2098e71e8cafa0c980029",to주소입니다.- Ethereum 트랜잭션에 필요한
input바이트 코드입니다.
스마트 계약을 배포하기 위해 to 필드는 0 주소이고 input는 계약의 컴파일된 EVM 바이트 코드입니다. 따라서 invoke 명령에 두 개의 인수가 제공됩니다. 전통적으로 체인코드 내부에서 함수 이름이 되어야 하는 첫 번째 인수는 이제 0000000000000000000000000000000000000000이고 두 번째 인수는 Solidity 스마트 계약 바이트코드입니다.
- Oracle Blockchain Platform에서 Solidity 스마트 계약을 배포하려면 다음 REST 프록시 호출을 수행하여 두 개의 인수를 EVM으로 전송할 수 있습니다.
{ "chaincode": "<evmcc-ccid>", "args": [ "0000000000000000000000000000000000000000", "<bytecode-of-the-smart-contract>" ], "timeout": 0, "sync": true }다음 예에서는 cURL을 사용하여 Solidity 스마트 계약을soliditycc라는 이름의 Oracle Blockchain Platform에 배포합니다.curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/transactions' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"<evmcc-ccid>","args":["0000000000000000000000000000000000000000","<bytecode-of-the-smart-contract>"],"timeout":0,"sync":true}' - 트랜잭션의 응답
payload은 배포된 계약에 대한 계약 주소입니다. 이 주소를 복사하여 저장합니다. 계약 주소는 스마트 계약 기능을 실행할 때 사용됩니다.
이 예에서 스마트 계약 주소는66b92979bb66d645371b3247177e4b2513cb9834입니다.
- 메소드 및 입력 파라미터의 해시 값을 사용하여 상호 작용합니다.
- 메소드 이름과 입력 파라미터를 직접 사용하여 상호 작용합니다.
해시 값을 사용하여 스마트 계약과 상호 작용
스마트 계약 주소가 있으면 다음 호출을 사용하여 REST 프록시를 통해 배포된 스마트 계약과 상호 작용할 수 있습니다.
함수를 실행하려면 호출 및 query 트랜잭션을 사용하되 파라미터는 다릅니다. 샘플 계약에는 get 및 set의 두 함수가 포함됩니다.
이러한 트랜잭션에서 to 필드는 계약 주소이고 input 필드는 필수 인수와 연결된 함수 실행 해시입니다.
트랜잭션을 실행하려면 함수 실행의 해시를 획득해야 합니다. 이렇게 하는 간단한 방법은 리믹스 IDE에서 함수를 실행한 다음 트랜잭션 로그에서 해시를 복사하는 것입니다.
- 리믹스 IDE에서 트랜잭션 배포 및 실행 패널을 엽니다. 계약 필드에서 계약이 선택되었는지 확인하고 배포를 선택합니다.

배포가 완료되면 계약이 배포된 계약 목록에 나열됩니다. - 배포된 계약 목록에서 계약을 확장합니다. 스마트 계약 기능이 나열됩니다.
- 트랜잭션을 실행합니다. 제공된 예제에 대해 oracle을 입력한 다음 set를 선택합니다.
- 터미널 창에 트랜잭션 로그가 표시됩니다. 트랜잭션 로그가 최소화된 경우 로그를 선택하여 확장합니다. 옆에 있는 아이콘을 선택하여
input필드(함수 실행 해시)의 값을 복사합니다. 이 값을 계약 주소와 동일한 위치에 저장하고 선행0x를 제거합니다.![완료된 트랜잭션 및 필드 값을 보여주고 함수 실행 해시 값을 포함하는 입력 필드를 가리키는 [배치] 페이지의 화면 캡처입니다. 완료된 트랜잭션 및 필드 값을 보여주고 함수 실행 해시 값을 포함하는 입력 필드를 가리키는 [배치] 페이지의 화면 캡처입니다.](img/sethash.jpg)
- 함수 실행 해시 및 계약 주소가 있는 경우 원시 데이터 인수로 해시 및 주소를 사용하여 Oracle Blockchain Platform에서 설정된 트랜잭션을 실행할 수 있습니다.
다음 예에서는 cURL을 사용하여 트랜잭션을 실행하는 방법을 보여 줍니다.--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/transactions' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000066f7261636c650000000000000000000000000000000000000000000000000000"]}' - Oracle Blockchain Platform 콘솔을 열고 트랜잭션이 원장에 나열되는지 확인합니다.
스마트 계약의 get 함수를 사용하여 질의와 같은 다른 트랜잭션을 실행하려면 리믹스에서 함수 실행 해시를 생성한 다음 이를 계약 주소와 결합할 수 있습니다.
- 트랜잭션 배포 및 실행 패널의 리믹스에서 계약이 배포된 계약 아래에 계속 나열되는지 확인합니다. 그렇지 않은 경우 재배포합니다.
- get을 선택합니다. set 트랜잭션과 마찬가지로 트랜잭션에서 입력을 검색하여 저장하고 선행
0x를 제거합니다.
- 이 트랜잭션 해시 및 계약 주소를 사용하여 Oracle Blockchain Platform에 배포된 체인 코드에 대해 쿼리 트랜잭션을 실행합니다.
다음 예에서는 cURL을 사용하여 트랜잭션을 실행하는 방법을 보여 줍니다.--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
반환된 페이로드에는 질의 중인 자산이 포함됩니다. 예제에서는curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/chaincode-queries' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","6d4ce63c"]}'oracle문자열입니다.