Người yêu cầu dữ liệu

in #fluxprotocol28 days ago

Người yêu cầu dữ liệu

 

Cách thiết lập hợp đồng thông minh của bạn với tư cách là Người yêu cầu dữ liệu với việc triển khai testnet của Flux trên NEAR

Điều kiện tiên quyết

Bạn muốn tạo một điểm truy cập vào Flux Oracle để tạo các yêu cầu dữ liệu cần được giải quyết bởi trình xác thực Flux

Bạn cảm thấy thoải mái với dòng lệnh, GitHub, ví tiền điện tử và chỉnh sửa / triển khai hợp đồng thông minh

Bạn xác nhận đây là phiên bản testnet và việc đưa vào Sổ đăng ký người yêu cầu trên mainnet yêu cầu một đề xuất và thực thi thành công với Flux DAO và mỗi yêu cầu dữ liệu sẽ yêu cầu đăng một trái phiếu hợp lệ (không cần tiền thực cho testnet). Thông tin thêm về cách gửi đề xuất tới Flux DAO sẽ được đưa vào một ngày sau đó.

Thiết lập hợp đồng

Nếu bạn chưa triển khai hợp đồng trên NEAR, hãy làm theo hướng dẫn tại đây để thiết lập tài khoản testnet, môi trường Rust và NEAR CLI.

Khi bạn đã sắp xếp xong, bạn có thể sao chép hợp đồng mẫu của người yêu cầu tại đây.

Đầu tiên, đăng nhập vào tài khoản NEAR testnet của bạn bằng lệnh đăng nhập cli near login của NEAR và điền thông tin để thêm thông tin đăng nhập tài khoản cục bộ của bạn và chạy phần còn lại của các lệnh.

Mở thiết bị đầu cuối và cd của bạn vào thư mục và chạy lệnh sau, thay thế YOUR_TESTNET_ACCT_ID bằng id tài khoản testnet thực của bạn.

1 sh build.sh
2 sh scripts/deploy_requester.sh --accountId YOUR_TESTNET_ACCT_ID.testnet

 

Trong bản phát hành mainnet, trước tiên bạn sẽ cần yêu cầu đưa hợp đồng của mình vào danh sách trắng với Flux DAO trước khi bạn có thể tương tác với oracle. Nhưng bạn đang gặp may! Chúng tôi sẽ cho bạn cơ hội để kiểm tra nó, một cách không quan liêu!

Yêu cầu

Bây giờ bạn đã triển khai hợp đồng trên tài khoản testnet của mình, đã đến lúc kích hoạt một yêu cầu! Yêu cầu dữ liệu được tạo bằng cách gọi một phương thức trên hợp đồng Người yêu cầu (thường được đặt tên là create_data_request ()) để chuyển tiếp trái phiếu thanh toán tới oracle bằng cách gọi hợp đồng mã thông báo với tải trọng yêu cầu mới.

image host

 

Như bạn có thể thấy, mỗi yêu cầu dữ liệu có một số lượng và một trọng tải trong đó. Số tiền là validity_bond mà bạn phải đăng cùng với yêu cầu để tương tác với oracle. Điều này nhằm mục đích ngăn chặn các kẻ xấu gửi các oracle rác với các yêu cầu không hợp lệ, trừ khi họ thực sự muốn mất tất cả tiền của mình cho người xác thực. Nếu yêu cầu của bạn bị người xác nhận cho là không hợp lệ, trái phiếu của bạn sẽ được giữ bởi kho bạc.

Mọi yêu cầu phải đi kèm với một trọng tải chứa một số hoặc tất cả các đối số sau:

 

1 pub struct NewDataRequestArgs {
2 pub sources: Vec<Source>, // for api DR types, can be left as "[]" if arbitrator DR type
3 pub tags: Option<Vec<String>>, // for searching DR types
4 pub description: Option<String>, // question if arbitrator type, details
5 pub outcomes: Option<Vec<String>>, // for predefining outcomes of DR
6 pub challenge_period: WrappedTimestamp, // milliseconds, duration validators can challenge top outcome
7 pub data_type: DataRequestDataType, // type of data DR outcome is
8 pub creator: AccountId, // creator of DR
9 }

 

