[marketplace] support freeing of slots and failed state

Support storage contract parameters to free slots after too many proofs missed, as well as fail a contract after too many slots have been freed.

# Conflicts:
#	vendor/dagger-contracts
This commit is contained in:
Eric Mastro 2022-08-26 14:08:02 +10:00 committed by Eric Mastro
parent 8dd110765f
commit b9e53e182f
7 changed files with 19 additions and 10 deletions

View File

@ -36,10 +36,14 @@ method requestStorage(market: OnChainMarket,
method getRequest(market: OnChainMarket, method getRequest(market: OnChainMarket,
id: RequestId): Future[?StorageRequest] {.async.} = id: RequestId): Future[?StorageRequest] {.async.} =
let request = await market.contract.getRequest(id) try:
if request != StorageRequest.default: let request = await market.contract.getRequest(id)
return some request if request != StorageRequest.default:
else: return some request
else:
return none StorageRequest
except ValueError:
# Unknown request
return none StorageRequest return none StorageRequest
method getHost(market: OnChainMarket, method getHost(market: OnChainMarket,

View File

@ -19,6 +19,7 @@ type
duration*: UInt256 duration*: UInt256
proofProbability*: UInt256 proofProbability*: UInt256
reward*: UInt256 reward*: UInt256
maxSlotLoss*: uint64
StorageContent* = object StorageContent* = object
cid*: string cid*: string
erasure*: StorageErasure erasure*: StorageErasure
@ -56,7 +57,8 @@ func fromTuple(_: type StorageAsk, tupl: tuple): StorageAsk =
slotSize: tupl[1], slotSize: tupl[1],
duration: tupl[2], duration: tupl[2],
proofProbability: tupl[3], proofProbability: tupl[3],
reward: tupl[4] reward: tupl[4],
maxSlotLoss: tupl[5]
) )
func fromTuple(_: type StorageContent, tupl: tuple): StorageContent = func fromTuple(_: type StorageContent, tupl: tuple): StorageContent =

View File

@ -15,7 +15,7 @@ type
SlotFilled* = object of Event SlotFilled* = object of Event
requestId* {.indexed.}: RequestId requestId* {.indexed.}: RequestId
slotIndex* {.indexed.}: UInt256 slotIndex* {.indexed.}: UInt256
slotId* {.indexed.}: SlotId slotId*: SlotId
RequestFulfilled* = object of Event RequestFulfilled* = object of Event
requestId* {.indexed.}: RequestId requestId* {.indexed.}: RequestId
RequestCancelled* = object of Event RequestCancelled* = object of Event
@ -28,6 +28,7 @@ type
proc collateralAmount*(storage: Storage): UInt256 {.contract, view.} proc collateralAmount*(storage: Storage): UInt256 {.contract, view.}
proc slashMisses*(storage: Storage): UInt256 {.contract, view.} proc slashMisses*(storage: Storage): UInt256 {.contract, view.}
proc slashPercentage*(storage: Storage): UInt256 {.contract, view.} proc slashPercentage*(storage: Storage): UInt256 {.contract, view.}
proc minCollateralThreshold*(storage: Storage): UInt256 {.contract, view.}
proc deposit*(storage: Storage, amount: UInt256) {.contract.} proc deposit*(storage: Storage, amount: UInt256) {.contract.}
proc withdraw*(storage: Storage) {.contract.} proc withdraw*(storage: Storage) {.contract.}

View File

@ -270,7 +270,8 @@ proc requestStorage*(self: CodexNodeRef,
slots: nodes + tolerance, slots: nodes + tolerance,
slotSize: (encoded.blockSize * encoded.steps).u256, slotSize: (encoded.blockSize * encoded.steps).u256,
duration: duration, duration: duration,
reward: reward reward: reward,
maxSlotLoss: tolerance
), ),
content: StorageContent( content: StorageContent(
cid: $encodedBlk.cid, cid: $encodedBlk.cid,

View File

@ -17,7 +17,8 @@ proc example*(_: type StorageRequest): StorageRequest =
slotSize: (1 * 1024 * 1024 * 1024).u256, # 1 Gigabyte slotSize: (1 * 1024 * 1024 * 1024).u256, # 1 Gigabyte
duration: (10 * 60 * 60).u256, # 10 hours duration: (10 * 60 * 60).u256, # 10 hours
proofProbability: 4.u256, # require a proof roughly once every 4 periods proofProbability: 4.u256, # require a proof roughly once every 4 periods
reward: 84.u256 reward: 84.u256,
maxSlotLoss: 2 # 2 slots can be freed without data considered to be lost
), ),
content: StorageContent( content: StorageContent(
cid: "zb2rhheVmk3bLks5MgzTqyznLu1zqGH5jrfTA1eAZXrjx7Vob", cid: "zb2rhheVmk3bLks5MgzTqyznLu1zqGH5jrfTA1eAZXrjx7Vob",

View File

@ -135,7 +135,7 @@ ethersuite "On-Chain Market":
await token.approve(storage.address, request.price) await token.approve(storage.address, request.price)
discard await market.requestStorage(request) discard await market.requestStorage(request)
await token.approve(storage.address, otherrequest.price) await token.approve(storage.address, otherRequest.price)
discard await market.requestStorage(otherRequest) discard await market.requestStorage(otherRequest)
var receivedIds: seq[RequestId] var receivedIds: seq[RequestId]

@ -1 +1 @@
Subproject commit 06e58fdc4923999cb93e54b55a5e68da26435628 Subproject commit c27d4f870c99f8657027ec9b1ab24223adba9859