Merge branch 'master' into async-tree-building
This commit is contained in:
commit
7e0328d271
|
@ -56,7 +56,7 @@ proc approveFunds(market: OnChainMarket, amount: UInt256) {.async.} =
|
||||||
discard await token.increaseAllowance(market.contract.address(), amount).confirm(0)
|
discard await token.increaseAllowance(market.contract.address(), amount).confirm(0)
|
||||||
|
|
||||||
method getZkeyHash*(market: OnChainMarket): Future[?string] {.async.} =
|
method getZkeyHash*(market: OnChainMarket): Future[?string] {.async.} =
|
||||||
let config = await market.contract.config()
|
let config = await market.contract.configuration()
|
||||||
return some config.proofs.zkeyHash
|
return some config.proofs.zkeyHash
|
||||||
|
|
||||||
method getSigner*(market: OnChainMarket): Future[Address] {.async.} =
|
method getSigner*(market: OnChainMarket): Future[Address] {.async.} =
|
||||||
|
@ -65,18 +65,18 @@ method getSigner*(market: OnChainMarket): Future[Address] {.async.} =
|
||||||
|
|
||||||
method periodicity*(market: OnChainMarket): Future[Periodicity] {.async.} =
|
method periodicity*(market: OnChainMarket): Future[Periodicity] {.async.} =
|
||||||
convertEthersError:
|
convertEthersError:
|
||||||
let config = await market.contract.config()
|
let config = await market.contract.configuration()
|
||||||
let period = config.proofs.period
|
let period = config.proofs.period
|
||||||
return Periodicity(seconds: period)
|
return Periodicity(seconds: period)
|
||||||
|
|
||||||
method proofTimeout*(market: OnChainMarket): Future[UInt256] {.async.} =
|
method proofTimeout*(market: OnChainMarket): Future[UInt256] {.async.} =
|
||||||
convertEthersError:
|
convertEthersError:
|
||||||
let config = await market.contract.config()
|
let config = await market.contract.configuration()
|
||||||
return config.proofs.timeout
|
return config.proofs.timeout
|
||||||
|
|
||||||
method proofDowntime*(market: OnChainMarket): Future[uint8] {.async.} =
|
method proofDowntime*(market: OnChainMarket): Future[uint8] {.async.} =
|
||||||
convertEthersError:
|
convertEthersError:
|
||||||
let config = await market.contract.config()
|
let config = await market.contract.configuration()
|
||||||
return config.proofs.downtime
|
return config.proofs.downtime
|
||||||
|
|
||||||
method getPointer*(market: OnChainMarket, slotId: SlotId): Future[uint8] {.async.} =
|
method getPointer*(market: OnChainMarket, slotId: SlotId): Future[uint8] {.async.} =
|
||||||
|
@ -176,7 +176,7 @@ method fillSlot(market: OnChainMarket,
|
||||||
|
|
||||||
method freeSlot*(market: OnChainMarket, slotId: SlotId) {.async.} =
|
method freeSlot*(market: OnChainMarket, slotId: SlotId) {.async.} =
|
||||||
convertEthersError:
|
convertEthersError:
|
||||||
var freeSlot: Future[?TransactionResponse]
|
var freeSlot: Future[Confirmable]
|
||||||
if rewardRecipient =? market.rewardRecipient:
|
if rewardRecipient =? market.rewardRecipient:
|
||||||
# If --reward-recipient specified, use it as the reward recipient, and use
|
# If --reward-recipient specified, use it as the reward recipient, and use
|
||||||
# the SP's address as the collateral recipient
|
# the SP's address as the collateral recipient
|
||||||
|
|
|
@ -17,18 +17,18 @@ export requests
|
||||||
type
|
type
|
||||||
Marketplace* = ref object of Contract
|
Marketplace* = ref object of Contract
|
||||||
|
|
||||||
proc config*(marketplace: Marketplace): MarketplaceConfig {.contract, view.}
|
proc configuration*(marketplace: Marketplace): MarketplaceConfig {.contract, view.}
|
||||||
proc token*(marketplace: Marketplace): Address {.contract, view.}
|
proc token*(marketplace: Marketplace): Address {.contract, view.}
|
||||||
proc slashMisses*(marketplace: Marketplace): UInt256 {.contract, view.}
|
proc slashMisses*(marketplace: Marketplace): UInt256 {.contract, view.}
|
||||||
proc slashPercentage*(marketplace: Marketplace): UInt256 {.contract, view.}
|
proc slashPercentage*(marketplace: Marketplace): UInt256 {.contract, view.}
|
||||||
proc minCollateralThreshold*(marketplace: Marketplace): UInt256 {.contract, view.}
|
proc minCollateralThreshold*(marketplace: Marketplace): UInt256 {.contract, view.}
|
||||||
|
|
||||||
proc requestStorage*(marketplace: Marketplace, request: StorageRequest): ?TransactionResponse {.contract.}
|
proc requestStorage*(marketplace: Marketplace, request: StorageRequest): Confirmable {.contract.}
|
||||||
proc fillSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256, proof: Groth16Proof): ?TransactionResponse {.contract.}
|
proc fillSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256, proof: Groth16Proof): Confirmable {.contract.}
|
||||||
proc withdrawFunds*(marketplace: Marketplace, requestId: RequestId): ?TransactionResponse {.contract.}
|
proc withdrawFunds*(marketplace: Marketplace, requestId: RequestId): Confirmable {.contract.}
|
||||||
proc withdrawFunds*(marketplace: Marketplace, requestId: RequestId, withdrawAddress: Address): ?TransactionResponse {.contract.}
|
proc withdrawFunds*(marketplace: Marketplace, requestId: RequestId, withdrawAddress: Address): Confirmable {.contract.}
|
||||||
proc freeSlot*(marketplace: Marketplace, id: SlotId): ?TransactionResponse {.contract.}
|
proc freeSlot*(marketplace: Marketplace, id: SlotId): Confirmable {.contract.}
|
||||||
proc freeSlot*(marketplace: Marketplace, id: SlotId, rewardRecipient: Address, collateralRecipient: Address): ?TransactionResponse {.contract.}
|
proc freeSlot*(marketplace: Marketplace, id: SlotId, rewardRecipient: Address, collateralRecipient: Address): Confirmable {.contract.}
|
||||||
proc getRequest*(marketplace: Marketplace, id: RequestId): StorageRequest {.contract, view.}
|
proc getRequest*(marketplace: Marketplace, id: RequestId): StorageRequest {.contract, view.}
|
||||||
proc getHost*(marketplace: Marketplace, id: SlotId): Address {.contract, view.}
|
proc getHost*(marketplace: Marketplace, id: SlotId): Address {.contract, view.}
|
||||||
proc getActiveSlot*(marketplace: Marketplace, id: SlotId): Slot {.contract, view.}
|
proc getActiveSlot*(marketplace: Marketplace, id: SlotId): Slot {.contract, view.}
|
||||||
|
@ -49,8 +49,8 @@ proc willProofBeRequired*(marketplace: Marketplace, id: SlotId): bool {.contract
|
||||||
proc getChallenge*(marketplace: Marketplace, id: SlotId): array[32, byte] {.contract, view.}
|
proc getChallenge*(marketplace: Marketplace, id: SlotId): array[32, byte] {.contract, view.}
|
||||||
proc getPointer*(marketplace: Marketplace, id: SlotId): uint8 {.contract, view.}
|
proc getPointer*(marketplace: Marketplace, id: SlotId): uint8 {.contract, view.}
|
||||||
|
|
||||||
proc submitProof*(marketplace: Marketplace, id: SlotId, proof: Groth16Proof): ?TransactionResponse {.contract.}
|
proc submitProof*(marketplace: Marketplace, id: SlotId, proof: Groth16Proof): Confirmable {.contract.}
|
||||||
proc markProofAsMissing*(marketplace: Marketplace, id: SlotId, period: UInt256): ?TransactionResponse {.contract.}
|
proc markProofAsMissing*(marketplace: Marketplace, id: SlotId, period: UInt256): Confirmable {.contract.}
|
||||||
|
|
||||||
proc reserveSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256): ?TransactionResponse {.contract.}
|
proc reserveSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256): Confirmable {.contract.}
|
||||||
proc canReserveSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256): bool {.contract, view.}
|
proc canReserveSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256): bool {.contract, view.}
|
||||||
|
|
|
@ -765,15 +765,15 @@ proc stop*(self: CodexNodeRef) {.async.} =
|
||||||
if not self.discovery.isNil:
|
if not self.discovery.isNil:
|
||||||
await self.discovery.stop()
|
await self.discovery.stop()
|
||||||
|
|
||||||
if not self.clock.isNil:
|
|
||||||
await self.clock.stop()
|
|
||||||
|
|
||||||
if clientContracts =? self.contracts.client:
|
if clientContracts =? self.contracts.client:
|
||||||
await clientContracts.stop()
|
await clientContracts.stop()
|
||||||
|
|
||||||
if hostContracts =? self.contracts.host:
|
if hostContracts =? self.contracts.host:
|
||||||
await hostContracts.stop()
|
await hostContracts.stop()
|
||||||
|
|
||||||
|
if not self.clock.isNil:
|
||||||
|
await self.clock.stop()
|
||||||
|
|
||||||
if validatorContracts =? self.contracts.validator:
|
if validatorContracts =? self.contracts.validator:
|
||||||
await validatorContracts.stop()
|
await validatorContracts.stop()
|
||||||
|
|
||||||
|
|
|
@ -59,19 +59,16 @@ proc onError(machine: Machine, error: ref CatchableError): Event =
|
||||||
state.onError(error)
|
state.onError(error)
|
||||||
|
|
||||||
proc run(machine: Machine, state: State) {.async.} =
|
proc run(machine: Machine, state: State) {.async.} =
|
||||||
try:
|
|
||||||
if next =? await state.run(machine):
|
if next =? await state.run(machine):
|
||||||
machine.schedule(Event.transition(state, next))
|
machine.schedule(Event.transition(state, next))
|
||||||
except CancelledError:
|
|
||||||
discard
|
|
||||||
|
|
||||||
proc scheduler(machine: Machine) {.async.} =
|
proc scheduler(machine: Machine) {.async.} =
|
||||||
var running: Future[void]
|
var running: Future[void]
|
||||||
try:
|
|
||||||
while machine.started:
|
while machine.started:
|
||||||
let event = await machine.scheduled.get().track(machine)
|
let event = await machine.scheduled.get().track(machine)
|
||||||
if next =? event(machine.state):
|
if next =? event(machine.state):
|
||||||
if not running.isNil and not running.finished:
|
if not running.isNil and not running.finished:
|
||||||
|
trace "cancelling current state", state = $machine.state
|
||||||
await running.cancelAndWait()
|
await running.cancelAndWait()
|
||||||
let fromState = if machine.state.isNil: "<none>" else: $machine.state
|
let fromState = if machine.state.isNil: "<none>" else: $machine.state
|
||||||
machine.state = next
|
machine.state = next
|
||||||
|
@ -79,11 +76,11 @@ proc scheduler(machine: Machine) {.async.} =
|
||||||
running = machine.run(machine.state)
|
running = machine.run(machine.state)
|
||||||
running
|
running
|
||||||
.track(machine)
|
.track(machine)
|
||||||
.catch((err: ref CatchableError) =>
|
.cancelled(proc() = trace "state.run cancelled, swallowing", state = $machine.state)
|
||||||
|
.catch(proc(err: ref CatchableError) =
|
||||||
|
trace "error caught in state.run, calling state.onError", state = $machine.state
|
||||||
machine.schedule(machine.onError(err))
|
machine.schedule(machine.onError(err))
|
||||||
)
|
)
|
||||||
except CancelledError:
|
|
||||||
discard
|
|
||||||
|
|
||||||
proc start*(machine: Machine, initialState: State) =
|
proc start*(machine: Machine, initialState: State) =
|
||||||
if machine.started:
|
if machine.started:
|
||||||
|
@ -93,12 +90,13 @@ proc start*(machine: Machine, initialState: State) =
|
||||||
machine.scheduled = newAsyncQueue[Event]()
|
machine.scheduled = newAsyncQueue[Event]()
|
||||||
|
|
||||||
machine.started = true
|
machine.started = true
|
||||||
machine.scheduler()
|
try:
|
||||||
.track(machine)
|
discard machine.scheduler().track(machine)
|
||||||
.catch((err: ref CatchableError) =>
|
|
||||||
error("Error in scheduler", error = err.msg)
|
|
||||||
)
|
|
||||||
machine.schedule(Event.transition(machine.state, initialState))
|
machine.schedule(Event.transition(machine.state, initialState))
|
||||||
|
except CancelledError as e:
|
||||||
|
discard
|
||||||
|
except CatchableError as e:
|
||||||
|
error("Error in scheduler", error = e.msg)
|
||||||
|
|
||||||
proc stop*(machine: Machine) {.async.} =
|
proc stop*(machine: Machine) {.async.} =
|
||||||
if not machine.started:
|
if not machine.started:
|
||||||
|
|
30
openapi.yaml
30
openapi.yaml
|
@ -443,21 +443,6 @@ paths:
|
||||||
summary: "Lists manifest CIDs stored locally in node."
|
summary: "Lists manifest CIDs stored locally in node."
|
||||||
tags: [ Data ]
|
tags: [ Data ]
|
||||||
operationId: listData
|
operationId: listData
|
||||||
parameters:
|
|
||||||
- name: content-type
|
|
||||||
in: header
|
|
||||||
required: false
|
|
||||||
description: The content type of the file. Must be valid.
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
example: "image/png"
|
|
||||||
- name: content-disposition
|
|
||||||
in: header
|
|
||||||
required: false
|
|
||||||
description: The content disposition used to send the filename.
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
example: "attachment; filename=\"codex.png\""
|
|
||||||
responses:
|
responses:
|
||||||
"200":
|
"200":
|
||||||
description: Retrieved list of content CIDs
|
description: Retrieved list of content CIDs
|
||||||
|
@ -478,6 +463,21 @@ paths:
|
||||||
summary: "Upload a file in a streaming manner. Once finished, the file is stored in the node and can be retrieved by any node in the network using the returned CID."
|
summary: "Upload a file in a streaming manner. Once finished, the file is stored in the node and can be retrieved by any node in the network using the returned CID."
|
||||||
tags: [ Data ]
|
tags: [ Data ]
|
||||||
operationId: upload
|
operationId: upload
|
||||||
|
parameters:
|
||||||
|
- name: content-type
|
||||||
|
in: header
|
||||||
|
required: false
|
||||||
|
description: The content type of the file. Must be valid.
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
example: "image/png"
|
||||||
|
- name: content-disposition
|
||||||
|
in: header
|
||||||
|
required: false
|
||||||
|
description: The content disposition used to send the filename.
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
example: "attachment; filename=\"codex.png\""
|
||||||
requestBody:
|
requestBody:
|
||||||
content:
|
content:
|
||||||
application/octet-stream:
|
application/octet-stream:
|
||||||
|
|
|
@ -38,7 +38,7 @@ ethersuite "Marketplace contracts":
|
||||||
let tokenAddress = await marketplace.token()
|
let tokenAddress = await marketplace.token()
|
||||||
token = Erc20Token.new(tokenAddress, ethProvider.getSigner())
|
token = Erc20Token.new(tokenAddress, ethProvider.getSigner())
|
||||||
|
|
||||||
let config = await marketplace.config()
|
let config = await marketplace.configuration()
|
||||||
periodicity = Periodicity(seconds: config.proofs.period)
|
periodicity = Periodicity(seconds: config.proofs.period)
|
||||||
|
|
||||||
request = StorageRequest.example
|
request = StorageRequest.example
|
||||||
|
|
|
@ -9,7 +9,7 @@ import ../checktest
|
||||||
type MockProvider = ref object of Provider
|
type MockProvider = ref object of Provider
|
||||||
chainId*: UInt256
|
chainId*: UInt256
|
||||||
|
|
||||||
method getChainId*(provider: MockProvider): Future[UInt256] {.async.} =
|
method getChainId*(provider: MockProvider): Future[UInt256] {.async: (raises:[ProviderError]).} =
|
||||||
return provider.chainId
|
return provider.chainId
|
||||||
|
|
||||||
proc configFactory(): CodexConf =
|
proc configFactory(): CodexConf =
|
||||||
|
|
|
@ -34,7 +34,7 @@ ethersuite "On-Chain Market":
|
||||||
setup:
|
setup:
|
||||||
let address = Marketplace.address(dummyVerifier = true)
|
let address = Marketplace.address(dummyVerifier = true)
|
||||||
marketplace = Marketplace.new(address, ethProvider.getSigner())
|
marketplace = Marketplace.new(address, ethProvider.getSigner())
|
||||||
let config = await marketplace.config()
|
let config = await marketplace.configuration()
|
||||||
hostRewardRecipient = accounts[2]
|
hostRewardRecipient = accounts[2]
|
||||||
|
|
||||||
market = OnChainMarket.new(marketplace)
|
market = OnChainMarket.new(marketplace)
|
||||||
|
@ -76,13 +76,13 @@ ethersuite "On-Chain Market":
|
||||||
|
|
||||||
test "can retrieve proof periodicity":
|
test "can retrieve proof periodicity":
|
||||||
let periodicity = await market.periodicity()
|
let periodicity = await market.periodicity()
|
||||||
let config = await marketplace.config()
|
let config = await marketplace.configuration()
|
||||||
let periodLength = config.proofs.period
|
let periodLength = config.proofs.period
|
||||||
check periodicity.seconds == periodLength
|
check periodicity.seconds == periodLength
|
||||||
|
|
||||||
test "can retrieve proof timeout":
|
test "can retrieve proof timeout":
|
||||||
let proofTimeout = await market.proofTimeout()
|
let proofTimeout = await market.proofTimeout()
|
||||||
let config = await marketplace.config()
|
let config = await marketplace.configuration()
|
||||||
check proofTimeout == config.proofs.timeout
|
check proofTimeout == config.proofs.timeout
|
||||||
|
|
||||||
test "supports marketplace requests":
|
test "supports marketplace requests":
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import pkg/ethers
|
import pkg/ethers
|
||||||
|
import pkg/serde/json
|
||||||
|
|
||||||
proc currentTime*(provider: Provider): Future[UInt256] {.async.} =
|
proc currentTime*(provider: Provider): Future[UInt256] {.async.} =
|
||||||
return (!await provider.getBlock(BlockTag.pending)).timestamp
|
return (!await provider.getBlock(BlockTag.pending)).timestamp
|
||||||
|
|
|
@ -85,7 +85,7 @@ template marketplacesuite*(name: string, body: untyped) =
|
||||||
marketplace = Marketplace.new(Marketplace.address, ethProvider.getSigner())
|
marketplace = Marketplace.new(Marketplace.address, ethProvider.getSigner())
|
||||||
let tokenAddress = await marketplace.token()
|
let tokenAddress = await marketplace.token()
|
||||||
token = Erc20Token.new(tokenAddress, ethProvider.getSigner())
|
token = Erc20Token.new(tokenAddress, ethProvider.getSigner())
|
||||||
let config = await mp.config(marketplace)
|
let config = await marketplace.configuration()
|
||||||
period = config.proofs.period.truncate(uint64)
|
period = config.proofs.period.truncate(uint64)
|
||||||
periodicity = Periodicity(seconds: period.u256)
|
periodicity = Periodicity(seconds: period.u256)
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,11 @@ import std/os
|
||||||
import std/osproc
|
import std/osproc
|
||||||
import std/options
|
import std/options
|
||||||
import pkg/chronos
|
import pkg/chronos
|
||||||
import codex/contracts
|
import pkg/codex/contracts
|
||||||
import ../../integration/marketplacesuite
|
import ../../asynctest
|
||||||
|
import ../../contracts/deployment
|
||||||
|
|
||||||
marketplacesuite "tools/cirdl":
|
suite "tools/cirdl":
|
||||||
const
|
const
|
||||||
cirdl = "build" / "cirdl"
|
cirdl = "build" / "cirdl"
|
||||||
workdir = "."
|
workdir = "."
|
||||||
|
@ -14,11 +15,11 @@ marketplacesuite "tools/cirdl":
|
||||||
let
|
let
|
||||||
circuitPath = "testcircuitpath"
|
circuitPath = "testcircuitpath"
|
||||||
rpcEndpoint = "ws://localhost:8545"
|
rpcEndpoint = "ws://localhost:8545"
|
||||||
marketplaceAddress = $marketplace.address
|
marketplaceAddress = Marketplace.address
|
||||||
|
|
||||||
discard existsOrCreateDir(circuitPath)
|
discard existsOrCreateDir(circuitPath)
|
||||||
|
|
||||||
let args = [circuitPath, rpcEndpoint, marketplaceAddress]
|
let args = [circuitPath, rpcEndpoint, $marketplaceAddress]
|
||||||
|
|
||||||
let process = osproc.startProcess(
|
let process = osproc.startProcess(
|
||||||
cirdl,
|
cirdl,
|
||||||
|
|
|
@ -34,7 +34,7 @@ proc getCircuitHash(rpcEndpoint: string, marketplaceAddress: string): Future[?!s
|
||||||
return failure("Invalid address: " & marketplaceAddress)
|
return failure("Invalid address: " & marketplaceAddress)
|
||||||
|
|
||||||
let marketplace = Marketplace.new(address, provider)
|
let marketplace = Marketplace.new(address, provider)
|
||||||
let config = await marketplace.config()
|
let config = await marketplace.configuration()
|
||||||
return success config.proofs.zkeyHash
|
return success config.proofs.zkeyHash
|
||||||
|
|
||||||
proc formatUrl(hash: string): string =
|
proc formatUrl(hash: string): string =
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 997696a20e0976011cdbc2f0ff3a844672056ba2
|
Subproject commit 1ce3d10fa2ed325f4f4d1608434e5c6bd666ce24
|
|
@ -1 +1 @@
|
||||||
Subproject commit 5b170adcb1ffb1dbb273d1b7679bf3d9a08adb76
|
Subproject commit 6523e70eafecc3b9728a491058818e685bd384fb
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0bf2bcbe74a18a3c7a709d57108bb7b51e748a92
|
Subproject commit 0408795be95c00d75e96eaef6eae8a9c734014f5
|
|
@ -1 +1 @@
|
||||||
Subproject commit bb53d49caf2a6c6cf1df365ba84af93cdcfa7aa3
|
Subproject commit 5127b26ee58076e9369e7c126c196793c2b12e73
|
|
@ -1 +1 @@
|
||||||
Subproject commit b1e5e5d39a99ea56b750f6d9272dd319f4ad4291
|
Subproject commit 83e4a2ccf621d3040c6e7e0267393ca2d205988e
|
|
@ -1 +1 @@
|
||||||
Subproject commit 384eb2561ee755446cff512a8e057325848b86a7
|
Subproject commit f709bd9e16b1b6870fe3e4401196479e014a2ef6
|
Loading…
Reference in New Issue