이더리움 오라클 계약: 설정 및 오리엔테이션

게시 됨: 2022-03-11

이더리움 스마트 계약은 "새로운 인기" 그 이상입니다. 그들(또는 이와 관련된 것)이 다가오는 인터넷의 새로운 시대에 인간이 서로 비즈니스를 하는 방식을 바꿀 태세를 갖추고 있다고 믿습니다. 그것이 사실인지는 시간이 말해줄 것이다.

이것은 솔리디티와의 이더리움 스마트 계약 개발에 대한 3부작 기사 중 첫 번째 기사이며, 가장 구체적으로 소위 "오라클"과의 계약 사용을 탐구합니다. 이는 기본적으로 다른 스마트 계약에서 사용하기 위해 데이터를 블록체인으로 펌핑하는 계약입니다.

  • 1부: Truffle을 사용한 개발 소개 및 추가 실험을 위한 프로젝트 설정
  • 파트 2: 더 깊은 조사를 위한 코드 탐구
  • 3부: 스마트 계약이 있는 오라클에 대한 개념적 논의

시리즈의 1부인 이 책의 목표는 오라클 계약의 개념, 그 이면의 철학, 또는 그 내용에 대해 매우 깊이 들어가는 것이 아닙니다. 이더리움 오라클 튜토리얼의 이 부분의 목표는 다음과 같습니다.

  • Truffle로 스마트 계약을 구축하도록 설정하십시오.
  • 2부와 3부에서 우리에게 도움이 될 스마트 계약 프로젝트를 구축하십시오.
  • Ethereum 스마트 계약 및 스마트 계약 코딩과 관련된 몇 가지 개념을 소개합니다.
  • Truffle 및 스마트 계약으로 컴파일/실행/디버그 주기를 소개합니다.

정의: 오라클. 스마트 계약이 블록체인 외부 세계의 데이터에 액세스하는 수단입니다. 스마트 계약 자체의 한 유형인 오라클은 외부 세계에서 데이터를 가져와 다른 스마트 계약이 사용할 수 있도록 블록체인에 넣습니다.

이 기사의 첫 번째 부분은 모든 전제 조건을 설정하는 것으로 구성됩니다. 그런 다음 단일 Ethereum 계약을 설정하고 Truffle로 테스트합니다. 마지막으로 오라클을 클라이언트에서 분리하여 공동으로 테스트합니다.

소프트웨어 요구 사항

  • 모든 주요 OS가 작동하지만 일부 설치 및 설정은 시스템마다 다릅니다. Ubuntu Linux(16.04)에서 이 모든 작업을 수행했습니다. 또한 Windows에서 환경을 설정하는 데 문제가 없었습니다. 나는 Mac에서도 그렇게 하는 것이 일반적이라는 것을 알고 있지만 Mac을 시도하지 않았습니다.
  • 전체 eth 노드를 실행할 필요는 없습니다. 우리는 자체 테스트넷과 함께 제공되는 Truffle을 사용할 것입니다. 당신이 하고 있는 일에 대해 조금 알고 있다면, 당신이 선택한 다른 테스트넷을 사용할 수 있습니다. Truffle의 로컬 개발 테스트넷은 이 튜토리얼의 목적에 가장 쉽고 접근이 용이합니다.

지식 요구 사항

  • 블록체인 작동 방식에 대한 기본 지식
  • 블록체인 기반 스마트 계약이 무엇인지 이해
  • 스마트 컨트랙트 개발에 대한 몇 가지 기본적인 Hello-worldish 경험이 도움이 될 것이지만, 당신이 똑똑하고 야심찬 경우에는 필요하지 않습니다. (그리고 나는 당신이 있다는 것을 알고 있습니다!)

