EOS, WAX, Telos 에서 리퀴드 오라클 사용하기 — 리퀴댑스 DAPP 네트워크 개발자 워크스루

리퀴드 하모니는 사용자 정의 가능한 신뢰성으로 많은 서비스를 가능하게합니다. 웹 API의 일부 데이터를 LiquidX를 사용하여 EOSIO 시스터 체인에서 활성화하여 스마트 계약으로 가져 오십시오.

CREAM ER
리퀴댑스(Liquidapps) Kor
26 min readMar 29, 2020

--

리퀴드 하모니

오늘은 리퀴드 하모니 프레임 워크의 기능인 리퀴드 오라클을 다룰 것입니다. DAPP 네트워크의 가장 강력한 기능 중 하나 인 리퀴드 하모니는 모든 종류의 서비스를 얻을 수있는 신뢰할 수있는 방법입니다.

  • HTTP(S) Get & Post 및 HTTP(S)+JSON Get & Post 요청
  • Nodeos 히스토리 가져오기
  • IBC 블록 Fetch (Mainnet, BOS, Telos, Kylin, Worbli, Jungle, Meetone, WAX)
  • 오라클 IBC (Ethereum, Tron, Cardano, Ripple, Bitcoin, Litecoin, Bitcoin Cash)
  • 울프럼 알파
  • 난수
  • 스톡피쉬 체스 AI(계산 기능 시연)
  • 다른 vCPU 사용 사례
  • SQL
  • 잠재적으로 모든 도커화(Dockerized) 된 애플리케이션

처음 몇 가지 용도는 리퀴드 오라클 아래에 있습니다. 이것이 오늘 우리가 살펴볼 내용입니다. 향후 튜토리얼에서는 자체 리퀴드 하모니 플러그인을 개발하는 등 다른 옵션을 고려할 것입니다.

오늘 웹 Oracle에 초점을 맞추면서 배운 내용은 vCPU, 리퀴드 무작위(Randomness), 리퀴드SQL, 리퀴드 링크의 오라클 구성 요소 등에도 적용할 수 있습니다.

리퀴드 오라클은 오라클 소스에 대한 완벽한 제어 및 사용자 정의 가능한 합의를 포함하여 다른 오라클 솔루션에 비해 몇 가지 고유한 특성을 제공합니다. 이 워크 스루에서는 자체 정보 소스와 자체 컨센서스 요구 사항을 쉽게 설정할 수 있습니다. 다른 리퀴드 하모니 옵션을 사용하는 방법에 대한 정보는 시작하기 문서를 참조하십시오.

Zeus SDK 설정

You’ll need Node.js version 10 (or NVM with nvm use 10) and the Zeus SDK installed. (Alternatively, you can use Zeus IDE.) If you’re not familiar with how to set up Node+Zeus, check out the first DAPP Network walkthrough.

Node.js 버전 10 (또는 nvm을 사용하는 nvm use 10)과 Zeus SDK가 설치되어 있어야합니다. (또는 Zeus IDE를 사용할 수도 있습니다.) Node + Zeus 설정 방법에 익숙하지 않은 경우 첫 번째 DAPP 네트워크 워크스루를 확인하십시오.

간단히 말해서 Node.js가 준비되면 다음을 실행하십시오.

$ npm i -g @liquidapps/zeus-cmd

항상 그렇듯이 $ 기호는 이것이 커맨드 라인에 대한 것임을 나타냅니다. $ 기호는 입력하지 마십시오.

Zeus가 설정되면 리퀴드 오라클 연습 응용 프로그램을 유지할 수있는 편리한 디렉토리로 이동하십시오. Zeus SDK에 포함 된 상자는 오늘 우리 작업의 훌륭한 출발점을 제공 할 것입니다.

샘플 앱을 시작 포인트로 언박싱

Zeus는 Truffle과 유사한 모든 기능을 갖춘 블록 체인 SDK입니다. 확장 가능하고 박스 기반-이므로 어디에서나 실행할 수있는 유일한 명령은 unbox입니다.

