#server #rest #contract #protocols #declarative #rqlite #post

bin+lib essential-rest-server

一个包装 Essential 服务器并公开其功能的 REST 服务器

5 个版本 (破坏性更新)

0.4.0 2024 年 8 月 23 日
0.3.0 2024 年 8 月 14 日
0.2.0 2024 年 7 月 30 日
0.1.0 2024 年 7 月 8 日
0.0.0-release2024 年 7 月 8 日

#7 in #rqlite

Download history 255/week @ 2024-07-08 146/week @ 2024-07-29 133/week @ 2024-08-12

279 每月下载量

Apache-2.0

300KB
7.5K SLoC

Essential Rest Server

Crates.io Documentation license Build Status

一个轻量级的 HTTP REST 服务器,旨在方便与 Essential 协议交互。该服务器充当客户端与 Essential 声明式协议之间的接口,允许轻松集成和 Essential 生态系统中的通信。

运行服务器

Nix

内存数据库

nix run .#essential-rest-server

Rqlite

在已运行 rqlite 服务器的环境中

nix run .#essential-rest-server -- --db rqlite -r ${server_address}

运行 rqlite 服务器和 essential-rest-server

nix run .#server-with-rqlite -- /path/to/rqlite/data/dir

Cargo

cargo run -p essential-rest-server --release -- --help

API

请注意,这个 API 很可能改变,因为它目前是一个 WIP。

POST /deploy-contract

请求体:JSON 格式的 SignedPredicates
响应:JSON 格式的 ContentAddress

示例

curl --http2-prior-knowledge -X POST -H "Content-Type: application/json" \
    -d '{"contract":{"predicates":[{"state_read":[],"constraints":[],"directive":"Satisfy"}],"salt":"0000000000000000000000000000000000000000000000000000000000000000"},"signature":"D7B64C906BD6CA28DB9F02F21A295A96E134C13DB31F86E6A8A9BA5680A073D61ED8039FA47C26F24D5ED08808854332723BA274D9E0BDE5276D79DE82C25C9901"}' \
    https://127.0.0.1:59498/deploy-contract

GET /get-contract/:address

参数

  • :address = [u8; 32] 作为十六进制字符串。这是合约的内容地址。

响应:JSON 格式的 Option<SignedContract>

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" https://127.0.0.1:59498/get-contract/EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236

GET /get-predicate/:contract/:address

参数

  • :contract = [u8; 32] 作为十六进制字符串。这是合约的内容地址。
  • :address = [u8; 32] 作为十六进制字符串。这是谓词的内容地址。

返回值: Option<Predicate> 作为 JSON

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" https://127.0.0.1:59498/get-predicate/EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236/709E80C88487A2411E1EE4DFB9F22A861492D20C4765150C0C794ABD70F8147C

GET /list-contracts

查询参数

  • 可选 { start: u64, end: u64 }。这是列出合约的时间范围。包括起始时间,不包括结束时间。
  • 可选 { page: u64 }。这是列出合约的页码。默认为 0。

返回值: Vec<Contract> 作为 JSON

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" "https://127.0.0.1:59498/list-contracts?start=0&end=1&page=0"

GET /subscribe-contracts

此 API 是服务器发送事件 API。
这允许您订阅新部署的合约。查询参数

  • 可选 { start: u64 }。这是开始返回合约的时间。
  • 可选 { page: u64 }。这是返回合约的页码。默认为 0。

返回值: Stream<Item = Result<Contract>> 其中结果和合约都是 JSON 格式。

示例

curl --http2-prior-knowledge -N -X GET -H "Content-Type: application/json" "https://127.0.0.1:59498/subscribe-blocks?start=0&end=1&page=0&block=0"

POST /submit-solution

请求体: Solution 作为 JSON
返回值: Hash 作为 JSON

示例

curl --http2-prior-knowledge -X POST -H "Content-Type: application/json" -d '{"data":[{"predicate_to_solve":{"contract":"EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236","predicate":"709E80C88487A2411E1EE4DFB9F22A861492D20C4765150C0C794ABD70F8147C"},"decision_variables":[],"transient_data":[],"state_mutations":[]}]}' https://127.0.0.1:59498/submit-solution

GET /list-solutions-pool

查询参数

  • 可选 { page: u64 }。这是列出合约的页码。默认为 0。

返回值: Vec<Solution> 作为 JSON

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" "https://127.0.0.1:59498/list-solutions-pool" 

GET /query-state/:address/:key

参数

  • :address = [u8; 32] 作为十六进制字符串。这是合约的内容地址。
  • :key = Vec<u8> 作为十六进制字符串。这是状态的键。

返回值: Option<Word> 作为 JSON

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" https://127.0.0.1:59498/query-state/EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236/00