Source là:

 

1 pub struct Source {
2 pub end_point: String, // api endpoint, where validator can retrieve  outcome
3 pub source_path: String // json path to outcome
4 }

 

Đối với Yêu cầu dữ liệu API hoặc yêu cầu có kết quả có thể được truy xuất từ một số điểm cuối API nhất định, hãy điền vào điểm cuối bằng [các] điểm cuối API và đường dẫn source_path với đường dẫn (ví dụ: đường dẫn JSON) để nhận được value mong muốn. Ví dụ:

 

1 \"sources\": [
2 {
4 \"source_path\": \"prices[\$\$last][1]\"
5 }
6 ]

 

Đối với các yêu cầu của trọng tài hoặc các yêu cầu thường yêu cầu con người trả lời, Bạn có thể để lại các nguồn mà không có bất kỳ giá trị nào. Ví dụ:

image host

 

LƯU ý: yêu cầu của bạn phải có kết quả được phân định rõ ràng và không thể thay đổi theo thời gian hoặc địa điểm. Ví dụ: việc yêu cầu giá bitcoin hiện tại có thể thay đổi dựa trên thời gian trình xác thực cung cấp hoặc trao đổi / nguồn mà họ đã sử dụng. Cung cấp điểm kết thúc rõ ràng để lấy dữ liệu từ đó một epoch hoặc khoảng thời gian mà dữ liệu cần được thu thập để yêu cầu của bạn được đánh dấu là hợp lệ và không bị thực hiện trái phiếu của bạn.

 

DataRequestDataType là:

 

image host

 

Nếu bạn mong đợi kết quả của mình là một con số, hãy điền vào trường data_type dưới dạng Số với giá trị là cấp số nhân cho số đó. Ví dụ:

 

image host

 

Nếu bạn đang mong đợi kết quả là một chuỗi, bạn có thể điền vào trường data_type với giá trị String như sau:

 

image host

 

Sử dụng các thẻ để phân loại yêu cầu dữ liệu để truy vấn dễ dàng hơn sau này khi cần kết quả. Các thẻ rất linh hoạt và có thể được sử dụng để nhóm nhiều loại yêu cầu dữ liệu lại với nhau. Trong ví dụ của chúng tôi, chúng tôi sử dụng một số tự động tăng dần để dễ dàng liên kết từng yêu cầu dữ liệu với kết quả của nó.

Mô tả có thể được điền vào dữ liệu được yêu cầu, ví dụ: &ldquo;Giá đóng cửa của Bitcoin vào ngày 1 tháng 12 năm 2020 là bao nhiêu?&rdquo;

Như một tùy chọn, bạn có thể thêm danh sách các kết quả có thể mong đợi làm giá trị cho trường kết quả. Nó cũng có thể được để trống trong trường hợp có câu trả lời tùy ý, chẳng hạn như từ nguồn cấp dữ liệu giá.

Challenge_period là khoảng thời gian để người xác thực đặt cược vào kết quả sau khi đạt đến thời gian giải quyết. Khoảng thời gian này có kỳ hạn tối thiểu là 300.000ms (5 phút) và kỳ hạn tối đa là 86.400.000ms (24 giờ).

Người tạo yêu cầu dữ liệu, thường được đặt tự động bởi Giao diện yêu cầu.

Yêu cầu API

Nhiều yêu cầu sẽ được thực hiện sẽ yêu cầu câu trả lời từ một vị trí API cụ thể. Trong trường hợp này, bạn phải điền vào end_pointsource_path trong phần sources để có thể tìm thấy một kết quả duy nhất. Nếu bạn là một giao thức cần thực hiện các yêu cầu tự động, bạn có thể làm như vậy khá dễ dàng bằng cách thiết lập các yêu cầu API.