단일 커맨드 개발 및 배포에 필요한 모든 것이 설정되어 있으므로 언 박싱, 특히 IPFS 설치에 시간이 걸립니다.

언박싱은 zeus migrate, zeus compile, zeus deploy, zeus test, zeus create contract 등과 같은 결과 디렉토리 내에서 가능한 모든 것을 실행할 수 있습니다.

샘플 오라클 계약을 언박스하여 살펴볼 수 있습니다.

$ zeus unbox oracle-dapp-service

언박싱이 완료되면 새 디렉토리로 이동하십시오.

$ cd oracle-dapp-service

리퀴드 오라클의 작동 방식을 살펴볼 수있는 가장 좋은 곳은 오라클 소비자 계약입니다.

$ cd contracts/eos/oracleconsumer
$ nano oracleconsumer.cpp

(물론 원하는 텍스트 편집기 나 IDE를 사용하십시오)

포함 및 정의

처음에는 EOSIO 계약에서 DAPP 네트워크 기능을 사용할 수있게하는 일반적인 DAPP 네트워크 전처리기 지시문이 표시됩니다.

/* INCLUDE ORACLE LOGIC */
#include "../dappservices/oracle.hpp"/* ADD DAPP NETWORK RELATED ORACLE ACTIONS */
#define DAPPSERVICES_ACTIONS() \
XSIGNAL_DAPPSERVICE_ACTION \
ORACLE_DAPPSERVICE_ACTIONS#define DAPPSERVICE_ACTIONS_COMMANDS() \
ORACLE_SVC_COMMANDS()

더 많은 서비스가 필요한 경우 다른 #includes, ACTIONS, COMMANDS가 여기에 배치되지만 오늘은 리퀴드 오라클만 사용하게됩니다.

클래스 정의의 시작과 디스패처에는 CONTRACT_STARTCONTRACT_END 매크로에서 제공하는 일부 사용자 정의 코드가 필요하므로 CONTRACT_NAME을 설정해야합니다.

#define CONTRACT_NAME() oracleconsumer

이를 통해 스마트 계약은 리퀴드 하모니의 리퀴드 오라클를 사용할 준비가되었습니다. Wolfram Alpha 또는 Nodeos History Get과 같은 다른 용도에 대한 설명은 여기에서 볼 수 있습니다.

오라클 소비자 계약 커스터마이징

최신 총 미국 국채를 얻을 수있는 앱을 구축해 봅시다. 이를 사용하여 흥미로운 토큰 이코노미 모델을 만들거나 예측 시장 또는 간단한 정보 목적으로 사용할 수 있습니다.

프로젝트를 시작하려면 계약 이름을 바꾸십시오.

#define CONTRACT_NAME() debtgetter

ora.cpp 파일과 폴더의 이름을 “oracleconsumer”에서 “debtgetter”로 바꾸십시오.

사용자 지정 계약의 클래스 이름, 파일 이름 및 폴더 이름으로 “debtgetter”를 사용했습니다.

맞춤형 소스

다른 오라클 솔루션과 달리 리퀴드 오라클을 사용하면 디앱 개발자가 원하는 오라클 소스를 선택할 수 있습니다.

어떤 API를 선택하는지주의하십시오! 소스를 선택하면 해당 소스를 신뢰하게됩니다. 분산 네트워크의 신뢰성은 오라클이 소스에 대해 올바르게 보고하고 있음을 확신하는 데 도움이되지만 공급자는 소스 자체의 신뢰성 여부를 모릅니다.

경우에 따라 여러 API 소스를 쿼리하여 비교하는 것이 좋습니다. 또한 웹 사이트는 종종 다운됩니다. 기본 오라클 소스를 전적으로 신뢰하더라도 백업이 필요합니다. 그렇지 않으면 소스가 중단되면 앱이 중단 될 수 있습니다.