GET /list-blocks

查询参数

  • 可选 { start: u64, end: u64 }。这是列出块的时问范围。包括起始时间,不包括结束时间。
  • 可选 { page: u64 }。这是列出块的页码。默认为 0。
  • 可选 { block: u64 }。这是列出块的块号。

返回: Vec<Block> 作为 JSON

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" "https://127.0.0.1:59498/list-blocks?start=0&end=1&page=0&block=0"

GET /subscribe-blocks

此 API 是服务器发送事件 API。
这允许您订阅新块,当它们被添加到链中时。

  • 可选 { start: u64 }。这是开始返回块的时间。
  • 可选 { page: u64 }。这是要返回块的页码。默认为 0。
  • 可选 { block: u64 }。这是要返回块的块号。

返回: Stream<Item = Result<Block>> 其中结果和块是 JSON。

示例

curl --http2-prior-knowledge -N -X GET -H "Content-Type: application/json" "https://127.0.0.1:59498/subscribe-blocks?start=0&end=1&page=0&block=0"

GET /solution-outcome/:hash

参数

  • :hash = [u8; 32] 作为十六进制字符串。这是解决方案的哈希。

返回: Vec<SolutionOutcome> 作为 JSON

pub enum SolutionOutcome {
    Success(u64),
    Fail(String),
}

示例

curl --http2-prior-knowledge -X GET -H "Content-Type: application/json" "https://127.0.0.1:59498/solution-outcome/11CAD716457F6D6524EF84FBA73D11BB5E18658F6EE72EBAC8A14323B37A68FC

POST /check-solution

检查解决方案与已部署合约是否一致,不改变状态。
这是解决方案的试运行。
请求体: Solution 作为 JSON
返回: CheckSolutionOutput 作为 JSON

pub struct CheckSolutionOutput {
    pub utility: f64,
    pub gas: u64,
}

示例

curl --http2-prior-knowledge -X POST -H "Content-Type: application/json" -d '{"data":[{"predicate_to_solve":{"contract":"EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236","predicate":"709E80C88487A2411E1EE4DFB9F22A861492D20C4765150C0C794ABD70F8147C"},"decision_variables":[],"transient_data":[],"state_mutations":[]}]}' https://127.0.0.1:59498/check-solution

POST /check-solution-with-contracts

检查解决方案与所有合约是否一致,不改变状态。
这是解决方案的试运行。
正文: CheckSolution 作为 JSON \

struct CheckSolution {
    solution: Solution,
    contract: Contract,
}

返回: CheckSolutionOutput 作为 JSON

pub struct CheckSolutionOutput {
    pub utility: f64,
    pub gas: u64,
}

示例

curl --http2-prior-knowledge -X POST -H "Content-Type: application/json" -d '{"solution":{"data":[{"predicate_to_solve":{"contract":"EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236","predicate":"709E80C88487A2411E1EE4DFB9F22A861492D20C4765150C0C794ABD70F8147C"},"decision_variables":[],"transient_data":[],"state_mutations":[]}]},"contracts":[{"predicates":[{"state_read":[],"constraints":[],"directive":"Satisfy"}],"salt":"0000000000000000000000000000000000000000000000000000000000000000"}]}' https://127.0.0.1:59498/check-solution-with-contracts

POST /query-state-reads

使用状态读取程序在状态上运行查询,
这允许您使用您的 pint 程序的状态读取部分来查询状态。
这对于调试时获取解决方案的前置状态也很有用。
正文: QueryStateReads 作为 JSON \

pub struct QueryStateReads {
    pub state_read: Vec<StateReadBytecode>,
    pub index: SolutionDataIndex,
    pub solution: Solution,
    pub request_type: StateReadRequestType,
}

返回: QueryStateReadsOutput 作为 JSON

pub enum QueryStateReadsOutput {
    Reads(BTreeMap<ContentAddress, Vec<(Key, Value)>>),
    Slots(Slots),
    All(BTreeMap<ContentAddress, Vec<(Key, Value)>>, Slots),
    Failure(String),
}

这些类型定义在此存储库中 essential-server-types 载体的 essential-server-types
示例

curl --http2-prior-knowledge -X POST -H "Content-Type: application/json" -d '{"state_read":[],"index":0,"solution":{"data":[{"predicate_to_solve":{"contract":"EE3F28F3E0396EEE29613AF73E65D2BA52AE606E5FFD14D5EBD02A0FB5B88236","predicate":"709E80C88487A2411E1EE4DFB9F22A861492D20C4765150C0C794ABD70F8147C"},"decision_variables":[],"transient_data":[],"state_mutations":[]}]},"request_type":{"All":"All"}}' https://127.0.0.1:59498/query-state-reads

依赖项

~22–36MB
~557K SLoC