이 기사 시리즈 스마트 계약에 대한 첫 번째 소개 역할을 할 수 있지만 더 고급 개념으로 매우 빠르게 증가합니다. 첫 번째 eth 스마트 계약 튜토리얼이라면 빠르게 고도를 높일 준비를 하십시오. 자신감이 있으면 좋습니다. 그렇지 않은 경우 먼저 간단한 "hello world" 유형의 자습서 또는 두 가지를 먼저 얻으십시오. 우선 이더리움 기사 및 크립토좀비 중 하나 또는 이전을 확인하십시오.

주의 사항: 스마트 계약 공간은 너무 새롭기 때문에 빠르게 변경됩니다. 이 기사가 작성되었을 때 새로운 Solidity 구문 기능은 이 기사를 읽고 있는 시점에는 더 이상 사용되지 않거나 더 이상 사용되지 않을 수 있습니다. Geth 버전은 왔다가 사라질 수 있습니다. Solidity는 항상 새로운 언어 기능을 추가하고 이전 기능을 더 이상 사용하지 않습니다. 많은 새로운 기능이 현재 작업 중입니다. 따라서 이 기사의 정보를 미래의 새로운 환경에 맞게 조정하는 데 필요한 경우 준비하십시오. 스마트 계약 개발에 대해 진지하게 배우고 있다면 저는 당신을 믿습니다.

예시 앱 설명

사용 사례: 사용자는 권투 경기에 베팅합니다.

  • 사용자는 내기 가능한 권투 경기 목록을 가져올 수 있습니다.
  • 사용자는 경기를 선택하고 승자에게 내기를 걸 수 있습니다.
  • 사용자는 지정된 최소 금액을 초과하는 금액을 베팅할 수 있습니다.
  • 사용자의 선택이 지면 사용자는 전체 베팅 금액을 잃게 됩니다.
  • 사용자의 선택이 이기면 하우스(계약 소유자)가 상금의 작은 비율을 가져간 후 사용자가 자신의 배팅 크기와 경기의 패자에게 배팅한 총 금액에 따라 팟의 일부를 얻습니다. .

이더리움 오라클이란?

스마트 계약은 여전히 ​​새로운 것입니다. 그들은 아직 주류를 이루지 못했고 작동 방식에 대한 많은 측면이 아직 구체화되고 표준화되지 않았습니다. 나는 "신탁"이라는 아이디어 뒤에 숨은 동기를 간략하게 설명하고 인내심을 가지겠습니다. 우리는 나중 부분에서 더 깊이 들어갈 것입니다.

블록체인 계약 엔지니어링은 클라이언트-서버 앱 프로그래밍과 다릅니다. 한 가지 중요한 차이점은 계약이 상호 작용하는 데이터가 이미 블록체인에 있어야 한다는 것입니다. 블록체인 에서 호출이 없습니다. 언어에서 지원하지 않을 뿐만 아니라 블록체인 패러다임에서도 지원하지 않습니다. 컨트랙트는 이더리움 기반 화폐 형태의 베팅을 받아 컨트랙트에 저장하고, 경기의 승자가 선언되면 공식에 따라 올바른 지갑 주소로 방출할 수 있습니다. 그러나 계약은 승자를 어떻게 압니까? REST API 또는 이와 유사한 것을 쿼리할 수 없습니다. 이미 블록체인에 있는 데이터만 사용할 수 있습니다! 스마트 계약의 많은 사용 사례는 유사한 문제에 직면합니다. 블록체인 외부 세계와 상호 작용할 수 없다면 심각하게 제한됩니다.

계약이 블록체인의 데이터와만 상호 작용할 수 있는 경우 명백한 솔루션은 필요한 데이터를 블록체인에 주입하는 것입니다. 그리고 그것이 바로 오라클입니다. 오라클은 데이터를 블록체인에 주입하여 다른 계약이 데이터를 사용할 수 있도록 하는 또 다른 계약입니다. 그것이 신뢰와 무신뢰에 대한 질문을 제기할 수 있지만, 지금은 그것이 오라클이라는 것을 받아들이십시오. 이 시리즈의 3부에서 이러한 뉘앙스를 논의할 것입니다. 우리의 예시적인 사용 사례에서 오라클은 (a) 어떤 경기가 이용 가능한지 (b) 결정되면 누가 그 경기에서 이겼는지에 관한 데이터를 블록체인에 주입하는 계약이 될 것입니다.