여기서는 여러 소스를 사용하지 않지만 오라클 공급 업체가 정직하도록 유사한 비교 프로세스를 따릅니다.

다시 코드로 돌아갑니다.

전 처리기 라인 다음에 나오는 주석은 oracleconsumer.cpp 계약에서 기본적으로 제공하는 내용을 설명합니다.

/*
testget — provide a URI using the DAPP Network Oracle syntax and an expected result, if the result does not match the expected field, the transaction fails testrnd — fetch oracle request based on URI without expected field assertion
*/

Unbox-대신에 우리가 얻을 수있는 기본 oracleconsumer 계약에서 오라클 소스 URL이 실제로 제공되지 않고, 테스트 조치가 제공되며, 소스에 대한 URL은 명령 행을 통해 (코딩해야하지만) 또는 JavaScript 프론트 엔드 (Buffer.from 사용). zeus test를 실행하면 이러한 샘플 작업을 수행하여 직접 탐색 할 수 있습니다.

인수로 유용한 URI를 계약 조치에 보낼 수는 있지만 일반적인 애플리케이션에서 수행하려는 작업이 반영되지 않을 수 있으므로 이 튜토리얼의 계약에 소스 URI를 직접 배치하십시오.

앞에서 언급했듯이 현재 미국 정부 부채를 받게됩니다. 이것은 https://www.treasurydirect.gov/NP_WS/debt/current에 있습니다.

쿼리 문자열 ?format=json을 사용하면 JSONP를 다루는 데 약간의 추가 문제가 발생하지 않습니다. 샘플 응답은 다음과 같습니다.

{"effectiveDate": "March 23, 2020 EDT", "governmentHoldings": 6010453915906.78, "publicDebt": 17507401138252.23, "totalDebt": 23517855054159.01}

다음은 리퀴드 오라클을 사용하여이 정보를 계약서에 가져 오는 간단한 방법입니다.

CONTRACT_START()  ACTION getdebt() {
string url ="https://www.treasurydirect.gov/NP_WS/debt/current?format=json";
vector<char> urlv(url.begin(), url.end());
auto debt = getURI(urlv, [&]( auto& results ) {
eosio::check(results.size() > 0, "no results returned");
auto itr = results.begin();
return itr->result;
});

string debtstr(debt.begin(), debt.end());
eosio::check(false,"The current debt is "+ debtstr);
}CONTRACT_END((getdebt))