Sau khi được điền, các đối số yêu cầu dữ liệu có thể trông giống như sau:

 

1 "{
2 \"amount\": \"1000000000000000000000000\",
3 \"payload\": {
4 \"sources\": [
5 {
7 \"source_path\": \"prices[\$\$last][1]\"
8 }
9 ],
10 \"tags\":[\"pricing\",\"btc\"],
11 \"challenge_period\":\"120000000000\",
12 \"settlement_time\":\"1\",
13 \"data_type\":{
14 \"Number\":\"10000000000\"
15 },
16 \"creator\":\"YOUR_TESTNET_ACCOUNT_ID\"
17 }
18 }"

 

Khi đã sẵn sàng, bạn có thể thực hiện yêu cầu dữ liệu của mình bằng các lệnh sau hoặc chạy sh scripts / request.sh YOUR_TESTNET_ACCOUNT_ID:

 

1 env NEAR_ENV=testnet
2
3 TIME=`date +%s`
4 END_TIME=`expr $TIME`
5 BEGIN_TIME=`expr $END_TIME - 300`
7 JSON="{\"sources\": $SOURCES,\"tags\":[\"1\"],\"description\":\"What is the price of BTC?\",\"challenge_period\":\"120000000000\",\"settlement_time\":\"1\",\"data_type\":{\"Number\":\"10000000000\"},\"creator\":\"your_account_id.flux-dev\"}"
8 env NEAR_ENV=testnet near call $1 create_data_request "{\"amount\": \"1000000000000000000000000\", \"payload\": $JSON}" --accountId $1 --amount 0.000000000000000000000001 --gas=300000000000000

 

Vậy là bạn đã thực hiện yêu cầu dữ liệu đầu tiên của mình!

Yêu cầu của trọng tài (con người)

Điều gì xảy ra nếu yêu cầu của bạn không có một API cụ thể mà bạn muốn có câu trả lời? Không vấn đề gì!

Chỉ cần đưa câu hỏi vào phần description, thay đổi data_type và để trống các nguồn.

1 JSON="{\"sources\": [],\"tags\":[\"sports\",\"nfl\"],\"description\":\"Which team won the NFL Super Bowl in 1996?\",\"challenge_period\":\"120000000000\",\"settlement_time\":\"1\",\"data_type\":\"String\",\"creator\":\"your_account_id.flux-dev\"}"
2 env NEAR_ENV=testnet near call $1 create_data_request "{\"amount\": \"1000000000000000000000000\", \"payload\": $JSON}" --accountId $1 --amount 0.000000000000000000000001 --gas=300000000000000

Nhận kết quả của các yêu cầu

Khi bạn đã gửi yêu cầu thành công, bạn có thể kiểm tra tiến trình trong Oracle Explorer, xem ai đang đặt cược và kết quả tiềm năng là gì. Sau khi một kết quả, hoặc câu trả lời cho yêu cầu của bạn, được cung cấp đủ ràng buộc và không có tranh chấp chống lại nó, bạn sẽ nhận được kết quả của mình thông qua hàm set_outcome được gọi bởi oracle. Trong hợp đồng mẫu của chúng tôi, kết quả được lưu trữ trong bản đồ tra cứu data_responses với cùng một khóa (giá trị tự động tăng dần) như yêu cầu dữ liệu tương ứng của nó.

Để kiểm tra yêu cầu và phản hồi của bạn (kết quả yêu cầu), hãy chạy các lệnh sau, thay thế YOUR_TESTNET_ACCOUNT_ID bằng id tài khoản testnet của bạn và YOUR_REQUEST_NONCE bằng dòng chữ nonce trong thẻ DR:

 

image host

 

Hàm get_data_request sẽ trả về Option <DataRequest> và hàm get_data_response sẽ trả về Option <DataResponse>.

Để tìm hiểu thêm về cách Yêu cầu dữ liệu chảy qua Oracle, hãy xem phần Yêu cầu dữ liệu tại đây.

Nguồn: https://docs.fluxprotocol.org/docs/getting-started/data-requesters