이더리움 개발 환경 설정

기본 설정을 위해 다음을 설치합니다.

  • Geth (지금은 선택 사항)
  • 트뤼플
  • 가나슈 CLI(선택 사항)
  • 개발 환경(선택 사항)

이 문서는 환경 설정에 대한 전체 가이드가 아니라 대략적인 가이드 역할을 합니다. 하지만 괜찮습니다. 특정 OS에 대한 더 완전한 설정 가이드가 이미 많이 있고 인터넷에 새 가이드가 필요하지 않기 때문입니다. 따라서 필요한 경우 더 자세한 정보를 얻을 수 있는 몇 가지 리소스를 안내해 드리겠습니다. 시스템에서 요구하고 Google에서 지시하는 대로 요구사항 및 전제조건을 설치할 준비를 하십시오.

Oracle 계약 프로세스 그림

Geth 설치(선택 사항)

Geth 설치 스크린샷 클릭하면 전체 크기의 이미지를 볼 수 있습니다.

Geth는 이더리움 핵심 소프트웨어인 Go-ethereum입니다. 이 연습에서는 전혀 필요하지 않지만, 이더리움 개발자가 되려는 사람이라면 누구나 가지고 있어야 하고 익숙해져야 합니다. 스마트 계약을 라이브 이더리움 네트워크에 배포하려는 경우 필요합니다.

  • http://www.talkcrypto.org/blog/2018/01/23/what-is-geth/
  • https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu
  • https://github.com/ethereum/go-ethereum/wiki/Installation-instructions-for-Windows

트러플 설치

Truffle 설치 스크린샷 클릭하면 전체 크기의 이미지를 볼 수 있습니다.

Truffle은 우리가 개발에 사용할 주요 요소이며 이 가이드의 요구 사항입니다. Truffle을 설치하려면 OS에 대한 특정 지침을 찾아 따르십시오. 다음은 귀하에게 도움이 될 몇 가지 링크입니다.

  • https://truffleframework.com/docs/truffle/getting-started/installation
  • https://github.com/trufflesuite/truffle
  • https://truffleframework.com/tutorials/how-to-install-truffle-and-testrpc-on-windows-for-blockchain-development

Ganache CLI 설치(선택 사항)

Ganache CLI 설치 스크린샷 클릭하면 전체 크기의 이미지를 볼 수 있습니다.

다른 테스트 도구로 사용하기 위해 Ganache CLI를 설치하는 것이 좋지만 튜토리얼에서는 실제로 사용하지 않을 것입니다. 선택 사항입니다.

https://github.com/trufflesuite/ganache-cli

이더리움 개발 환경

Notepad++, gedit, vi 또는 선택한 텍스트 편집기나 IDE와 같은 간단한 텍스트 편집기를 사용하여 이 전체 자습서를 수행하는 것이 가능합니다. 저는 개인적으로 다음 확장과 함께 Visual Studio Code를 사용하고 있습니다.

  • 견고
  • 확장된 견고성
  • 소재 아이콘 테마

참고: 확장은 필요하지 않습니다. 단지 더 나은 코딩 환경을 만들기 위한 것입니다.

코드 설정

프로젝트 설정

Truffle은 스마트 계약을 컴파일하고 블록체인으로 마이그레이션하는 데 매우 편리한 도구이며 개발 및 디버깅 유틸리티도 제공합니다. Truffle과 통합하려면 일부 프로젝트 설정이 필요합니다. 이제 Truffle과 디렉토리 구조 모두에서 프로젝트의 셸을 설정합니다. 그냥 앉아서 지금은 로봇 공학적으로 단계를 따르고 즐기십시오.

모든 코드를 저장할 디렉토리를 만드십시오. 그것을 oracle-example 이라고 부르십시오.