여기서 핵심 기능은 getURI이며 두 가지 인수를 사용합니다.

  1. 호출 할 URI를 포함하는 문자로 구성된 벡터 (JavaScript를 사용할 경우Buffer.from("<url>","utf8" 사용하세요) 및
  2. 획득시 결과를 처리하는 콜백 람다 함수

여기에서 첫 번째 result를 가변 debt로 반환합니다. URL과 마찬가지로 각 오라클 result는 문자로 구성된 벡터이므로 eosio::check에 공급하려면 문자열로 다시 변환해야합니다. 물론,이 변환은 획득 한 데이터의 형식과 용도에 따라 여러 계약에서 필요하지 않을 수 있습니다.

testgettestrnd 함수를 제거 했으므로 test/oracle*.spec.js의 테스트는 더 이상 작동하지 않습니다. 자체 테스트를위한 참조로 사용하기에 충분히 쉽습니다. oracle-web.spec.js를 제외한 모든 oracle*.spec.js를 제거해 봅시다. HTTPS Get를 제외한 모든 테스트를 제거한 후에 수정할 수 있습니다.

require("babel-core/register");
require("babel-polyfill");
import 'mocha';const { assert } = require('chai'); // Using Assert style
const { getTestContract } = require('../extensions/tools/eos/utils');
const artifacts = require('../extensions/tools/eos/artifacts');
const deployer = require('../extensions/tools/eos/deployer');
const { genAllocateDAPPTokens } = require('../extensions/tools/eos/dapp-services');var contractCode = 'debtgetter';
var ctrt = artifacts.require(`./${contractCode}/`);describe(`Debt Getter Test`, () => {
var testcontract;
const code = 'test1';
before(done => {
(async() => {
try {
var deployedContract = await deployer.deploy(ctrt, code);
await genAllocateDAPPTokens(deployedContract, "oracle", "pprovider1", "default");
await genAllocateDAPPTokens(deployedContract, "oracle", "pprovider2", "foobar");
testcontract = await getTestContract(code);
done();
}
catch (e) {
done(e);
}
})();
});

var account = code;

it('Debt HTTPS Get', done => {
(async() => {
try {
var res = await testcontract.getdebt({
// action arguments would go here, but getdebt takes none

}, {
authorization: `${code}@active`,
broadcast: true,
sign: true
});
done();
}
catch (e) {
done(e);
}
})();
});
});

oracleconsumer 계약의 이름을 변경 했으므로 zeus compilezeus testontract/eos/CMakeLists.txt,를 업데이트하고 다음을 변경하는 경우에만 작동합니다.

ExternalProject_Add(
oracleconsumer
SOURCE_DIR oracleconsumer
BINARY_DIR oracleconsumer
. . .

to

ExternalProject_Add(
debtgetter
SOURCE_DIR debtgetter
BINARY_DIR debtgetter
. . .

이제 zeus test를 실행할 준비가되었습니다.

걱정하지마세요. 이것은 실패했습니다.

물론 현재 부채 값을 인쇄하기 위해 eosio::check를 사용하여 예외를 발생 시켰기 때문에 테스트가 실패했습니다. 이 결과를 합격으로 수락하려면이 테스트를 자유롭게 수정하십시오.

그러나 한 가지 문제가 있습니다.이 완전한 JSON 응답은 우리가 추구하는 것이 아닙니다. “totalDebt”값만 원합니다.

우리는 JSON 구문 분석을 추가 할 수 있습니다. 그렇지만 대신 응답 구조화 방법에 대해 알고있는 것을 사용하여 원하는 것을 찾으십시오.

응답에서 “totalDebt”가 존재하는 곳을 찾고 원하는 값으로 문자열을 잘라냅니다. 어쨌든 이것은 계약 리소스에 훨씬 가벼울 것입니다.

ACTION getdebt() {
string url ="https://www.treasurydirect.gov/NP_WS/debt/current?format=json";
vector<char> urlv(url.begin(), url.end());
auto debt = getURI(urlv, [&]( auto& results ) {
eosio::check(results.size() > 0, "no results returned");
auto itr = results.begin();
return itr->result;
}); string debtstr(debt.begin(), debt.end());
uint8_t start_loc = debtstr.find("totalDebt")+11;
string debtsubstr = debtstr.substr(start_loc, debtstr.length() — start_loc — 1);

eosio::check(false,"The current debt is " + debtsubstr);
}

이제, zeus test 는 우리에게 다음을 제공합니다.

오라클 소스를 여러 개 추가하면 각 소스의 응답을 다르게 처리해야 할 수도 있습니다. 응답을 구문 분석하기위한 URL 및 설정을 setting다중 인덱스 테이블에 유지하는 것이 이상적입니다.

사용 사례에 따라 수신 한 값도 저장할 수 있습니다. 현재 우리는 아직 부채 가치를 사용하지 않고 있습니다. 실제로, 우리는 일단 가치를 인쇄하면 집행을 중단합니다.

또한,이 작은 기능은 최소한 하나의 결과가 있는지 확인하는 것 외에는 결과를 검증하지 않습니다. 사용중인 오라클 제공자 수에 관계없이 첫 번째 오라클 결과가 무엇이든 반환됩니다.

이 마지막 문제는 분산 된 오라클의 목적을 분명히 극복합니다.

맞춤형 컨센서스

추가 :
1.최소한의 오라클 결과
2.그것들이 모두 정확히 일치해야한다는 요건

ACTION getdebt() {
string url ="https://www.treasurydirect.gov/NP_WS/debt/current?format=json";
vector<char> urlv(url.begin(), url.end());
auto debt = getURI(urlv, [&]( auto& results ) {
const MIN_ORACLE_PROVIDERS = 2;
eosio::check(results.size() >= MIN_ORACLE_PROVIDERS, "At least " + MIN_ORACLE_PROVIDERS + " provider results are required for consensus");

auto itr = results.begin();
auto first = itr->result;
++itr;

/* CONSENSUS LOGIC checks all results against first one */
while(itr != results.end()) {
eosio::check(itr->result == first, "consensus failed");
++itr;
}
return first;

});

string debtstr(debt.begin(), debt.end());
uint8_t start_loc = debtstr.find("totalDebt") + 11;
string debtsubstr = debtstr.substr(start_loc,debtstr.length() - start_loc - 1);
eosio::check(false,"The current debt is " + debtsubstr);}

더 적은 DAPP 서비스 제공자를 사용하는 조치가 실패하도록 MIN_ORACLES를 원하는대로 변경할 수 있습니다. 이 경우 각 오라클의 결과가 다른 오라클과 정확히 일치하도록 합의하지 않으면 합의 및 조치가 실패합니다.

그러나 맞춤형 컨센서스에 관해서는 하늘이 한계입니다. 우리는 여기에서와 같이 오라클과 드라코 니안이 될 수 있습니다. 특정 임계 값 미만의 반대자들을 무시할 수 있습니다. 또는 공차를 허용하고 평균값을 사용할 수 있습니다. 코딩 할 수있는 모든 검증 표준을 사용할 수 있습니다.

zeus test는 기본적으로 2 개의 로컬 오라클 서비스 제공 업체를 제공하므로 Zeus의 설정을 사용자 정의하지 않으면 더 높은 최소값을 설정해도 성공하지 못합니다. 실제 환경 및 사용자 정의 환경에서 원하는만큼 많은 제공자를 사용할 수 있으며 원하는 경우 자신의 제공자를 워치 독으로 포함시켜 앱과의 대량 공모를 방지 할 수도 있습니다.

애플리케이션 배포

이 애플리케이션을 모든 EOSIO 테스트 또는 메인 넷에 배포하려면 다음을 수행해야합니다.

1.대상 네트워크에 충분한 리소스가있는 계정을 만들거나 사용하십시오.
2.DSP 선정 및 스테이킹
3.(EOS 이외의 체인을 사용하는 경우) 대상 EOSIO 네트워크 계정과 스테이 킹 EOS 계정 연결
4.(선택 사항) zeus-config.js 파일 사용자 정의
5.계약서 작성
6.계약 배포

WAX 메인넷에 대한 정보도 다루면서 WAX 테스트넷에 대해서도이 작업을 수행합니다. 현재 선택할 수있는 다른 체인은 EOS 및 Telos 메인넷 및 테스트넷이 있습니다.

1. 계정 생성

계정 만들기에 대한 자세한 설명은 이 튜토리얼에서 다루지 않습니다.

WAX 계정
https://faucet.waxsweden.org/create_account?<account>
to make an account and
https://faucet.waxsweden.org/get_token?<account>
토큰을 얻을 수 있습니다. 문제가있는 경우 서포트 링크와 함께 자세한 내용을 볼 수 있습니다.

WAX 메인 넷의 경우 https://wax.io/blog/how-to-create-a-wax-blockchain-account에서 무료 계정을 찾은 다음 다른 지갑이나 거래소에서 충분한 WAX를 보내서 필요한 자원 획득

계약 배포에 필요한 것보다 더 많은 리소스가 필요한 경우 배포가 실패 할 때 요구 사항을 알려줍니다. 이 글을 확인해보세요

2. DSP 선택 및 스테이크

WAX를 설정하려면 여기에서 스테이킹 지침을 따르거나 이 글을 살펴볼 수 있지만 해당되는 경우 Kylin 대신 EOS 메인넷을 사용하십시오. 즉, 실제 EOS 계정, 실제 EOS 토큰 및 실제 DAPP 토큰이 필요합니다. WAX에있는 DSP 엔드 포인트를 결정합니다. 현재 몇 가지 DSP를 사용할 수 있습니다.

DAPP 네트워크 포털에서 DSP에 쉽게 접근 할 수 있습니다.

중요 : DAPP 네트워크 개발의 이 단계에서는 리퀴드 X와 함께 DAPP 네트워크를 사용하는 EOSIO 네트워크가 EOS 메인넷에 프로비저닝되므로 EOS 계정 및 일부 DAPP 토큰에 액세스해야합니다. 이것이 당신을위한 옵션이 아니라면, Kylin 테스트넷에서 실험 해 볼 수 있습니다. 그렇지 않으면 프로세스는 WAX 테스트 넷과 동일합니다. 진행 방법에 대한 자세한 지침은 이 글을 읽어보십시오.

3.(EOS 이외의 EOSIO 체인을 사용하는 경우) 계정을 연결하십시오.

우리는 리퀴드 X를 사용하여 WAX 메인넷에서 실행하고 EOS 메인넷에서 직접 실행하지 않기 때문에 WAPP 계정을 DAPP 서비스 제공 업체에 스테이킹 중인 EOS 계정에 연결하기 위해 몇 가지 조치를 취해야합니다.
a) EOS 메인 넷에서 addaccount :

$ export EOS_ACCOUNT=<stakingEOSaccount>$ cleos -u https://nodes.get-scatter.com:443 push transaction "{\"delay_sec\":0,\"max_cpu_usage_ms\":0,\"actions\":[{\"account\":\"liquidx.dsp\",\"name\":\"addaccount\",\"data\":{\"owner\":\"$EOS_ACCOUNT\",\"chain_account\":\"$WAX_ACCOUNT\",\"chain_name\":\"liquidxxtwax\"},\"authorization\":[{\"actor\":\"$EOS_ACCOUNT\",\"permission\":\"active\"}]}]}"

b)WAX 네트워크에서 adddsp. 구문은 다른 작업과 동일하지만 두 가지 인수를 사용합니다.

  • 소유자 {name}-새 체인의 소비자 계약 이름. 제 경우에는 이것이 debtgetter11 입니다.
  • 새 체인의 dsp {name}-dsp 이름 (DSP의 메인넷 이름과 다를 수 있음) liquidx.dsp 계약서의 accountlink 테이블에 mainnet DSP의 계정을 입력하여이 이름을 찾으십시오.

c) 대상 WAX 네트워크에서, setlink.

