mirror of
https://github.com/codex-storage/nim-codex.git
synced 2025-01-09 12:35:51 +00:00
d56eb6aee1
* [contracts] Add SlotFreed event * [integration] allow test node to be stopped twice * [cli] add --validator option * [contracts] remove dead code * [contracts] instantiate OnChainMarket and OnChainClock only once * [contracts] add Validation * [sales] remove duplicate import * [market] add missing import * [market] subscribe to all SlotFilled events * [market] add freeSlot() * [sales] fix warnings * [market] subscribe to SlotFreed events * [contracts] fix warning * [validator] keep track of filled slots * [validation] remove slots that have ended * [proving] absorb Proofs into Market Both Proofs and Market are abstractions around the Marketplace contract, having them separately is more trouble than it's worth at the moment. * [market] add markProofAsMissing() * [clock] speed up waiting for clock in tests * [validator] mark proofs as missing * [timer] fix error on node shutdown * [cli] handle --persistence and --validator separately * [market] allow retrieval of proof timeout value * [validator] do not subscribe to SlotFreed events Freed slots are already handled in removeSlotsThatHaveEnded(), and onSlotsFreed() interfered with its iterator. * [validator] Start validation at the start of a new period To decrease the likelihood that we hit the validation timeout. * [validator] do not mark proofs as missing after timeout * [market] check whether proof can be marked as missing * [validator] simplify validation Simulate a transaction to mark proof as missing, instead of trying to keep track of all the conditions that may lead to a proof being marked as missing. * [build] use nim-ethers PR #40 Uses "pending" blocktag instead of "latest" blocktag for better simulation of transactions before sending them. https://github.com/status-im/nim-ethers/pull/40 * [integration] integration test for validator * [validator] monitor a maximum number of slots Adds cli parameter --validator-max-slots. * [market] fix missing collateral argument After rebasing, add the new argument to fillSlot calls. * [build] update to nim-ethers 0.2.5 * [validator] use Set instead of Table to keep track of slots * [validator] add logging * [validator] add test for slot failure * [market] use "pending" blocktag to use more up to date block time * [contracts] remove unused import * [validator] fix: wait until after period ends The smart contract checks that 'end < block.timestamp', so we need to wait until the block timestamp is greater than the period end.
98 lines
2.2 KiB
Nim
98 lines
2.2 KiB
Nim
## Nim-Dagger
|
|
## Copyright (c) 2022 Status Research & Development GmbH
|
|
## Licensed under either of
|
|
## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
## * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
## at your option.
|
|
## This file may not be copied, modified, or distributed except according to
|
|
## those terms.
|
|
|
|
import pkg/chronos
|
|
import pkg/chronicles
|
|
import pkg/questionable
|
|
import pkg/questionable/results
|
|
import pkg/contractabi/address as ca
|
|
|
|
import ../stores
|
|
import ../manifest
|
|
import ../streams
|
|
import ../utils
|
|
|
|
import ./por
|
|
import ./stpnetwork
|
|
import ./stpproto
|
|
import ./stpstore
|
|
|
|
export stpnetwork, stpstore, por, stpproto
|
|
|
|
type
|
|
StorageProofs* = object
|
|
store*: BlockStore
|
|
network*: StpNetwork
|
|
stpStore*: StpStore
|
|
|
|
proc upload*(
|
|
self: StorageProofs,
|
|
cid: Cid,
|
|
indexes: seq[int],
|
|
host: ca.Address): Future[?!void] {.async.} =
|
|
## Upload authenticators
|
|
##
|
|
|
|
without por =? (await self.stpStore.retrieve(cid)):
|
|
trace "Unable to retrieve por data from store", cid
|
|
return failure("Unable to retrieve por data from store")
|
|
|
|
return await self.network.uploadTags(
|
|
cid,
|
|
indexes,
|
|
por.authenticators,
|
|
host)
|
|
|
|
# proc proof*() =
|
|
# discard
|
|
|
|
# proc verify*() =
|
|
# discard
|
|
|
|
proc setupProofs*(
|
|
self: StorageProofs,
|
|
manifest: Manifest): Future[?!void] {.async.} =
|
|
## Setup storage authentication
|
|
##
|
|
|
|
without cid =? manifest.cid:
|
|
return failure("Unable to retrieve Cid from manifest!")
|
|
|
|
let
|
|
(spk, ssk) = keyGen()
|
|
por = await PoR.init(
|
|
StoreStream.new(self.store, manifest),
|
|
ssk,
|
|
spk,
|
|
manifest.blockSize)
|
|
|
|
return await self.stpStore.store(por.toMessage(), cid)
|
|
|
|
proc init*(
|
|
T: type StorageProofs,
|
|
network: StpNetwork,
|
|
store: BlockStore,
|
|
stpStore: StpStore): StorageProofs =
|
|
|
|
var
|
|
self = T(
|
|
store: store,
|
|
stpStore: stpStore,
|
|
network: network)
|
|
|
|
proc tagsHandler(msg: TagsMessage) {.async, gcsafe.} =
|
|
try:
|
|
await self.stpStore.store(msg.cid, msg.tags).tryGet()
|
|
trace "Stored tags", cid = $msg.cid, tags = msg.tags.len
|
|
except CatchableError as exc:
|
|
trace "Exception attempting to store tags", exc = exc.msg
|
|
|
|
self.network.tagsHandler = tagsHandler
|
|
self
|