루트 디렉터리 안에 두 개의 하위 디렉터리를 만듭니다. 결국 프로젝트는 두 개의 하위 프로젝트로 구성되기 때문입니다. 디렉토리 생성:

  • /oracle-example/client
  • /oracle-example/oracle

클라이언트 폴더로 이동합니다. 이것이 우리가 개발할 첫 번째 프로젝트이기 때문입니다. /oracle-example/client 폴더에서 터미널(명령줄) 창을 엽니다.

truffle init 명령을 실행하십시오.

생성된 많은 파일 중 truffle -config.jstruffle.js 에 유의하십시오. 둘 다 필요하지 않으므로 truffle-config.js 를 삭제합니다(혼돈과 혼란을 피하기 위해).

Truffle이 테스트를 위해 올바른 방향을 가리키도록 하기 위해 truffle.js 를 편집해야 합니다. truffle.js 의 내용을 다음으로 바꿉니다.

 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/truffle.js

Truffle init는 마이그레이션 ( oracle-example/client/migrations )이라는 디렉토리를 생성했습니다. 해당 폴더 안에 1_initial_migration.js 라는 파일이 있어야 합니다.

마이그레이션 디렉터리에 다른 파일을 추가하고 다음 내용과 함께 2_deploy_contracts.js 로 이름을 지정합니다.

 var BoxingBets = artifacts.require("BoxingBets"); module.exports = function(deployer) { deployer.deploy(BoxingBets); };

https://github.com/jrkosinski/oracle-example/tree/part1-step1

코드 추가

이제 간단한 설정이 끝났으므로 코딩을 시작할 준비가 되었습니다. 이 기사의 이 부분은 아직 소개 및 설정이므로 코드를 빠르게 살펴보겠습니다. 2부에서 코드에 대한 보다 심층적인 설명을 하고 3부에서 아키텍처와 개념에 대한 더 심층적인 논의를 할 것입니다. 즉, 코드에서 분명히 드러나는 몇 가지 핵심 개념을 빠르게 다룰 것입니다. 따라잡기 위해 주의 깊게 따르십시오.

프로세스의 이 단계에 대한 전체 코드는 GitHub에서 사용할 수 있습니다. https://github.com/jrkosinski/oracle-example/tree/part1-step1

솔리디티 계약

Solidity의 "계약"은 다른 객체 지향 언어의 클래스와 대략 유사합니다. 언어 자체는 Golang 및 JavaScript와 비교되었습니다. 솔리디티의 다른 언어 구성(나중에 예를 들어 보겠습니다)은 수정자, 라이브러리 및 인터페이스입니다. 상속(다중 상속 포함)은 계약에 대해 지원됩니다. Solidity 계약 파일의 확장자는 .sol입니다.

오라클 인터페이스

다음 파일을 프로젝트에 추가하십시오. /oracle-example/client/contracts/OracleInterface.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/OracleInterface.sol

Oracle 인터페이스의 스크린샷 클릭하면 전체 크기의 이미지를 볼 수 있습니다.

일반적으로 Oracle 인터페이스는 인터페이스일 뿐입니다. 이 첫 번째 반복의 경우 현재로서는 Solidity 프로젝트에 포함된 간단한 클래스일 뿐입니다. Truffle에서 계약을 성공적으로 컴파일하고 실행한 후 바로 다음 단계에서 이를 이동할 것입니다. 이것을 나중에 실제 인터페이스로 변환하면 함수 구현이 비어 있게 됩니다.

클라이언트 계약

다음 파일을 프로젝트에 추가하십시오. /oracle-example/client/contracts/BoxingBets.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/BoxingBets.sol

이것은 권투 경기 데이터를 사용하고 사용자가 사용 가능한 경기를 쿼리하고 베팅할 수 있도록 하는 계약입니다. 이후 반복에서 상금을 계산하고 지불합니다.

컴파일 및 실행

이제 처음으로 모든 것이 제대로 되었는지 확인할 때입니다!

계약 컴파일 및 마이그레이션

/oracle-example/client/ 폴더에서 터미널을 엽니다.