cleos -u $WAX_ENDPOINT push transaction "{\"delay_sec\":0,\"max_cpu_usage_ms\":0,\"actions\":[{\"account\":\"dappservicex\",\"name\":\"setlink\",\"data\":{\"owner\":\"$WAX_ACCOUNT\",\"mainnet_owner\":\"$EOS_ACCOUNT\"},\"authorization\":[{\"actor\":\"$WAX_ACCOUNT\",\"permission\":\"active\"}]}]}"

이 작업에 대한 자세한 내용은 여기를 참조하십시오.

4.. (선택 사항) 여러 EOSIO 네트워크에 대한 엔드 포인트 정보가 포함 된 zeus-config.js를 업데이트 할 수 있습니다.

예를 들어 현재 항목 중 하나는 다음과 같습니다.

'kylin': {
chainId: '5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191',
host: 'api.kylin.eosbeijing.one',
port: 80,
secured: false
}

WAX 테스트 넷의 경우 향후 zeus 커맨드와의 호환성을 높이기 위해 추가 할 수 있습니다. cleos를 사용하여 계약을 직접 배포하므로 여기서는 선택적 단계입니다.

'wax': {
chainid: 'f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12',
host: 'testnet.waxsweden.org',
port: 443,
secured: true
}

WAX 메인 넷에 사용하는 예는 다음과 같습니다.

'wax': {
chainid: '1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4',
host: 'chain.wax.io',
port: 443,
secured: true
}

5. 최신 버전의 계약이 있는지 확인하십시오.

$ zeus compile debtgetter

성공!

6.애플리케이션 배포!

cleos wallet unlock하고 WAX 계정의 개인키에 대한 cleos 지갑 가져 오기를 완료 한 후 다음을 실행하십시오.

$ export WAX_ACCOUNT=<yourWAXaccountnamehere>$ export WAX_PUBLIC_KEY=<yourWAXpublickeyhere>$ export WAX_ENDPOINT=https://testnet.waxsweden.org$ cleos -u $WAX_ENDPOINT set contract $WAX_ACCOUNT ./contracts/eos/debtgetter -p $WAX_ACCOUNT@active

일부 환경 변수를 사용하면 cleos 명령을 구문 분석하기가 훨씬 쉬워지고 많은 복사 및 붙여 넣기가 방지됩니다. 여기서 WAX_ACCOUNT는 계약 계정이 되려는 계정입니다. 제 경우에는 debtgetter11입니다.

가장 일반적인 문제는 “RAM 부족”입니다. 참고로, 여기에 몇 가지 더 구입 한 방법이 있습니다.

cleos -u $WAX_ENDPOINT system buyram $WAX_ACCOUNT $WAX_ACCOUNT "35.00000000 WAX"