다음 명령을 사용하여 코드를 컴파일합니다.

 truffle compile 
계약 컴파일 및 마이그레이션 스크린샷 클릭하면 전체 크기의 이미지를 볼 수 있습니다.
계약 컴파일 및 마이그레이션의 두 번째 스크린샷 클릭하면 전체 크기의 이미지를 볼 수 있습니다.

대안: 내 recompile.sh 셸 스크립트(https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/recompile.sh)를 사용합니다.

코드가 아직 최종 형식이 아니기 때문에 많은 경고가 표시됩니다.

Truffle 개발 콘솔을 엽니다.

 truffle develop

이제 Truffle 개발자 콘솔에서 테스트 네트워크로 마이그레이션합니다.

 truffle(develop)> migrate

계약 실행

개발 콘솔 프롬프트에서 다음 코드 줄을 입력합니다.

 truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

이제 "인스턴스"는 BoxingBets 계약을 참조하는 변수이며 공개 메서드를 호출하는 데 사용할 수 있습니다.

다음 명령을 사용하여 테스트합니다.

 truffle(develop)> instance.test(3, 4)

BoxingBets.sol 에 공개 "테스트" 기능이 포함되어 있습니다. 계약이 코드를 실행하고 있으며 Truffle 개발 콘솔에서 이를 호출할 수 있음을 보여주기 위해 전달하는 두 개의 숫자를 함께 추가합니다. 제정신이 아닌 것처럼 보이는 응답(아래 참조)을 받으면 여기에서 우리의 작업이 완료된 것입니다(적어도 지금은).

이더리움 오라클 분리

지금까지 모든 것이 성공했다면 고비를 넘은 것입니다. 다음으로 할 일은 오라클 계약을 BoxingBets 계약에서 분리하는 것입니다. 실제 사용에서 오라클의 계약은 블록체인의 클라이언트 계약과 별도로 존재하므로 다음을 수행할 수 있어야 합니다.

이더리움 오라클 계약 프로세스 다이어그램

  • 블록체인 주소로 인스턴스화합니다.
  • 클라이언트 계약이 Oracle을 참조하는 데 사용하는 Oracle 주소를 동적으로 변경합니다.

간단히 말해서, 지금 우리가 할 일은 오라클과 클라이언트를 두 개의 개별 블록체인 계약 엔터티로 분리하고 서로 대화하게 하는 것입니다. 클라이언트는 주소로 Oracle을 인스턴스화하고 호출합니다.

클라이언트 계약

먼저, 구체적인 클래스가 아니라 오라클에 대한 동적 인터페이스를 참조하도록 클라이언트 계약(클라이언트)을 변경할 것입니다. 그런 다음 외부 계약에서 Oracle을 인스턴스화하는지 확인합니다.

/oracle-example/client/contracts/OracleInterface.sol 로 이동합니다. 이전에 언급했듯이 이것은 현재 인터페이스가 아니지만 만들려고 합니다. 그 안에 있는 내용을 다음 내용으로 바꿉니다.