계약이 성공적으로 배포되면 WAX 테스트넷에서 앱과 상호 작용할 수 있습니다.

$ cleos -u $WAX_ENDPOINT push action $WAX_ACCOUNT getdebt '[]' -p <account>@active

제 경우에는 다음과 같습니다. 계약 계정이 자체 코드를 호출하는 것을 막는 것이 없기 때문에이 작업에 WAX_ACCOUNT를 사용할 수도 있습니다.

$ cleos -u $WAX_ENDPOINT push action $WAX_ACCOUNT getdebt '[]' -p bitgenstein1@active

(If you get assertion failure with message: required service, you failed to stake to DAPP Service Providers correctly.)

(assertion failure with message: required service 메시지와 함께 실패가 발생하면 DSP에 올바르게 접속하지 못했습니다.)

예상대로 getdebt 을 호출하면 assertion이 발생하고 오라클 제공 업체를 통해 얻은 현재 미국 국채가 프린트됩니다! 이제 계약에서이 정보를 사용하고 복원력을 위해 백업 API를 추가하거나 합의 모델을 추가로 사용자 정의 할 수 있습니다.

자세한 내용은 리퀴드하모니 시작 페이지 및 첨부 문서를 참조하거나 zeus unbox portfolio가있 리퀴드 포트폴리오 샘플 응용 프로그램에 대한 경험을 참조하십시오.

LiquidOracles — and LiquidHarmony solutions in general — are a flexible way to get your application the access it needs without compromising on decentralization. In the next walkthrough, we’ll dive into LiquidScheduler, which is a great partner to LiquidOracles for many use cases.

리퀴드 오라클 및 리퀴드 하모니 솔루션은 일반적으로 탈중앙화에 영향을주지 않으면 서 애플리케이션에 필요한 액세스를 제공하는 유연한 방법입니다.
다음 연습에서는 리퀴드 스케쥴러에 대해 자세히 설명합니다. 리퀴드 스케쥴러는 많은 사용 사례에서 리퀴드 오라클의 훌륭한 파트너입니다.

질문이 있으시면…

Follow LiquidApps

Website | Twitter | Telegram | LinkedIn | Github

리퀴댑스 KOR

미디엄 | 텔레그램 |

중요한 고지사항을 읽으려면 여기를 클릭하십시오.

--

--