https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/OracleInterface.sol

 pragma solidity ^0.4.17; contract OracleInterface { enum MatchOutcome { Pending, //match has not been fought to decision Underway, //match has started & is underway Draw, //anything other than a clear winner (eg cancelled) Decided //index of participant who is the winner } function getPendingMatches() public view returns (bytes32[]); function getAllMatches() public view returns (bytes32[]); function matchExists(bytes32 _matchId) public view returns (bool); function getMatch(bytes32 _matchId) public view returns ( bytes32 id, string name, string participants, uint8 participantCount, uint date, MatchOutcome outcome, int8 winner); function getMostRecentMatch(bool _pending) public view returns ( bytes32 id, string name, string participants, uint participantCount, uint date, MatchOutcome outcome, int8 winner); function testConnection() public pure returns (bool); function addTestData() public; }

BoxingBets.sol 에서 다음 줄을 교체합니다.

 OracleInterface internal boxingOracle = new OracleInterface();

이 두 줄로:

 address internal boxingOracleAddr = 0; OracleInterface internal boxingOracle = OracleInterface(boxingOracleAddr);

이제 우리가 원하는 것은 오라클의 주소를 동적으로 설정하는 방법과 현재 오라클 주소를 찾기 위해 호출할 수 있는 함수입니다. 다음 두 함수를 BoxingBets.sol 에 추가합니다.

 /// @notice sets the address of the boxing oracle contract to use /// @dev setting a wrong address may result in false return value, or error /// @param _oracleAddress the address of the boxing oracle /// @return true if connection to the new oracle address was successful function setOracleAddress(address _oracleAddress) external onlyOwner returns (bool) { boxingOracleAddr = _oracleAddress; boxingOracle = OracleInterface(boxingOracleAddr); return boxingOracle.testConnection(); } /// @notice gets the address of the boxing oracle being used /// @return the address of the currently set oracle function getOracleAddress() external view returns (address) { return boxingOracleAddr; }

마지막으로 클라이언트와 오라클 간의 연결을 테스트하기 위해 BoxingBets의 테스트 기능을 오라클 연결을 테스트하는 기능으로 바꿀 수 있습니다.

 /// @notice for testing; tests that the boxing oracle is callable /// @return true if connection successful function testOracleConnection() public view returns (bool) { return boxingOracle.testConnection(); }

소유 가능

setOracleAddress 에 대한 정의 뒤에는 onlyOwner 수정자가 있습니다. 이는 함수가 공개된 경우에도 계약 소유자가 아닌 다른 사람이 이 함수를 호출하지 못하도록 제한합니다. 그것은 언어 기능이 아닙니다. 이는 OpenZeppelin의 일반 유틸리티 Solidity 계약 라이브러리에서 제거된 Ownerable 계약에 의해 제공됩니다. 이에 대한 세부 사항은 2부에서 다루지만 onlyOwner 수정자의 사용을 용이하게 하기 위해 몇 가지 변경 사항을 적용해야 합니다.

https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/Ownable.sol에서 Ownerable.sol/oracle-example/client/contracts/ 로 복사합니다.

다음과 같이 BoxingBets.sol 상단에 참조를 추가합니다.

 import "./Ownable.sol";

( OracleInterface.sol 을 가져오는 줄 바로 아래에 추가할 수 있습니다.)

다음에서 Ownerable에서 상속하도록 BoxingBets의 계약 선언을 수정합니다.

 contract BoxingBets {

이에:

 contract BoxingBets is Ownable {

그리고 우리는 모든 준비가 되어 있어야 합니다. 길을 잃으면 전체 코드가 여기에 있습니다: https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts

오라클 계약

설정

BoxingBets 계약은 주소별로 완전히 별도의 계약(즉, 오라클)을 참조하려고 하므로 다음 작업은 해당 오라클 계약을 생성하는 것입니다. 이제 우리는 Oracle 계약을 포함할 완전히 별도의 프로젝트를 만들 것입니다. 클라이언트 계약 프로젝트에 대해 이미 수행한 것과 본질적으로 동일한 설정입니다. 즉, 컴파일 및 개발을 위해 Truffle을 설정합니다.

이전 단계에서 생성한 /oracle-example/oracle/ 이라는 폴더가 이미 있어야 합니다. 그렇지 않은 경우 지금 빈 디렉토리를 생성합니다. 해당 디렉토리에서 터미널을 엽니다.

  • truffle init 명령을 실행하십시오.
  • /oracle-example/oracle/truffle-config.js 를 삭제합니다.
  • /oracle-example/oracle/truffle.js 를 다음과 같이 편집합니다.
 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

여기에서 예제를 참조하십시오: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/truffle.js

/oracle-example/oracle/migrations/ 내부에 다음 내용이 포함된 2_deploy_contracts.js 파일을 만듭니다.

 var BoxingOracle = artifacts.require("BoxingOracle"); module.exports = function(deployer) { deployer.deploy(BoxingOracle); };

여기에서 예제를 참조하십시오: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/migrations/2_deploy_contracts.js

오라클 코드

이 단계에서는 https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/contracts/에서 다음 세 파일을 /oracle-example/oracle/contracts/ 폴더에 복사하기만 하면 됩니다.

  • BoxingOracle.sol: 주요 오라클 계약.
  • Ownable.sol: 이미 클라이언트 계약에서 사용한 것처럼 소유자 전용 기능의 경우.
  • DateLib.sol: 날짜 라이브러리입니다. 이 시리즈의 2부에서 더 자세히 살펴보겠습니다.

오라클 테스트

이제 프로젝트의 현재 반복에서 스마트 계약 오라클을 철저히 테스트해야 합니다. 그것이 나머지 프로젝트를 구축할 기반이 될 것이기 때문입니다. 이제 Oracle 프로젝트를 설정하고 코드를 복사했으므로 다음을 수행하려고 합니다.

  • 오라클을 컴파일합니다.
  • 오라클이 실행되는지 확인하십시오.
  • Truffle 콘솔에서 몇 가지 기능을 실행하여 오라클이 예상대로 작동하는지 확인하십시오.

Oracle 컴파일 및 마이그레이션

/oracle-example/oracle/ 에 열려 있는 터미널에서 다음 명령을 실행합니다. 다시 말하지만, 이러한 단계는 클라이언트 계약을 컴파일하고 마이그레이션하기 위해 이미 수행한 작업과 동일합니다.

 truffle compile

대안: 내 recompile.sh 셸 스크립트(https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/recompile.sh)를 사용합니다.

Truffle 개발 콘솔을 엽니다.

 truffle develop

테스트 네트워크로 마이그레이션:

 truffle(develop)> migrate

Oracle 실행 및 테스트

여전히 Truffle 개발 콘솔에서 다음을 입력하여 Oracle 계약에 대한 사용 가능한 포인터를 캡처합니다.

 truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

이제 우리는 테스트를 위해 오라클 계약에서 일련의 테스트를 실행할 수 있습니다. 다음 명령을 차례로 실행하고 결과를 검토하십시오.

 truffle(develop)> instance.testConnection() ... truffle(develop)> instance.getAllMatches() ... truffle(develop)> instance.addTestData() ... truffle(develop)> instance.getAllMatches() ...

이 시점에서 오라클 코드를 살펴보고 사용 가능한 공개 메소드가 무엇인지 확인하고 코드의 주석을 읽고 실행할 테스트를 작성하고 다음과 같이 콘솔에서 실행하는 것이 좋습니다. 위에 표시됨).

테스트 및 디버깅

이제 최종 테스트를 할 준비가 되었습니다. 클라이언트 계약이 이미 블록체인에 있는 Oracle 계약을 호출하고 해당 데이터를 가져와 사용할 수 있는지 테스트합니다. 이 모든 것이 작동하면 추가 실험에 사용할 수 있는 클라이언트-오라클 쌍이 있는 것입니다. 종단 간 테스트를 실행하기 위한 단계:

  • 오라클 계약 컴파일 및 실행
  • 클라이언트 계약 컴파일 및 실행
  • 오라클 컨트랙트 주소 가져오기
  • 클라이언트 계약에서 오라클 주소 설정
  • Oracle 계약에 테스트 데이터 추가
  • 클라이언트 계약에서 해당 데이터를 검색할 수 있는지 테스트

두 개의 터미널 창을 엽니다.

  • /oracle-example/client/ 에 하나
  • /oracle-example/oracle/ 의 다른 하나

/oracle-example/client/ 하나는 왼쪽에, /oracle-example/oracle/ 하나는 오른쪽에 열어두고 혼동을 피하기 위해 밀접하게 따라갈 것을 제안합니다.

Oracle Contract 컴파일 및 실행

/oracle-example/oracle/ 터미널에서 다음 명령을 실행합니다.

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

클라이언트 계약 컴파일 및 실행

/oracle-example/client/ 터미널에서 다음 명령을 실행합니다.

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Oracle 계약의 주소 가져오기

/oracle-example/oracle/ 터미널에서 Truffle에 다음 명령을 실행합니다.

 truffle(develop)> instance.getAddress()

이 호출의 출력인 주소를 복사합니다. 다음 단계에서 사용하십시오.

클라이언트 계약에서 Oracle 주소 설정

/oracle-example/client/ 터미널에서 다음 명령을 실행하여 truffle을 실행합니다.

 truffle(develop)> instance.setOracleAddress('<insert address here, single quotes included>')

그리고 그것을 테스트하십시오:

 truffle(develop)> instance.testOracleConnection()

출력이 true 계속 진행할 수 있습니다.

클라이언트 계약에서 해당 데이터를 검색할 수 있는지 테스트

/oracle-example/client/ 터미널에서 다음 명령을 실행하여 truffle을 실행합니다.

 truffle(develop)> instance.getBettableMatches()

테스트 데이터가 아직 오라클 측에 추가되지 않았기 때문에 빈 배열을 반환해야 합니다.

/oracle-example/oracle/ 터미널에서 다음 명령을 실행하여 테스트 데이터를 추가합니다.

 truffle(develop)> instance.addTestData()

다음 명령을 실행하여 /oracle-example/client/ 터미널에서 truffle을 실행하여 클라이언트에서 새로 추가된 테스트 데이터를 가져올 수 있는지 확인합니다.

 truffle(develop)> instance.getBettableMatches()

이제 getBettableMatches() 가 반환한 배열에서 개별 주소를 가져와 getMatch() 에 연결합니다.

이 시점에서 클라이언트 코드를 살펴보고 사용할 수 있는 공용 메서드가 무엇인지 확인하고 코드의 주석을 읽고 실행할 테스트를 작성하고 다음과 같이 콘솔에서 실행하는 것이 좋습니다. 위에).

1부의 결론

이 연습의 결과는 제한적이지만 현실적인 속도를 유지하기 위해 목표도 제한적이었습니다. 우리 고객은 아직 내기를 하고, 자금을 처리하고, 상금을 나누는 등의 능력이 없습니다. 우리가 가진 지식과 경험을 제외하고는 다음과 같습니다.

  • 대부분 기능적인 스마트 계약 오라클
  • 오라클에 접속하여 상호작용할 수 있는 클라이언트
  • 추가 개발 및 학습을 위한 프레임워크

그리고 그것은 짧은 기사에 대해 너무 나쁘지 않습니다.

이 시리즈의 2부 에서는 코드에 대해 더 깊이 파고들어 스마트 계약 개발에 고유한 일부 기능과 Solidity에 고유한 일부 언어 기능을 살펴볼 것입니다. 이 부분에서 그냥 지나쳤던 많은 것들이 다음 부분에서 설명될 것입니다.

이 시리즈의 3부 에서는 스마트 계약의 철학과 설계, 특히 오라클과의 사용과 관련하여 조금 논의할 것입니다.

추가 선택적 단계

단독 실험은 좋은 학습 방법입니다. 다음은 더 많은 지식을 얻기 위해 이 튜토리얼을 확장하는 방법을 생각하고 있다면 몇 가지 간단한 제안입니다(2부와 3부에서는 다음 중 어느 것도 다루지 않습니다).

  • Ganache(이전의 testrpc)에 계약을 배포하고 동일한 테스트를 실행하여 기능을 확인합니다.
  • 계약을 ropsten 또는 rinkeby 테스트넷에 배포하고 동일한 테스트를 실행하여 기능을 확인합니다.
  • 오라클이나 클라이언트(또는 둘 다)에 대해 web3js 프런트 엔드를 빌드합니다.

행운을 빕니다. 궁금한 점이 있으면 언제든지 저에게 연락해 주세요. 반드시 빠른 답변을 드릴 수는 없지만 최선을 다하겠습니다.