Compare commits

...
2118 Commits
Author SHA1 Message Date
Łukasz Magiera c459a13dca Merge pull request #2593 from mgoelzer/paych_get_parse_as_fil
Parse amount as FIL in paych get
2020-07-25 09:54:54 +02:00
Mike Goelzer b409c8f2be Parse amount as FIL in paych get 2020-07-25 01:54:21 +00:00
Whyrusleeping f69cce4089 Merge pull request #2576 from filecoin-project/fix/testnet-compat
pull in specs actors fix for testnet
2020-07-24 13:17:41 -07:00
whyrusleeping cda0326cc3 go mod tidy 2020-07-24 13:09:19 -07:00
whyrusleeping 3bdcae9a59 dont update go-fil-commcid 2020-07-24 12:41:23 -07:00
whyrusleeping 1163d36b02 hardcode legacy multihash types for backward compat 2020-07-24 12:33:04 -07:00
whyrusleeping d764d86e89 pull in specs actors fix for testnet 2020-07-24 11:36:19 -07:00
Łukasz Magiera 3921623861 Merge pull request #2506 from filecoin-project/asr/null-tipset
API documentation must not tell lies
2020-07-23 22:07:36 +02:00
Łukasz Magiera 22c684deb6 Merge pull request #2534 from filecoin-project/asr/getsize
Implement buffered blocktore GetSize()
2020-07-23 10:59:28 +02:00
Łukasz Magiera df801470ca Return size in bufbs.GetSize 2020-07-23 10:23:44 +02:00
Łukasz Magiera 01685c44e4 Merge pull request #2543 from filecoin-project/asr/readme
update devnet in readme
2020-07-23 10:10:17 +02:00
Aayush Rajasekaran 2c895e8df2 update devnet in readme 2020-07-22 23:34:26 -04:00
Aayush Rajasekaran 54c0ae17f4 Implement buffered blocktore GetSize() 2020-07-22 19:58:35 -04:00
Aayush Rajasekaran d254fb228b API documentation must not tell lies 2020-07-21 13:44:05 -04:00
Łukasz Magiera 9b1d2f4c13 Merge pull request #2462 from jsign/jsign/ipfsbstore
ipfsbstore: offlinemode, and Has() fix
2020-07-18 01:52:37 +02:00
Ignacio Hagopian fd2262f51f ipbsbstore: offlinemode, and Has() fix
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-07-17 18:02:12 -03:00
Łukasz Magiera ee6269756c Merge pull request #2429 from filecoin-project/frrist/chainwatch-miner-precommit
feat: track miner precommit
2020-07-17 22:51:42 +02:00
frrist 7ff468ce85 feat: track miner precommit
- add materalized view showing all miner sector info
2020-07-17 12:25:54 -07:00
Łukasz Magiera c4de2373fd Merge pull request #2443 from filecoin-project/feat/chainwatch/capture-base-block-rewards
Capture base block rewards
2020-07-17 11:49:29 +02:00
Mike Greenberg 18d1ab0cb9 fix(chainwatch): Parallel reward persistence; Tighten rpc logging 2020-07-16 22:58:27 -04:00
Mike Greenberg 6e7f21de03 fix(chainwatch): Remove --front switch 2020-07-16 12:14:41 -04:00
Mike Greenberg c3cc2eea46 feat(chainwatch): Add miner index on top_miners_by_base_reward view 2020-07-16 11:36:52 -04:00
Mike Greenberg 7bfcff2c18 fix(chainwatch): Backoff processor when no work exists to process 2020-07-16 11:36:52 -04:00
Mike Greenberg f2f797f088 fix(log): Move metrics and stage updates to debug; Add --log-level switch 2020-07-16 11:36:52 -04:00
Mike Greenberg 033cfa8f47 fix(chainwatch): Correct index name on state_height view 2020-07-16 11:36:52 -04:00
Mike Greenberg 0cfddae711 feat(chainwatch): Capture base_block_reward per epoch; Top miner by reward view 2020-07-16 11:36:52 -04:00
Łukasz Magiera a87899ddb6 Merge pull request #2396 from filecoin-project/frrist/chainwatch-faster-sync
Improvments to Chainwatch Syncing and Processing Pipeline
2020-07-16 11:49:53 +02:00
Łukasz Magiera bbd4ffe842 Merge pull request #2430 from filecoin-project/asr/swap-signer
SwapSigner API methods
2020-07-16 11:28:51 +02:00
Aayush Rajasekaran 605560a981 SwapSigner API methods 2020-07-15 21:54:18 -04:00
frrist b4c9ba0a8b refactor: remove unused code 2020-07-15 11:43:04 -07:00
frrist 9a53bf8f83 refactor: wire up new processor and syncer 2020-07-15 11:42:19 -07:00
frrist 41f4f1fd83 refactor: implement processor and syncer
- When chainwatch is ran it will first start a Syncer that continuously collects blocks from the
ChainNotify channel and persists them to the blocks_synced table. Once the Syncer has caught the
blocks_synced table up to the lotus daemons current head a Processor is started. The Processor
selects a batch of contiguous blocks and extracts and stores their data. It attempts to do as much
work as it can in parallel. When the blocks are done being processed their corresponding
processed_at and is_processed fields in the blocks_synced table are filled out.
2020-07-15 11:42:19 -07:00
Łukasz Magiera 6b9fd74f8e Merge pull request #2419 from filecoin-project/schomatis/fix/newtipset/mismatch-lengths
fix: NewTipSet: check mismatch in number of parents
2020-07-15 17:49:39 +02:00
Łukasz Magiera ccba495840 Merge pull request #2331 from filecoin-project/chainwatch/market-state-deal-tracking
feat: add deal state and proposal tracking to cw
2020-07-15 16:19:10 +02:00
Lucas Molas 21ffe188f4 fix: NewTipSet: check mismatch in number of parents 2020-07-15 08:17:50 -03:00
Łukasz Magiera 5f1cc6cefd Merge pull request #2398 from filecoin-project/asr/msig-cli
clarify multisig create helptext
2020-07-14 10:03:37 +02:00
Łukasz Magiera 8d03a9e739 Merge pull request #2391 from jiyilanzhou/master
api/api_full.go: fix method signature
2020-07-14 10:03:17 +02:00
Aayush Rajasekaran 17642b5ecb clarify multisig create helptext 2020-07-13 19:50:18 -04:00
Whyrusleeping 62a503d686 Merge pull request #1563 from filecoin-project/feat/cache-bs
add an lru caching blockstore
2020-07-13 16:20:43 -07:00
erchuan.ma bb49546728 api/api_full.go: fix method signature
method signature not match
2020-07-13 22:35:51 +08:00
Łukasz Magiera 3f017688c7 Merge pull request #2377 from filecoin-project/asr/msig-api
API improvements
2020-07-13 13:24:09 +02:00
Łukasz Magiera bb07c0a5df Merge pull request #2378 from austinabell/zipml
Check message length before generating Cids
2020-07-13 13:20:56 +02:00
Łukasz Magiera 7ec58255bf Merge pull request #2387 from filecoin-project/asr/cli-api
CLI/API improvements
2020-07-13 13:15:43 +02:00
Aayush Rajasekaran 1a5c20ca75 CLI/API improvements 2020-07-13 01:13:56 -04:00
frrist c9cb39d5a0 polish: update deal proposal table if slashed 2020-07-12 11:39:58 -07:00
Aayush Rajasekaran 858513559b API improvements 2020-07-11 23:54:58 -04:00
Aayush Rajasekaran 12b63d59b2 Include unlock duration as a param for multisig creation 2020-07-11 23:54:58 -04:00
austinabell 2fd860324f avoid generating cids on all messages before checking message length 2020-07-10 19:59:58 -04:00
frrist f9d8b051f4 polish: track tipset height for processing 2020-07-10 15:01:55 -07:00
frrist 1e2e62bad6 polish: track unpadded piece size in deal prop 2020-07-10 15:01:55 -07:00
frrist e13a251cc8 feat: add deal state and proposal tracking to cw 2020-07-10 15:01:55 -07:00
Łukasz Magiera 39d609a661 Merge pull request #2169 from waynewyang/evnet
set called 'true' after handle be called
2020-07-10 22:28:00 +02:00
Łukasz Magiera 5530a7bef2 Merge pull request #2322 from filecoin-project/frrist/deal-state-changes
Frrist/deal state changes
2020-07-10 21:57:42 +02:00
Łukasz Magiera bc23b0ed4f Merge pull request #2278 from filecoin-project/fix/rename-vars
rename sync variables.
2020-07-10 21:36:04 +02:00
Łukasz Magiera dc9df10f5a sync: Also rename span attributes 2020-07-10 21:31:58 +02:00
Łukasz Magiera 69125f15f9 Merge pull request #2329 from filecoin-project/feat/chainwatch/capture-power
chainwatch: Capture power from miner and reward actors
2020-07-10 21:25:46 +02:00
Łukasz Magiera 3f0312a728 Merge pull request #2370 from filecoin-project/disable-call-StatePledgeCollateral
disable call to StatePledgeCollateral
2020-07-10 21:08:03 +02:00
Mike Greenberg ebd0e93a99 chainwatch: app exit with non-zero on error 2020-07-10 11:58:41 -04:00
Mike Greenberg 3332290626 fix: Logic bug; Schema column update stateroot -> state_root 2020-07-10 11:54:11 -04:00
Anton Evangelatov 0dbca1377a disable call to StatePledgeCollateral 2020-07-10 17:52:44 +02:00
Łukasz Magiera b245fd0b7d Merge pull request #2232 from filecoin-project/feat/verifreg-bitwidth
set proper bitwidth for verifreg command hamts
2020-07-10 16:19:45 +02:00
Łukasz Magiera e81f182840 Merge pull request #2330 from filecoin-project/feat/fil-units
produce and parse FIL suffix on FIL strings
2020-07-10 09:41:01 +02:00
whyrusleeping a3602d4fcf fix tests, handle parsing with suffixes properly 2020-07-09 17:26:06 -07:00
frrist bf6b76a4fb feat: add market deal state & proposal predicates
- detects changes in the market deal proposal and market deal state
amts.
2020-07-09 14:43:21 -07:00
Łukasz Magiera 2836b521f3 Merge pull request #2333 from filecoin-project/asr/temp
Correct initial setup of sector id counter
2020-07-09 21:40:30 +02:00
Łukasz Magiera f01378f83f Merge pull request #2336 from filecoin-project/mute/refresh
Mute RtRefreshManager logs as they break terminal emulation
2020-07-09 16:40:27 +02:00
Jakub Sztandera b0cf3d3228 Mute RtRefreshManager logs as they break terminal emulation
RtRefreshManager logs random binary strings, which somtimes might be
partial multi-byte Unicode or ASCI escape codes.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-09 16:21:55 +02:00
Aayush Rajasekaran 57a1418ff8 Correct initial setup of sector id counter 2020-07-09 01:05:27 -04:00
whyrusleeping a79b31c230 produce and parse FIL suffix on FIL strings 2020-07-08 16:16:45 -07:00
Mike Greenberg 1081679360 feat(chainwatch): Capture miner_power data 2020-07-08 18:56:55 -04:00
Mike Greenberg b9effac437 feat(chainwatch): Capture baseline power in chain_power 2020-07-08 18:40:09 -04:00
Łukasz Magiera 8fbeebb86d rename sync variables. 2020-07-08 22:02:28 +02:00
Łukasz Magiera 24d8a84ad7 Merge pull request #2252 from filecoin-project/override-maddr
add `actor` flag to `lotus-storage-miner` for proving and info calls
2020-07-08 21:28:29 +02:00
Łukasz Magiera 56bf503210 Merge pull request #2303 from filecoin-project/asr/cli
correct error message
2020-07-08 21:18:34 +02:00
Łukasz Magiera 9a5b26c50c Merge pull request #2326 from filecoin-project/feat/optim-badger
Ignore log.Sync() error
2020-07-08 21:16:13 +02:00
Łukasz Magiera 4952d4be77 Merge pull request #2321 from filecoin-project/frrist/generic-adt_array-diffing
polish: genericize adt array diff & extract store
2020-07-08 21:15:36 +02:00
Jakub Sztandera 68081a7a1f Ignore log.Sync() error
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-08 21:13:22 +02:00
Łukasz Magiera 67dd5937ca Merge pull request #2324 from filecoin-project/feat/optim-badger
Fix daemon shutdown and enable compact on close
2020-07-08 21:12:57 +02:00
Jakub Sztandera ebecca64a1 Fix daemon shutdown
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-08 21:08:24 +02:00
Jakub Sztandera 0e7b7c9fdb Update go-ds-badger2
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-08 21:08:23 +02:00
Jakub Sztandera d3d4612575 Re-eanble compact on close
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-08 20:59:46 +02:00
frrist 1254f9de0c clean: go mod tidy 2020-07-08 11:21:40 -07:00
frrist d78b7e57c7 polish: include key in AdtArrayDiff interface
- some values do not contain their keys
2020-07-08 11:19:14 -07:00
frrist 509e3b653c polish: genericize adt array diff & extract store
- adds testing for adt diff
2020-07-08 11:19:14 -07:00
Łukasz Magiera 631b8b5802 Merge pull request #2319 from filecoin-project/feat/optim-badger
Use mostly defaults for badger options
2020-07-08 18:05:58 +02:00
Jakub Sztandera 40286e4192 Use mostly defaults for badger options
This options are the defults in badger `master` now.
We should update to next badger version as soon as it is stable, it has
some nice improvments.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-08 17:54:33 +02:00
Łukasz Magiera 8e46753e38 Merge pull request #2306 from filecoin-project/fix/mark-bad
Fix bad block rason if ValidateBlock fails
2020-07-08 11:49:50 +02:00
Jakub Sztandera 74db060cdb Fix bad block rason if ValidateBlock fails
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-08 03:55:56 +02:00
whyrusleeping 0285a9741c remove debug logs 2020-07-07 16:44:57 -07:00
Aayush Rajasekaran 53b6de6c4b CLI proving info: Check sector index before reading from deadlines 2020-07-07 18:56:53 -04:00
Aayush Rajasekaran 8645839974 correct error message 2020-07-07 18:29:45 -04:00
Łukasz Magiera 683aded05c Merge pull request #2302 from filecoin-project/asr/cli
Minor CLI improvements
2020-07-08 00:01:31 +02:00
Aayush Rajasekaran 20c80f977c Rename state compute's height flag to vm-height 2020-07-07 17:40:57 -04:00
Aayush Rajasekaran eac8a909e9 Unify all sender flags in CLI under the same name 2020-07-07 17:37:43 -04:00
Łukasz Magiera 99b5ec96a2 Merge pull request #2101 from filecoin-project/feat/persistent-journal
implement a persistent journal for lotus node operations
2020-07-07 02:38:04 +02:00
Łukasz Magiera 74aa3e05fa journal: Fix panic with no journal set 2020-07-07 02:28:59 +02:00
Łukasz Magiera 66e547230d Merge pull request #2233 from filecoin-project/frrist/miner-sector-predicate
feat: add miner sector predicate and test
2020-07-07 01:43:41 +02:00
whyrusleeping 04bd56a068 log message if journal is not configured 2020-07-06 15:37:05 -07:00
frrist e1c29ca469 polish: wire up miner state predicate 2020-07-06 14:36:21 -07:00
frrist 3c6e46cd70 feat: add miner sector predicate and test
-polish: OnActorStateChanged operate over TipSetKey
    - it was calling key() interally and tipsetkeys are cheaper to get than
the full tipset
  -polish: improve predicate method names
2020-07-06 14:27:39 -07:00
Łukasz Magiera 27b5a8c3ba Merge pull request #2283 from filecoin-project/feat/better-bad-reason
Add better description to bad blocks
2020-07-06 22:56:53 +02:00
Jakub Sztandera 49800b8fec Add original tipset to the string
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-06 19:46:25 +02:00
Łukasz Magiera cf6ac44b6e Merge pull request #2277 from Leozhang404/master
if no sectors need to recovery, checkNextRecoveries will return
2020-07-06 19:24:15 +02:00
Jakub Sztandera 50c773c6a3 Add better description to bad blocks
Track original cause of blocks being marked as bad.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-06 19:23:29 +02:00
Łukasz Magiera 41d3ac2159 Merge pull request #2282 from filecoin-project/fix/msig-create-no-addrs
error out when trying to create multisig with no addresses
2020-07-06 18:44:22 +02:00
whyrusleeping 18f7b9bb1d use nicer timestamps 2020-07-06 09:43:19 -07:00
whyrusleeping ccf64a8534 add the real code 2020-07-06 09:42:00 -07:00
whyrusleeping 42bd4eccbe implement a persistent journal for lotus node operations 2020-07-06 09:42:00 -07:00
whyrusleeping 0964c0a8a1 error out when trying to create multisig with no addresses 2020-07-06 09:40:56 -07:00
Leo CheungandŁukasz Magiera 874cb46cb3 Update storage/wdpost_run.go
Co-authored-by: Łukasz Magiera <magik6k@users.noreply.github.com>
2020-07-06 06:20:41 -05:00
Leo CheungandŁukasz Magiera ddba20ccdf Update storage/wdpost_run.go
Co-authored-by: Łukasz Magiera <magik6k@users.noreply.github.com>
2020-07-06 06:19:47 -05:00
Łukasz Magiera 516e31d37c Merge pull request #2254 from filecoin-project/feat/decoded-return-values
provide decoded return values in output of StateWaitMsg
2020-07-06 11:24:12 +02:00
Łukasz Magiera 5836dfae41 Merge pull request #2259 from filecoin-project/yusef-mining-callback
add error argument to waitFunc callback in miner loop
2020-07-06 11:18:49 +02:00
Łukasz Magiera 3bb992fe6f Merge pull request #2265 from filecoin-project/misc/template-version
Use `lotus version` instead to get daemon version
2020-07-06 11:15:04 +02:00
Łukasz Magiera 2f3fc31f11 Merge pull request #2268 from chunqizhi/zcq02
Add return nil when faults == 0
2020-07-06 11:14:35 +02:00
Leo Cheung 4e12c4cb69 Update wdpost_run.go
if some unrecovered sectors can not recovered (such as cache file is missing) , miner should not send message "DeclareFaultsRecovered"
2020-07-06 15:52:58 +08:00
Leo Cheung 79e93760b7 Merge pull request #1 from filecoin-project/master
update-0706
2020-07-06 02:43:20 -05:00
chunqizhi 6c9beb9e87 Add return nil when faults == 0 2020-07-05 09:17:10 +08:00
Jakub Sztandera 1d0acf35d2 Use lotus version instead to get daemon version 2020-07-04 14:51:22 +02:00
Yusef Napora ea5dc461a1 pass error into waitFunc callback 2020-07-03 17:15:43 -04:00
Łukasz Magiera e5fdae45b7 Merge pull request #2253 from filecoin-project/extract-stats
extract stats package
2020-07-03 21:18:11 +02:00
Łukasz Magiera db50396eb5 Merge pull request #2256 from filecoin-project/feat/auto-fountains-sector-sizes
fountain: populate miner sector dropdown from specs-actors
2020-07-03 21:16:08 +02:00
Łukasz Magiera ff1cceb7bd Merge pull request #2257 from filecoin-project/fix/lotus-shed-keyinfo-switch
lotus-shed: fix secp256k1
2020-07-03 21:13:50 +02:00
Travis Person d3a007fd0a lotus-shed: fix secp256k1 2020-07-03 19:03:02 +00:00
Travis Person 4e0cf1644f fountain: populate miner sector dropdown from specs-actors 2020-07-03 19:01:56 +00:00
Anton Evangelatov fe49bcd9fa make linter happy 2020-07-03 19:52:15 +02:00
Anton Evangelatov e4d8f266c6 make linter happy 2020-07-03 19:49:21 +02:00
Anton Evangelatov faab606bd4 maddr -> actor 2020-07-03 19:45:21 +02:00
Anton Evangelatov 978ab67c73 override maddr on lotus-storage-miner info as well 2020-07-03 19:35:20 +02:00
Anton Evangelatov 4679c35e61 include headlag in func signature 2020-07-03 19:22:04 +02:00
whyrusleeping 16e493a67a provide decoded return values in output of StateWaitMsg 2020-07-03 09:57:58 -07:00
Anton Evangelatov 8b88c17503 extract stats package 2020-07-03 16:52:40 +02:00
Yusef Napora d6d68b9096 call waitFunc callback on mining error 2020-07-03 09:56:40 -04:00
Łukasz Magiera d3a1261f1e Merge pull request #2227 from filecoin-project/asr/api
Add docs comments to API
2020-07-03 15:33:07 +02:00
Łukasz Magiera 19178cca08 Merge pull request #2245 from filecoin-project/feat/fauxrep
Feat/fauxrep
2020-07-03 15:32:00 +02:00
chunqizhi 3e7654d459 Merge pull request #5 from filecoin-project/master
merge
2020-07-03 20:15:19 +08:00
Łukasz Magiera bb3758f648 seed: Support fake preseals 2020-07-03 03:29:21 +02:00
Łukasz Magiera 9d56dabb31 Merge pull request #2243 from filecoin-project/feat/buf-has-caching
check underlying datastore for objects before putting to bufbstore
2020-07-03 02:51:27 +02:00
Łukasz Magiera c3393ee185 seed: Move sector preseal to separate func 2020-07-03 02:47:33 +02:00
Łukasz Magiera 17039a5672 Update FFI 2020-07-03 02:23:45 +02:00
whyrusleeping 809a3ba07c check underlying datastore for objects before putting to bufbstore 2020-07-02 16:48:14 -07:00
Łukasz Magiera 5de7b62dbc Merge pull request #2241 from filecoin-project/fix/specs-actors-faults
Update specs actors to resolve forkiness bug
2020-07-02 22:15:11 +02:00
Jakub Sztandera 5fb76ddad2 Bump version
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 22:09:11 +02:00
Jakub Sztandera cc02092aae Go mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 21:53:21 +02:00
Jakub Sztandera 3e4b80e7f6 Update specs actors
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 21:52:55 +02:00
Łukasz Magiera 14ae8c7272 Merge pull request #2156 from filecoin-project/fix/bench-analyze
Improve performance of bench import analyze
2020-07-02 19:35:18 +02:00
Anton Evangelatov 2a050ca326 override maddr for observability 2020-07-02 18:48:39 +02:00
Jakub Sztandera 567b8082c3 Back to 10 callers
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:35 +02:00
Jakub Sztandera f3f92ce5bc add scratchpad to gitignore
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:35 +02:00
Jakub Sztandera c4158f12f1 Include proof number as extra in OnVerifyPost
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:35 +02:00
Jakub Sztandera 3429941639 Add info about OnActorExecDone
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 11dc902d53 Adjust OnMethodInvocation
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 41b775fdd4 Compute time spent in actors
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera e9d2a3edd9 Limit float print precision
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 42696372ee Progress to stderr
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 39625eada7 Add count
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 7a7e5a85ad Print tt from covar
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 254295b9c3 Readd covariance
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 4dd79ec6fa Calculate correlation
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:34 +02:00
Jakub Sztandera 9ccd25b072 Update gas values, compute correlation coefficient
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera 5e7f561133 Support complex extra, fix small bug in covariance
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera c68a8f802e Adjust gas
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera 29f5f451b3 Add covariance
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera 2caa7164a6 Midway adding covar
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera 21148033e2 Change alg for computing variance
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera bc88c632d1 Fix previous commit
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera 1e17ea3fff Adjust gas values
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:33 +02:00
Jakub Sztandera ca7e5f5e16 Set gas to 1
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera cd2595da67 Adjust gas
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera 3a9f1bf9a2 Revert "Try without recurson"
This reverts commit 76e3663b2b1f1b58f9097f45124add4fa7718199.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera 9094405537 Try without recurson
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera 4db61e71da Reduce caller depth
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera a6417dc24b Add stats test and print observation count
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera 1bc9fbca20 Ignore virtual
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera 369ec8221f Improve edge case handling
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:32 +02:00
Jakub Sztandera 052fc35a91 Maybe avoid NaNs
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:31 +02:00
Jakub Sztandera b8ab549bcb Cleanup lint
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:31 +02:00
Jakub Sztandera 4f60c1afe7 If something costs 0 gas, make it 1.
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:31 +02:00
Jakub Sztandera 9cd34509ee Fix error handling of json
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:31 +02:00
Jakub Sztandera a2fd0aad41 More on OnActorExec
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:31 +02:00
Jakub Sztandera 01ac4e5da3 Gas on actor exec
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:47:30 +02:00
Jakub Sztandera 01e230e810 Fix ratio
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:42 +02:00
Jakub Sztandera 78ee64d9f8 Fix stupid mistake
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:42 +02:00
Jakub Sztandera e5a7cb635c Siwtch back to float64
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:42 +02:00
Jakub Sztandera 49ddcdb4b0 Don't pass pointers
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:42 +02:00
Jakub Sztandera b5ae3c055b Remove warning
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera 9712bbc854 Decode in workers
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera 3134fcb54a Streaming mean and variance
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera 87d668390e Use float32
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera 710286d6e7 Add pprof
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera 04edeccbf4 fix trimming
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera db5929f4a5 Limit size of expensiveInvocs
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera e65215f1b5 Make lotus-bench import analyze multithreaded and less RAM hungry
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Jakub Sztandera c97720e731 Fix import analyze
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-07-02 18:46:41 +02:00
Łukasz Magiera 3aaa4fb692 Merge pull request #2239 from filecoin-project/feat/upgrade-markets-0.3.1.1
Hotfix upgrade markets to 0.3.1.1 to master
2020-07-02 17:08:48 +02:00
hannahhoward 7e1e9bcd60 fix(markets): upgrade markets to 0.3.1.1
upgrade to 0.3.1.1 to get critical node restart fixes and retrieval map access fix
2020-07-02 08:03:10 -07:00
Łukasz Magiera 8c347d8764 Merge pull request #2231 from filecoin-project/feat/lotus-manage-fds
have lotus attempt to raise its own file descriptor limit
2020-07-02 10:49:34 +02:00
Łukasz Magiera f7bffdf63a Merge pull request #2230 from filecoin-project/feat/add-peer-to-hello-fail-log
add peer ID to hello protocol failure log
2020-07-02 10:49:02 +02:00
Łukasz Magiera bda43a4627 Merge pull request #2229 from filecoin-project/fix/vm-abort-log-msg
fix vm abortf log message
2020-07-02 10:48:36 +02:00
Łukasz Magiera 19195ddf96 Merge pull request #2228 from filecoin-project/feat/docgen-perms
add perms listing to docgen output
2020-07-02 10:48:04 +02:00
whyrusleeping 5fa3021a79 set proper bitwidth for verifreg command hamts 2020-07-01 17:29:11 -07:00
whyrusleeping a5935486ef have lotus attempt to raise its own file descriptor limit 2020-07-01 17:09:21 -07:00
whyrusleeping ffd012906c add peer ID to hello protocol failure log 2020-07-01 16:20:05 -07:00
whyrusleeping f8a1fb2321 fix vm abortf log message 2020-07-01 15:51:21 -07:00
Aayush Rajasekaran 605e9bbbd7 Add docs comments to API 2020-07-01 17:16:05 -04:00
whyrusleeping 168b0f8df6 add perms listing to docgen output 2020-07-01 14:01:27 -07:00
Łukasz Magiera 70d8378404 Merge pull request #2214 from filecoin-project/fix/too-high-nonce-log
miner: Fix mpool too-high-nonce-msgs log
2020-07-01 17:30:27 +02:00
Łukasz Magiera 00e38ce126 Merge pull request #2219 from filecoin-project/feat/update-paramfetch
Update paramfetch
2020-07-01 17:28:37 +02:00
Łukasz Magiera 02c3f8ed80 Update paramfetch 2020-07-01 17:23:50 +02:00
Łukasz Magiera e949a458ec miner: Fix mpool too-high-nonce-msgs log 2020-07-01 12:53:27 +02:00
Łukasz Magiera 228ff3ba57 Merge pull request #2212 from filecoin-project/fix/master-build
sync: Fix build
2020-07-01 11:26:43 +02:00
Łukasz Magiera 4c1dfd7eda sync: Fix build 2020-07-01 11:24:26 +02:00
Łukasz Magiera e1799f1524 Merge pull request #2155 from filecoin-project/feat/ffi-0.30.1
Update FFI to 0.30.1
2020-07-01 11:17:18 +02:00
Łukasz Magiera 8f0e04027e Merge pull request #2154 from laser/feat/1920-selection-commands
implement toggling of online/offline storage/retrieval deals
2020-07-01 11:06:32 +02:00
Łukasz Magiera abdafc8ee4 Merge pull request #2140 from filecoin-project/chainwatch/sector-info-schema
feat: define miner sector schema
2020-07-01 11:02:57 +02:00
Łukasz Magiera 9030b559e8 Merge pull request #1470 from hunjixin/hunjixin/test/bls_benchmarks
add bench mark for bls sign and verify
2020-07-01 10:57:34 +02:00
Łukasz Magiera cd34d02377 Merge pull request #2209 from filecoin-project/feat/faster-winpost-sectors
use bitfields to enumerate sectors for winning post
2020-07-01 10:43:24 +02:00
Łukasz Magiera a362ef97df Merge pull request #2188 from filecoin-project/const-relaxation
make system constants configurable as vars.
2020-07-01 10:43:07 +02:00
Łukasz Magiera 92f392d422 Merge pull request #2192 from filecoin-project/fix/evnts-map-pnc
Fix concurrent map access panic in event API
2020-07-01 10:36:29 +02:00
Łukasz Magiera e8ddaab1c3 Merge pull request #2202 from jackoelv/patch-2
Update mining-troubleshooting.md
2020-07-01 10:35:56 +02:00
whyrusleeping da78ff9151 use bitfields to enumerate sectors for winning post 2020-06-30 21:57:49 -07:00
frrist e576c7a08e "feat": add logic to update miner sector table on term 2020-06-30 21:26:46 -07:00
jackoelv 2d180cdacf Update mining-troubleshooting.md
some code changed, document should be changed too. 
by default, bench is not maked by make 2k. so ,first make bench is safe.
I have checked the makefile, the bundle name is not lotus-bench but 'bench'.
2020-07-01 09:45:40 +08:00
Raúl Kripalani 77c7eb6fd9 fix lint errors. 2020-06-30 22:56:13 +01:00
Whyrusleeping 857b5962da Merge pull request #2000 from filecoin-project/asr/maxheight
Do not connect to peers with impossibly high heads
2020-06-30 14:24:50 -07:00
frrist 8c54c09ab7 pair: work from pair with placer 2020-06-30 13:22:58 -07:00
Łukasz Magiera 6927a532cf Update sector-storage with lower resource requirements 2020-06-30 21:03:44 +02:00
Dirk McCormick 49dccf4284 fix: concurrent map access panic 2020-06-30 14:24:08 -04:00
Jakub Sztandera a4751ddd01 Merge pull request #2190 from filecoin-project/chore/upd-log
Update go-log
2020-06-30 19:59:26 +02:00
Jakub Sztandera c811133aac Update go-log
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-30 19:39:13 +02:00
Frrist c16ea42fad fix: update miner_head table with new miner fields (#2142) 2020-06-30 10:26:41 -07:00
Raúl Kripalani 05e521ab03 fix test compilation issue. 2020-06-30 16:47:32 +01:00
Raúl Kripalani 1ef490feea rename build.PropagationDelay{=>Secs}. 2020-06-30 15:01:30 +01:00
Raúl Kripalani 3b826e41f6 rename build.AllowableClockDrift{=>Secs}. 2020-06-30 15:00:01 +01:00
Raúl Kripalani d232299c77 type constants on all build tags. 2020-06-30 14:58:34 +01:00
Raúl Kripalani f774d2aab1 add testground Makefile target; attach to buildall. 2020-06-30 14:48:13 +01:00
Raúl KripalaniandAnton Evangelatov 642aed93d9 remove superfluous comment.
Co-authored-by: Anton Evangelatov <anton.evangelatov@gmail.com>
2020-06-30 14:38:20 +01:00
Raúl Kripalani 4f9c907248 rename build.{BlockDelay=>BlockDelaySecs}.
Since this global is not typed as a time.Duration,
rather as an int, it makes sense to clarify the unit.
2020-06-30 14:26:49 +01:00
Raúl Kripalani 612b2fe9d7 revert changes in go.sum. 2020-06-30 14:21:39 +01:00
Raúl Kripalani 0fddf3e114 make system constants configurable as vars.
This configurability is unlocked through the `testground`
build tag, which Project Oni will uses.

Changes in the usage places of these relaxed constants
were required due to the fact that Golang constants are
untyped, but vars aren't.

Read https://blog.golang.org/constants for more info.
2020-06-30 14:18:26 +01:00
Łukasz Magiera c3898e4abf Merge pull request #2172 from filecoin-project/feat/pred-tests
Add more predicate tests
2020-06-30 11:32:13 +02:00
Łukasz Magiera 726c09618a Merge pull request #2177 from filecoin-project/feat/lotus-shed-keyinfo
lotus-shed: organize peer key generate and other key commands under keyinfo
2020-06-30 11:30:57 +02:00
Travis Person 12f10ac414 lotus-shed: organize peer key generate and other key commands under keyinfo 2020-06-29 20:07:39 +00:00
Łukasz Magiera 77b3bf8bc2 Update FFI to 0.30.1 2020-06-29 20:24:27 +02:00
Łukasz Magiera a0e1d5f567 Merge pull request #2175 from filecoin-project/feat/update-markets-0.3.1
Update to markets 0.3.1
2020-06-29 20:09:33 +02:00
hannahhoward 4e32c7edb3 feat(markets): update to markets 0.3.1
Update to markets 0.3.1 with multiaddr support for miners
2020-06-29 10:24:23 -07:00
Dirk McCormick c72def55fe test: add more predicate tests 2020-06-29 11:21:29 -04:00
Łukasz Magiera 982962ef0a Merge pull request #2171 from filecoin-project/fix/bitfield-null-marshal
Update go-bitfield with fixed empty marshaling
2020-06-29 16:14:47 +02:00
Łukasz Magiera 90a470ed78 Update go-bitfield with fixed empty marshaling 2020-06-29 16:06:57 +02:00
waynewyang 048d0e0d7a set 'true' after handle be called 2020-06-29 21:37:08 +08:00
Łukasz Magiera f812cac142 Merge pull request #2161 from waynewyang/mining
fix: mining logic
2020-06-29 15:24:45 +02:00
Łukasz Magiera aeab3a709a Merge pull request #2158 from jackoelv/patch-1
Update mining.md
2020-06-29 15:19:58 +02:00
Łukasz Magiera 7058f4eb63 Merge pull request #2153 from filecoin-project/feat/state-changes-api
Feat/state changes api
2020-06-29 15:19:18 +02:00
waynewyang 8d51a20143 fix: mining logic 2020-06-28 18:20:56 +08:00
jackoelv a4f6269724 Update mining.md
lotus-storage-miner state power should be changed to lotus state power
2020-06-27 23:16:24 +08:00
Lucas MolasandJakub Sztandera fbfe57cd63 doc: block validations (#1919)
Co-authored-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-26 20:13:14 -03:00
Łukasz Magiera 0118a78967 Merge pull request #2050 from filecoin-project/asr/api-bitfield
Return sector numbers, not bitfields from API
2020-06-27 00:51:52 +02:00
Dirk McCormick 659c723ea3 fix: embed hcEvents into events as pointer so as not to copy lock 2020-06-26 15:42:44 -04:00
Dirk McCormick bbb9a9cd1a refactor: lint fixes 2020-06-26 15:36:48 -04:00
laser 5052a87a82 bugfix: accessors should be read and writers should be admin 2020-06-26 12:33:39 -07:00
laser b9180a99d4 toggle consideration of offline storage/retrieval deal proposals 2020-06-26 12:27:41 -07:00
Dirk McCormick db1773d708 docs: add predicate docs 2020-06-26 14:59:23 -04:00
Dirk McCormick a1b009328d refactor: simplify diff 2020-06-26 14:43:46 -04:00
Dirk McCormick 393a9ca4f2 test: predicates test 2020-06-26 14:41:19 -04:00
laser e910a045d0 big rename to allow for later introducing the "consider offline" config 2020-06-26 10:50:54 -07:00
laser 5d9a775699 replace enable/disable commands with selection commands 2020-06-26 10:33:06 -07:00
Łukasz Magiera 8233143578 Merge pull request #2144 from Alexey-N-Chernyshov/patch-1
Fix to addresses in paychmgr channel creation
2020-06-26 19:14:30 +02:00
Łukasz Magiera 950cb8bc03 Merge pull request #1970 from RobQuistNL/patch-3
Update Ubuntu installation documentation + bump required go version to 1.14
2020-06-26 19:12:08 +02:00
Alexey eafb04004e Fix to addresses in paychmgr channel creation 2020-06-26 09:06:01 +03:00
Rob Quist 3d3e384d5c Merge pull request #2 from RobQuistNL/patch-2
Update makefile
2020-06-26 02:10:53 +02:00
Rob Quist 38533631bf Bump to Go v. 1.14 as requirement 2020-06-26 02:09:39 +02:00
frrist 6fe39ef065 fixup! feat: define miner sector schema 2020-06-25 17:03:28 -07:00
frrist 47c3e14d4b fixup! feat: define miner sector schema 2020-06-25 17:00:22 -07:00
frrist d8b647cc3a fixup! feat: define miner sector schema 2020-06-25 16:07:43 -07:00
Dirk McCormick abad4a3941 refactor: modify predicates API 2020-06-25 17:43:37 -04:00
frrist 2c0a4914cf feat: define miner sector schema
- define a miner sector schema to store miner sector details at each tipset the miner experiences a
state change. This solution stores redundant data since a miner state change (head cid changes)
does not necessarily indicate its sectors changes.

- makes progress towards sentinel/issues/10
2020-06-25 13:16:50 -07:00
Aayush Rajasekaran e54b49b442 Bump API version 2020-06-25 13:49:15 -04:00
Aayush Rajasekaran 50aa1e6baa Update bitfield 2020-06-25 13:49:15 -04:00
Aayush Rajasekaran e3c897fb68 Change StateReadState to take an address, not an actor 2020-06-25 13:49:15 -04:00
Dirk McCormick 728afc0587 refactor: remove state API example 2020-06-25 12:46:43 -04:00
Dirk McCormick 95a9dc9db0 refactor: use struct instead of array for state change 2020-06-25 12:43:06 -04:00
Dirk McCormick b62fef7541 feat: include previous TS in StateChangedHandler 2020-06-25 12:43:06 -04:00
Dirk McCormick dd490220d7 refactor: Extract message-specific code from calledEvents
This allows us to create a general purpose head change events manager that can be used for call events and also for state change events.
2020-06-25 12:43:06 -04:00
hannahhoward 7f932b96ae WIP 2020-06-25 12:41:50 -04:00
Łukasz Magiera 4af9a20903 Merge pull request #2132 from filecoin-project/feat/deal-sechd-prio
sealing: Give priority to sectors with deals
2020-06-25 18:27:35 +02:00
Łukasz Magiera f9cb549fbe Merge pull request #2137 from filecoin-project/feat/compact-trace
Make gas traces smaller, strip callers in import-bench
2020-06-25 18:25:38 +02:00
Łukasz Magiera 7e342e60d1 sealing: Give priority to sectors with deals 2020-06-25 18:13:45 +02:00
Jakub Sztandera f98063d604 In this case I want it to be not really safe
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-25 16:58:55 +02:00
Jakub Sztandera 10c4fae8c0 Make gas traces smaller, strip callers in import-bench
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-25 16:46:50 +02:00
Łukasz Magiera cae24a226b Merge pull request #2119 from laser/feat/1920-toggle-retrieval
allow retrieval miner to enable/disable consideration of retrieval deal proposals
2020-06-24 21:19:19 +02:00
Łukasz Magiera 0162322833 Merge pull request #2126 from filecoin-project/fix/events-race
Fix two races in events
2020-06-24 21:09:14 +02:00
Łukasz Magiera 06dfe3c5ae Merge pull request #2131 from filecoin-project/fix/chainwatch-tipset-api-access
fix: use tipset corresponding to stateroot
2020-06-24 20:04:18 +02:00
frrist a98c4038f4 fix: use tipset corresponding to stateroot
- Use te tipsetkey corresponding to the stateroot when fetching actor
data from the lotus api.
2020-06-24 11:01:25 -07:00
laser 4c760ec1b1 lint: update comments to match type declarations 2020-06-24 08:08:10 -07:00
laser 176d0bb7c0 add "lotus-storage-miner retrieval-deals" subcommands
- enable retrieval
- disable retrieval
2020-06-24 08:08:10 -07:00
laser bc90b857c9 change "lotus-storage-miner deals" to "lotus-storage-miner storage-deals" 2020-06-24 08:08:10 -07:00
laser ef0abf2b98 disable/enable retrieval deal consideration via config 2020-06-24 08:07:12 -07:00
Jakub Sztandera 008a2969b2 Fix two races in events
Also race fix: depends on https://github.com/ipfs/go-blockservice/pull/65
Resolves #2092, #2099, #2108, #1930, #2110

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-24 17:05:24 +02:00
Łukasz Magiera 7d9f9ba756 Merge pull request #2125 from filecoin-project/fix/cw-state-heights-index
chainwatch: state_heights_uindex is not unique
2020-06-24 14:55:42 +02:00
Łukasz Magiera 358b36bc66 chainwatch: state_heights_uindex is not unique 2020-06-24 14:34:53 +02:00
Łukasz Magiera f1e686f706 Merge pull request #2107 from chunqizhi/zc
An incorrect sector was detected, but also run windowPoSt
2020-06-24 12:40:16 +02:00
Łukasz Magiera 0b1fa54a4d wdpost: Remove commented code 2020-06-24 12:38:46 +02:00
chunqizhi 49281ef599 Merge pull request #4 from filecoin-project/master
merge
2020-06-24 13:55:29 +08:00
24c7f47566 Modify print faulty sectors in provingFaultsCmd 2020-06-24 10:14:20 +08:00
Łukasz Magiera 4037d707c9 Merge pull request #2120 from filecoin-project/feat/change-addrs-cmd
add command to change registered multiaddrs for miner
2020-06-24 01:02:35 +02:00
Łukasz Magiera 001d4ab002 Appease the linter 2020-06-24 01:00:32 +02:00
Łukasz Magiera f115603093 Merge pull request #2121 from filecoin-project/fix/1917
Update sector-storage to fix #2080 and #1917
2020-06-24 00:56:59 +02:00
Łukasz Magiera d7bb284e57 miner: Move set-addrs command to a new 'actor' namespace 2020-06-24 00:54:28 +02:00
Łukasz Magiera 11c53c26ff Update sector-storage to fix #2080 and #1917 2020-06-24 00:47:47 +02:00
Łukasz Magiera d28bbf4674 Merge pull request #2095 from filecoin-project/feat/sector-remove
Update specs-storage; Support for removing sectors
2020-06-24 00:32:33 +02:00
Łukasz Magiera a7d662a7d8 Update to actually working sector-storage 2020-06-24 00:23:39 +02:00
Łukasz Magiera 6f8c464393 Merge remote-tracking branch 'origin/master' into feat/sector-remove 2020-06-23 23:54:27 +02:00
Raúl Kripalani c8104a03e6 some initial godocs. (#2118) 2020-06-23 18:51:25 -03:00
Łukasz Magiera 69559bcf4f Use fsm, sector-storage master 2020-06-23 23:32:12 +02:00
whyrusleeping d524821c86 add command to change registered multiaddrs for miner 2020-06-23 14:25:45 -07:00
Jakub Sztandera e864244226 Merge pull request #2117 from filecoin-project/fix/drand-config-di
improve DrandConfig dependency injection
2020-06-23 23:14:58 +02:00
Yusef Napora 5074cf8beb import DrandConfig from dtypes 2020-06-23 16:23:06 -04:00
Yusef Napora b448de422e improve DrandConfig dependency injection 2020-06-23 16:01:10 -04:00
Łukasz Magiera 99d3571772 Merge pull request #2115 from filecoin-project/feat/drand-config-override
allow overriding drand config
2020-06-23 21:59:05 +02:00
Łukasz Magiera 0354275b39 Merge pull request #2112 from laser/bugs/2111-hanging-client-retrieve
return error if retrieval deal rejected
2020-06-23 21:56:02 +02:00
laser 309fbc15b2 import aliasing, for legibility 2020-06-23 12:22:33 -07:00
Łukasz Magiera 28e3c863bf Merge pull request #2114 from filecoin-project/fix/state-mkt-participants
state: Get correct locked table in StateMarketParticipants
2020-06-23 21:21:43 +02:00
laser 06162290af explicitly handle each deal status, as per PR feedback 2020-06-23 12:14:41 -07:00
Yusef Napora 628872d0e4 forgot my go fmt hook 2020-06-23 15:10:27 -04:00
Yusef Napora 960523f45f fix drand test 2020-06-23 15:09:28 -04:00
Łukasz Magiera fb04b17fad state: Get correct locked table in StateMarketParticipants 2020-06-23 20:55:59 +02:00
laser 8adc831a31 return error if retrieval deal rejected 2020-06-23 11:08:04 -07:00
Yusef Napora 566a99240d allow overriding drand config 2020-06-23 13:33:18 -04:00
Łukasz Magiera 7b2241f051 Merge pull request #2102 from filecoin-project/feat/parallel-block-val
run block validation for tipsets in parallel
2020-06-23 17:59:14 +02:00
55ed45f108 Get the good sectors to run windowPost 2020-06-23 20:46:41 +08:00
Łukasz Magiera f8e7901b89 Address review 2020-06-23 14:44:34 +02:00
Łukasz Magiera 9e70e95242 sync: Correctly pass blocks to ValidateBlock 2020-06-23 14:10:47 +02:00
Łukasz Magiera 68d38eff33 Merge pull request #2103 from filecoin-project/deps/libp2p-0.10.0
update to latest libp2p release
2020-06-23 12:44:42 +02:00
Łukasz Magiera abd400801c mod tidy 2020-06-23 11:46:20 +02:00
Łukasz Magiera d24a750ba4 Merge pull request #2106 from filecoin-project/feat/streaming-bench-results
stream bench import results to disk
2020-06-23 11:42:18 +02:00
whyrusleeping 9903eba7fb stream bench import results to disk 2020-06-22 20:08:19 -07:00
whyrusleeping 3752311f44 update to latest libp2p release 2020-06-22 16:25:41 -07:00
whyrusleeping b71f771acb run block validation for tipsets in parallel 2020-06-22 16:09:05 -07:00
Łukasz Magiera 9f3145aec0 Merge pull request #2093 from filecoin-project/asr/clarify
Clarify expected block win when below minimum power threshold
2020-06-22 22:32:08 +02:00
Łukasz Magiera 8638076ecb Merge pull request #1894 from filecoin-project/feat/chainwatch-usage
Add chainwatch systemd svc config
2020-06-22 22:25:48 +02:00
Mike Greenberg 8649baccf7 Remove dev values from chainwatch.service 2020-06-22 16:17:07 -04:00
Aayush Rajasekaran c33d9e9668 Merge pull request #2094 from filecoin-project/schomatis/doc/security-policy
doc: report a vulnerability
2020-06-22 15:39:52 -04:00
Łukasz Magiera 03d70e1513 Merge pull request #2097 from filecoin-project/feat/disable-builtin-assets
provide an option to disable loading of built-in assets.
2020-06-22 21:35:58 +02:00
Raúl Kripalani d20255b1b4 provide an option to disable loading of built-in assets. 2020-06-22 19:42:04 +01:00
Łukasz Magiera cd91e42a56 ci: lint-changes based on master 2020-06-22 19:39:08 +02:00
Łukasz Magiera e2435be0b9 build: Bump API version 2020-06-22 19:36:26 +02:00
Łukasz Magiera 5adc188466 miner: Command to remove sectors 2020-06-22 19:35:14 +02:00
Łukasz Magiera 101ba0b796 Update deps to support removing sectors 2020-06-22 19:03:35 +02:00
Lucas Molas 8cd2012d27 doc: report a vulnerability 2020-06-22 12:45:24 -03:00
Aayush Rajasekaran 4959596527 Clarify expected block win when below minimum power threshold 2020-06-22 11:42:26 -04:00
956c397c3c Add provingFaultsCmd for getting sectors information for the currently known faults 2020-06-22 16:00:29 +08:00
chunqizhi 1249ede2b7 Merge pull request #3 from filecoin-project/master
merge
2020-06-22 15:47:43 +08:00
Łukasz Magiera 596ed330dd Merge pull request #2069 from laser/feat/1920-blocklist-cids
allow storage miners to manage a blocklist of piece CIDs
2020-06-19 21:19:15 +02:00
Łukasz Magiera b4c1594d99 Merge pull request #2073 from mitchwagner/patch-1
Remove redundant glossary item
2020-06-19 21:05:29 +02:00
Łukasz Magiera 98cb08d853 Merge pull request #2077 from laser/bugs/1993-problems-with-sizestr
bump from 3 to 4 digits in format-string used by types.SizeStr
2020-06-19 21:04:30 +02:00
Nathaniel Jensen 6b86dcde4a doc: Fix architecture broken link 2020-06-19 13:33:19 -03:00
laser fbeaab466a obey the linter 2020-06-19 09:20:20 -07:00
laser 5e77b5da9f bump from 3 to 4 digits in format-string
Fixes #1993
2020-06-19 08:51:06 -07:00
Mitch Wagner 7c4225d01c Remove redundant glossary item
The excised entry previously rendered twice in the glossary under two different keys. This commit removes one of those KV pairs to avoid that.
2020-06-18 21:31:26 -04:00
Łukasz Magiera ffa7be86fe Merge pull request #2070 from filecoin-project/feat/reset-genesis
New Genesis
2020-06-19 01:29:01 +02:00
Łukasz Magiera c41c210ced New Genesis 2020-06-19 01:24:04 +02:00
laser de7d6c255c blacklist -> blocklist 2020-06-18 15:51:01 -07:00
laser 99060fbb64 eliminate errant debug line 2020-06-18 14:05:59 -07:00
laser 0c8d648998 specify which CID is being blacklisted (it's the piece) 2020-06-18 14:02:22 -07:00
laser aa18d1985e reject storage deal proposals containing blacklisted piece CIDs 2020-06-18 13:32:20 -07:00
laser b0edf924b4 add commands for manipulating storage deal CID blacklist 2020-06-18 13:15:18 -07:00
laser 997a46a90f wombat 2020-06-18 10:32:32 -07:00
Łukasz Magiera b99b8f55f6 Merge pull request #2065 from filecoin-project/docs/docgen-fixes
docgen improvements
2020-06-18 16:20:19 +02:00
Łukasz Magiera c0a50a2143 api: Add a bunch of donstrings 2020-06-18 15:44:47 +02:00
Łukasz Magiera 382734b057 docgen: Generate simple index 2020-06-18 14:56:00 +02:00
Łukasz Magiera 90fbbea372 docgen: Make larger inputs/outputs more readable 2020-06-18 14:37:41 +02:00
Łukasz Magiera 55d9ad0b55 Fix docgen 2020-06-18 14:30:00 +02:00
Łukasz Magiera e5e5d0d9e4 Merge pull request #2064 from filecoin-project/deps/sectorstorage-d9de9b7cb4
Update sector-storage with 32G checkFiles fix
2020-06-18 12:44:29 +02:00
Łukasz Magiera 324b659d33 Update sector-storage with 32G checkFiles fix 2020-06-18 09:34:28 +02:00
Aayush Rajasekaran edcf899be1 Merge pull request #2060 from filecoin-project/jimpick/fix-lotus-bench-link
Fix bad link in hardware mining docs
2020-06-17 21:19:58 -04:00
Jim Pick 2bf781d591 Fix bad link in hardware mining docs
This fixes a bad link.

There's also a link to the Github issue thread for results that still works, but
is a bit stale (for proofs before v20). I didn't attempt to fix that as there
doesn't appear to be a thread for v27 proofs.
2020-06-17 18:04:46 -07:00
Łukasz Magiera cc179c5270 Merge pull request #2047 from filecoin-project/feat/parallel-sealing-bench
allow sealing bench to run parallel seals
2020-06-18 01:28:56 +02:00
Łukasz Magiera b417725e3e Merge pull request #2059 from filecoin-project/feat/testnet-peers
Bootstrap peers
2020-06-18 01:15:49 +02:00
Travis Person c02d8225a8 Bootstrap peers 2020-06-17 23:01:26 +00:00
Łukasz Magiera 659f570cfc Merge pull request #2058 from filecoin-project/jimpick/spelling
Spelling: s/winnnig/winning/
2020-06-17 22:09:17 +02:00
Jim Pick c7e470bd5e Spelling: s/winnnig/winning/
It was bugging me. :-)
2020-06-17 12:49:23 -07:00
Łukasz Magiera fe4efa0e0e Merge pull request #1842 from filecoin-project/next
Next network staging
2020-06-17 20:58:21 +02:00
Łukasz Magiera 02234d00b7 Merge remote-tracking branch 'origin/master' into next 2020-06-17 20:50:42 +02:00
Łukasz Magiera bef5bfcbb6 Merge pull request #2057 from filecoin-project/deps/fsm-fixes
Update storage FSM with a bunch of fixes
2020-06-17 20:48:50 +02:00
Łukasz Magiera 290512ee68 Update storage FSM with a bunch of fixes 2020-06-17 20:42:08 +02:00
Łukasz Magiera d129d6eada Merge pull request #2056 from filecoin-project/upd/specs-ac-chargegas
Update to specs actors with ChargeGas interface
2020-06-17 20:18:10 +02:00
Jakub Sztandera 5c5a3f2264 go mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-17 20:04:28 +02:00
Łukasz Magiera d4644a28c1 Merge pull request #2046 from laser/feat/2027-manipulate-ask
add ask-manipulating (and printing) deal subcommands
2020-06-17 20:03:51 +02:00
Jeromy d66c70d1e6 add configurable paralellism for sub portions of the sealing process 2020-06-17 11:02:48 -07:00
Jakub Sztandera b91e7a9860 Update to specs actors with ChargeGas interface
Based on `lotus-0.6.1-chargegas` in specs-actors.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-17 20:00:30 +02:00
laser fcdfda8ba2 use chain head instead of mining base 2020-06-17 10:56:42 -07:00
Łukasz Magiera 2800fd919b Merge pull request #2053 from filecoin-project/feat/worker-reconnect
seal-worker: Auto-restart if miner dies
2020-06-17 19:48:29 +02:00
Łukasz Magiera 512bbb99ca Merge pull request #2054 from filecoin-project/fix/wdpost-panic
wdpost: Don't return nil from checkSectors
2020-06-17 19:48:09 +02:00
laser ed5b74b1ae tidy up 2020-06-17 10:42:09 -07:00
laser 791dff5a87 don't go into negative remaining time 2020-06-17 10:30:16 -07:00
laser 402cd8be19 get-ask output should use durations, too 2020-06-17 10:20:42 -07:00
Łukasz Magiera bdcb1e3592 Merge pull request #2029 from filecoin-project/feat/gas-delta-output
add some smartness to bench analyze gas output
2020-06-17 18:44:10 +02:00
Łukasz Magiera e60dd219dc wdpost: Don't return nil from checkSectors 2020-06-17 18:21:40 +02:00
laser 9d7be5dcbf modify set-ask to work with human-readable clock time/duration 2020-06-17 09:20:43 -07:00
Łukasz Magiera 70e964d9f9 Merge pull request #2039 from filecoin-project/feat/testnet-params
Set build params for testnet
2020-06-17 18:01:31 +02:00
laser 673a643184 use xerrors, as per feedback in PR 2020-06-17 08:57:18 -07:00
Łukasz Magiera 2761872ea7 seal-worker: Auto-restart when API connection is lost 2020-06-17 17:47:18 +02:00
Łukasz Magiera fc7195f19a seal-worker: Wait for miner API on start 2020-06-17 17:47:18 +02:00
Łukasz Magiera 8b8bb5e833 rpc: add Closing method 2020-06-17 17:47:18 +02:00
laser 5d4f1bb3f1 work with bit-padded byte quantities, as per PR feedback 2020-06-17 08:42:30 -07:00
laser 139c3297ab change "duration" help text 2020-06-17 08:34:50 -07:00
RobQuistNL 20503de3ba Merge branch 'next' of github.com:filecoin-project/lotus into patch-3 2020-06-17 09:08:16 +02:00
laser 2676892886 go mod tidy 2020-06-16 17:47:04 -07:00
laser 5acf5bf102 upper and lower bounds checking 2020-06-16 17:45:11 -07:00
Jeromy ec693008d7 allow sealing bench to run parallel seals 2020-06-16 17:39:51 -07:00
laser 4ba1846c11 format the piece sizes 2020-06-16 17:32:45 -07:00
laser 5eceed81e1 add "get-ask" command 2020-06-16 17:23:03 -07:00
Whyrusleeping 8b725b4b8c Merge pull request #2045 from filecoin-project/feat/seed-rm-unsealed
seed: Cleanup unsealed sectors
2020-06-16 16:58:44 -07:00
laser 6253c39100 replace "set-price" with "set-ask"
Fixes #2027
2020-06-16 16:13:21 -07:00
Łukasz Magiera b845013836 Set build params for testnet 2020-06-17 00:37:40 +02:00
Łukasz Magiera 9690bc9c63 seed: Cleanup unsealed sectors 2020-06-17 00:35:51 +02:00
Whyrusleeping c6a8fe16c6 Merge pull request #2042 from jsign/jsign/considerstatus
Consider QueryOffer Error & Status
2020-06-16 13:58:37 -07:00
Ignacio Hagopian ec9a334f93 append message on unavailable and error status
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-06-16 17:52:47 -03:00
Ignacio Hagopian 35d9de6b6e consider response status and err
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-06-16 17:32:03 -03:00
Aayush Rajasekaran 4d0df5d599 Merge pull request #2040 from jsign/jsign/minerretrieval
Miner QueryOffer API & non local-discovery retrieval CLI support
2020-06-16 16:00:40 -04:00
Ignacio Hagopian 7fd082e941 resolve peerid
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-06-16 12:22:44 -03:00
Ignacio Hagopian 9d17e0be9d ClientMinerQueryOfer API & CLI support
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-06-16 11:14:49 -03:00
Rob Quist 030472d61c Remove Rust installation and remove Go installation guide 2020-06-16 15:30:41 +02:00
Łukasz Magiera 6bff52483b Merge pull request #1973 from filecoin-project/feat/drand-upd
Update to new drand
2020-06-16 15:30:40 +02:00
Łukasz Magiera 32d8ca2f21 Merge pull request #2037 from filecoin-project/feat/testnet-reset-updates
Pre-testnet reset updates
2020-06-16 15:29:33 +02:00
Jakub Sztandera fd6c8769dd Update to new drand
WIP

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-16 14:46:30 +02:00
Łukasz Magiera bac6a47c67 specs-actors v0.6.1 2020-06-16 12:30:54 +02:00
Łukasz Magiera 18dd1c277b Update ffi 2020-06-16 12:28:28 +02:00
Łukasz Magiera ab4c11c096 Merge remote-tracking branch 'origin/master' into next 2020-06-16 12:04:29 +02:00
Łukasz Magiera 6bbea74a7d Merge pull request #1961 from RobQuistNL/patch-2
Update documentation about Lotus Seal Worker
2020-06-16 11:58:38 +02:00
chunqizhi 4f1efbe38f Merge pull request #2 from filecoin-project/master
merge
2020-06-16 17:57:52 +08:00
Łukasz Magiera eeb5053919 Merge pull request #2031 from filecoin-project/feat/stats-power-lookup
stats: increase miner power lookup perf
2020-06-16 11:53:09 +02:00
Aayush Rajasekaran d8a517f992 Syncer::InformNewHead can quickly fail if height is impossibly large 2020-06-16 00:51:00 -04:00
Aayush Rajasekaran aa513d920e Merge pull request #1705 from hayeah/cache-tipset-validation-progress
Cache tipset validation progress
2020-06-16 00:14:11 -04:00
Whyrusleeping 3327ed50a8 Merge pull request #2033 from filecoin-project/asr/advance-block
Make advance-block work
2020-06-15 19:49:19 -07:00
Travis Person f31fcdae08 stats: increase miner power lookup perf 2020-06-16 02:48:27 +00:00
Whyrusleeping 66b15b7076 Merge pull request #2032 from filecoin-project/deps/go-fil-markets-0.3.0
Update to fil-markets 0.3.0
2020-06-15 19:46:24 -07:00
chunqizhi c5a9f180af Merge pull request #1 from filecoin-project/master
merge
2020-06-16 09:47:20 +08:00
Aayush Rajasekaran a9abf3ceb2 extract the fake Wpost used for testing 2020-06-15 21:02:53 -04:00
Aayush Rajasekaran ed3b2716af Don't verify ElectionPostVRF when insecure validation enabled 2020-06-15 21:02:25 -04:00
Aayush Rajasekaran 69948cd09c WalletSign should resolve ID addresses 2020-06-15 21:00:22 -04:00
Jeromy f8c4b64782 improve chain import analyze output, add some rough virtual gas charges 2020-06-15 16:05:29 -07:00
hannahhoward a422647819 fix(lint): fix lint error
fix lint error and update to tagged package
2020-06-15 15:53:39 -07:00
hannahhoward 9262661135 chore(deps): update to fil-markets 0.3.0
Updates to latest fil markets with resumability and other fixes
2020-06-15 15:43:47 -07:00
Jeromy 01c4726fd5 add some smartness to bench analyze gas output 2020-06-15 13:02:57 -07:00
Łukasz Magiera 0230362d33 Merge pull request #2025 from filecoin-project/deps/specs-actors-v0.6
specs-actors v0.6
2020-06-15 21:30:37 +02:00
Łukasz Magiera f8669d4e95 Update chain-val and sector-storage 2020-06-15 21:21:40 +02:00
Łukasz Magiera 12298f8953 Merge pull request #2026 from filecoin-project/feat/gas-extra
Use extra field in gastrace
2020-06-15 19:57:30 +02:00
Łukasz Magiera daca8651f4 Fix bench 2020-06-15 19:53:21 +02:00
Jakub Sztandera 8039701f9e Use extra field in gastrace
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-15 19:52:04 +02:00
Łukasz Magiera 01f0bb3124 Merge pull request #1994 from laser/feat/1920-toggle-accepting-storage-deals
allow miner to disable/enable consideration of received storage deal proposals
2020-06-15 19:05:39 +02:00
Łukasz Magiera 58a79773ee fix debug build 2020-06-15 18:34:36 +02:00
Łukasz Magiera c832c0bf3f mod tidy 2020-06-15 18:31:59 +02:00
Łukasz Magiera 907364ce67 Update deps, fix more tests 2020-06-15 18:30:49 +02:00
Jakub Sztandera 18cf7b046e Merge pull request #2024 from filecoin-project/feat/virtual-gas
Add virtual gas
2020-06-15 18:27:24 +02:00
Whyrusleeping 87e5c38e32 Merge pull request #1952 from laser/feat/805-warn-lotus-balance
display a little inline warning if balance is zero
2020-06-15 09:19:00 -07:00
Jakub Sztandera c98972ab23 Merge pull request #1555 from filecoin-project/feat/hashverify
Use HashVerify
2020-06-15 17:47:42 +02:00
Jakub Sztandera 2a78ebabd9 Use HashVerify
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-15 17:39:16 +02:00
Jakub Sztandera a23a87a17f Add virtual gas
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-15 16:18:05 +02:00
Łukasz Magiera 49b1acba43 Merge pull request #1992 from filecoin-project/fix/correct-recov-deadlines
wdpost: Submit recoveries for sectors within a deadline
2020-06-15 15:09:22 +02:00
Łukasz Magiera 464f6a6b08 Update specs-actors to v0.6 2020-06-15 14:49:18 +02:00
Łukasz Magiera 7e7fac05e0 Merge pull request #1989 from filecoin-project/feat/merge-master
Merge in master into the next
2020-06-15 14:45:00 +02:00
Łukasz Magiera 7296ce7287 Merge remote-tracking branch 'origin/next' into feat/merge-master 2020-06-15 14:40:29 +02:00
Łukasz Magiera 70c8f7b1ee Merge remote-tracking branch 'origin/master' into feat/merge-master 2020-06-15 14:38:38 +02:00
Łukasz Magiera 50b04d6b2b Merge pull request #2019 from chunqizhi/zcq
Add usage information for provingInfoCmd
2020-06-15 12:19:38 +02:00
chunqizhi 12056c8904 go fmt 2020-06-15 17:43:42 +08:00
Łukasz Magiera fdbda6f608 Merge pull request #2017 from jsign/jsign/nits
nit: unchecked errors
2020-06-15 11:31:57 +02:00
Howard Yeh c822816f8e Cache tipset validation progress 2020-06-14 18:41:17 +08:00
chunqizhi 6d36c030e0 Add usage information for provingInfoCmd 2020-06-13 18:05:30 +08:00
Ignacio Hagopian 82c6be14f4 unchecked errs
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-06-12 22:34:00 -03:00
Łukasz Magiera fb4ad043dd Merge pull request #2011 from filecoin-project/feat/more-callers
Expose more callers, ellipsis unimportant ones
2020-06-13 01:55:26 +02:00
Jakub Sztandera 91ea039077 Change ellipsis, more accurate timing
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-12 20:46:04 +02:00
Łukasz Magiera 8e025db656 Merge pull request #2014 from filecoin-project/fix/chain-reorgs-race
fix a potential race with chain reorgs notifees.
2020-06-12 20:35:16 +02:00
Raúl Kripalani 4e9293ba04 fix a potential race with chain reorgs notifees. 2020-06-12 19:18:23 +01:00
Łukasz Magiera 19afb57ac7 Merge pull request #1953 from jimpick/feat/libp2p-announce-addresses
Make libp2p swarm Announce / NoAnnounce addresses configurable
2020-06-12 19:28:13 +02:00
Jakub Sztandera a032bbe087 Merge pull request #2012 from filecoin-project/schomatis/feat/doc/README/branches
doc: active development branches
2020-06-12 19:27:51 +02:00
Lucas Molas a2943a6b7f doc: active development branches 2020-06-12 13:59:03 -03:00
Jakub Sztandera 8ad2b3c3d9 Removed commented out code
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-12 18:58:55 +02:00
Jakub Sztandera cd69e57a33 Expose more callers, ellipsis unimportant ones
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-12 18:49:29 +02:00
Rob Quist ca8a00f8a1 Update hardware-mining.md 2020-06-12 18:19:04 +02:00
Rob Quist 9077dea0cd Update install-lotus-ubuntu.md 2020-06-12 17:40:47 +02:00
Rob Quist d670257402 Add back installation of Go and Rust 2020-06-12 17:30:43 +02:00
Łukasz Magiera 3460fb0d47 Merge pull request #2005 from filecoin-project/feat/comp-state-template
compute-state html: Convert to templates
2020-06-12 16:47:05 +02:00
Jakub Sztandera 82eb7786d4 Cleanup lint warnings
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-12 16:25:55 +02:00
Jakub Sztandera 00385acc1d Remove htmlSafeAttr
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-12 15:26:58 +02:00
Jakub Sztandera 813940762c Use html/template
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-12 14:46:50 +02:00
Łukasz Magiera bd25d6db06 compute-state html: Convert to templates 2020-06-12 13:30:35 +02:00
Łukasz Magiera 9fbc7aafb4 Merge pull request #2001 from filecoin-project/asr/fetch-params-cli
Improve UX of fetch-params
2020-06-12 10:04:26 +02:00
Łukasz Magiera 227819dc1e docs: Update local-dev-net 2020-06-12 10:03:31 +02:00
Aayush Rajasekaran 2c401f9041 Improve UX of fetch-params 2020-06-12 01:17:10 -04:00
Jeromy c7e3a5cff4 fix null incrementing 2020-06-12 02:28:17 +02:00
Łukasz Magiera 5469df7dd1 Merge pull request #1991 from filecoin-project/feat/split-gas
Add gas tracing
2020-06-11 22:33:22 +02:00
Jakub Sztandera 071ddf6563 Add aggregate number, add number of bytes for storage calls
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-11 22:25:24 +02:00
laser 36b327b57b various symbol renames 2020-06-11 13:18:18 -07:00
laser 7587e6c08b get and set storage deal acceptance through CLI 2020-06-11 12:59:50 -07:00
Jakub Sztandera c90d35869b Add gas tracing
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-11 21:59:39 +02:00
laser 67110ce739 stub enable/disable storage deal commands 2020-06-11 12:20:11 -07:00
laser 5421d0d1c5 better field and struct names + set default appropriately
Storage miners, by default, should be configured to accept storage deals.
2020-06-11 12:15:28 -07:00
laser c458b4712a better rejection messages 2020-06-11 12:06:38 -07:00
Łukasz Magiera 0200e3def5 wdpost: Submit recoveries for sectors within a deadline 2020-06-11 20:38:29 +02:00
Jakub Sztandera 6acc9a62f8 Split gas internally into compute gas and storage gas
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-11 20:37:14 +02:00
laser d6b2519843 config-driven IsAcceptingStorageDeals flag
Makes incremental progress towards #1920.
2020-06-11 11:29:59 -07:00
Łukasz Magiera c8046f4597 Merge branch 'next' of github.com:filecoin-project/go-lotus into next 2020-06-11 18:24:51 +02:00
Łukasz Magiera 1c583ab487 Merge pull request #1966 from laser/feat/reload-config
expose config-setting through Repo interface
2020-06-11 18:15:06 +02:00
Łukasz Magiera 936f84dfa6 Merge pull request #1988 from waynewyang/VerifyConsensusFault
fix:the condition of time-offset mining fault
2020-06-11 18:11:48 +02:00
Jakub Sztandera 491f080a37 Merge remote-tracking branch 'origin/master' into feat/merge-master
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-11 17:59:27 +02:00
waynewyang 8354bd91db fix:the condition of time-offset mining fault 2020-06-11 23:52:44 +08:00
laser fb1d5197fa pass SetConfig a mutator func, as per PR feedback
- fsLockedRepo.config gets a mutex
- add missing checkToken call to lockedMemRepo#GetStorage and lockedMemRepo#SetStorage
- LockedRepo#SetConfig accepts a mutating function as per @magik
2020-06-11 08:49:19 -07:00
laser cf321f7667 add support for replacing config after node starts
- TODO: does a "locked repo" need fine-grained (i.e. field-level) locking?
2020-06-11 08:49:19 -07:00
laser 2d6b2e3811 fix a spelling error 2020-06-11 08:49:19 -07:00
laser d4dbfdbe91 rename Config to GetConfig 2020-06-11 08:49:19 -07:00
Łukasz Magiera c9a845d3aa Merge remote-tracking branch 'origin/master' into next 2020-06-11 16:29:26 +02:00
Łukasz Magiera 1e41ca125d Merge pull request #1975 from filecoin-project/feat/ex-trace
Refactor ExecutionResult to ExecutionTrace
2020-06-11 16:24:17 +02:00
Jakub Sztandera 500ddd6585 go mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-11 16:07:04 +02:00
Łukasz Magiera 9457df9ddd Merge pull request #1985 from filecoin-project/fix/chain-idx-nulls
chainstore index: Drop wrong check
2020-06-11 16:01:05 +02:00
Jakub Sztandera c3f23ddce8 Refactor ExecutionResult to ExecutionTrace
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-11 15:53:47 +02:00
Łukasz Magiera 8b308972a4 chainstore index: Drop wrong check 2020-06-11 15:43:24 +02:00
Łukasz Magiera 4f632c893c Merge pull request #1983 from waynewyang/ConsensusFault
Add flag for cli slash-consensus
2020-06-11 14:27:33 +02:00
waynewyang 41066bd45e Add flag for cli slash-consensus 2020-06-11 19:20:11 +08:00
Jeromy ac1048fcd7 test a few more cases 2020-06-11 12:31:32 +02:00
Jeromy 14ea847ef6 fix chain index seeking through long ranges of null rounds 2020-06-11 12:31:32 +02:00
Anton Evangelatov 2ce3a5f887 docs: add a note about open files limit 2020-06-11 12:31:32 +02:00
waynewyang 27858506ff error check 2020-06-11 12:31:32 +02:00
Aayush Rajasekaran 6ba5c5d0e1 Doc fix: use correct file name 2020-06-11 12:31:32 +02:00
Lucas MolasandAayush Rajasekaran dc112a5a00 Lotus architecture notes (#1768)
Co-authored-by: Aayush Rajasekaran <arajasek94@gmail.com>
2020-06-11 12:31:32 +02:00
laser fe60ffb6ff display quantities of bytes in human-readable format
- client commP
- client local
- client find
- client query-ask
- client list-deals
- state sector-size
2020-06-11 12:31:32 +02:00
Jeromy 512270593b clean up some of the more spammy logs 2020-06-11 12:31:29 +02:00
Mike Greenberg 2cd6347a13 Express block validation, cpu/mem usage via OpenCensus 2020-06-11 12:31:04 +02:00
Łukasz Magiera b1f66b181c Merge pull request #1980 from yaohcn/fix/bench-prove
bench prove need miner-addr flag
2020-06-11 12:10:49 +02:00
Łukasz Magiera d5dae844bd Merge pull request #1978 from filecoin-project/fix/chain-index-seek-nulls
Fix/chain index seek nulls
2020-06-11 12:08:53 +02:00
yaohcn e0a8e993bc bench prove nedd miner-addr flag 2020-06-11 16:35:46 +08:00
Jeromy 1aff04faab test a few more cases 2020-06-10 22:17:29 -07:00
Jeromy 295c0861c4 fix chain index seeking through long ranges of null rounds 2020-06-10 22:15:46 -07:00
Whyrusleeping ba3f73acb8 Merge pull request #1974 from nonsense/docs-open-files-limit
docs: add a note about open files limit
2020-06-10 17:37:25 -07:00
Anton Evangelatov 68959582b9 docs: add a note about open files limit 2020-06-11 00:15:46 +02:00
Łukasz Magiera 1f9b563412 Merge pull request #1954 from filecoin-project/asr/peerid
Create an api.MinerInfo that has peerID as a Peer ID
2020-06-10 19:32:42 +02:00
Łukasz Magiera 99bc46b8b8 Merge pull request #1971 from waynewyang/err-check
error check
2020-06-10 14:38:38 +02:00
waynewyang e2d2af3afa error check 2020-06-10 20:34:04 +08:00
RobQuistNL af4c4d4f1f Prevent words from being marked as glossary links 2020-06-10 11:44:35 +02:00
RobQuistNL 6d06bfb452 Update documentation 2020-06-10 11:41:58 +02:00
RobQuistNL 159a1a4645 Update other docs + bump go.mod version 2020-06-10 10:29:57 +02:00
Rob Quist d4b230c137 Update Ubuntu installation documentation + bump required go version to 1.14 2020-06-10 10:24:38 +02:00
Łukasz Magiera 6f501119bf Merge pull request #1957 from filecoin-project/feat/v27
v27 parameters
2020-06-10 02:04:59 +02:00
Łukasz Magiera a00df0da90 FFI v27 2020-06-10 01:44:14 +02:00
Aayush Rajasekaran 6d90f12bb6 Doc fix: use correct file name 2020-06-09 20:22:51 -03:00
Lucas MolasandAayush Rajasekaran 469eef8231 Lotus architecture notes (#1768)
Co-authored-by: Aayush Rajasekaran <arajasek94@gmail.com>
2020-06-09 20:17:28 -03:00
Aayush Rajasekaran 1ccad22227 Move api.MinerInfo to api/types 2020-06-09 19:08:43 -04:00
Aayush Rajasekaran 5cf76ba8b3 Create an api.MinerInfo that has peerID as a Peer ID 2020-06-09 19:07:53 -04:00
Jakub Sztandera 81bc8471e3 Merge pull request #1963 from filecoin-project/chore/upd-log
Update go-log to master
2020-06-09 23:27:02 +02:00
Jakub Sztandera 5feea2e0f8 Update go-log to master
It restores line informations in log messages

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-09 23:06:40 +02:00
Łukasz Magiera 79b35c59a5 Merge pull request #1959 from laser/feat/human-readable-bytes-display
display quantities of bytes in human-readable format
2020-06-09 22:09:30 +02:00
Łukasz Magiera 35749f0330 Merge pull request #1962 from filecoin-project/fix/log-spammy
clean up some of the more spammy logs
2020-06-09 22:04:26 +02:00
laser 2889efb608 display quantities of bytes in human-readable format
- client commP
- client local
- client find
- client query-ask
- client list-deals
- state sector-size
2020-06-09 12:53:44 -07:00
Jeromy 686c543778 clean up some of the more spammy logs 2020-06-09 12:49:31 -07:00
Rob Quist 093dc907b3 Update documentation about Lotus Seal Worker
Running the initial command `lotus-seal-worker run` gave an error about `--address` being a required parameter.
After setting that to `127.0.0.1:2345` the miner started to freak out and sectors broke as the mining process locked up.

It seems like in the mean time the sealing work has already been moved into the `lotus-storage-miner` and thus doesn't need to run alongside the miner. 

Changed the docs to what I think is correct now - but please check, I could be horribly wrong :)
2020-06-09 20:57:21 +02:00
Jakub Sztandera 1144049c66 Merge pull request #1927 from filecoin-project/feat/opencensus_report_validation_time
Express block validation time via OpenCensus
2020-06-09 10:03:46 +02:00
Jim Pick 6e11ff3796 Make libp2p swarm Announce / NoAnnounce addresses configurable
In go-ipfs, it is possible to manually configure addresses to announce
or not announce to the swarm.

https://github.com/ipfs/go-ipfs/blob/master/docs/config.md#addressesannounce

This PR adds the same feature to Lotus. It can be configured from the [libp2p]
section of either the .lotus or .lotusstorage config.toml file. Example:

[Libp2p]
  ListenAddresses = ["/ip4/0.0.0.0/tcp/34515", "/ip6/::/tcp/34515"]
  AnnounceAddresses = ["/ip4/52.13.91.110/tcp/34515"]
2020-06-08 17:03:11 -07:00
Łukasz Magiera 19013b09e0 v27 parameters 2020-06-08 23:48:31 +02:00
Łukasz Magiera 7539d88f54 Merge pull request #1951 from filecoin-project/feat/sstor-post-better
Update sector-storage with better post faults
2020-06-08 23:48:13 +02:00
Łukasz Magiera 28f895cec2 Update sector-storage with better post faults 2020-06-08 23:20:19 +02:00
laser 751bc45bef display a little inline warning if balance is zero 2020-06-08 12:20:44 -07:00
Mike Greenberg ae83ca6893 Express block validation, cpu/mem usage via OpenCensus 2020-06-08 14:15:01 -04:00
Łukasz Magiera 5f4efedbdd Merge pull request #1949 from filecoin-project/feat/no-mbase-update-err
don't update the mining base if mining fails for some reason
2020-06-08 18:56:48 +02:00
Jeromy 9d49c6861f don't update the mining base if mining fails for some reason 2020-06-08 09:51:47 -07:00
Łukasz Magiera 3b56288a5e Merge remote-tracking branch 'origin/master' into next 2020-06-08 18:29:36 +02:00
Jakub Sztandera f257f4febb Merge pull request #1911 from filecoin-project/feat/drand-score
Score drand topic
2020-06-08 15:12:25 +02:00
Łukasz Magiera df867f3349 Merge pull request #1946 from filecoin-project/asr/walletdelete
Add delete functionality to the wallet
2020-06-08 13:27:42 +02:00
Łukasz Magiera 5270c20263 Merge pull request #1947 from filecoin-project/asr/mineravailablebalance
Correct double-counting in StateMinerAvailableBalance
2020-06-08 13:24:54 +02:00
Jakub Sztandera 7762cd0a68 Assign positive scores to drand bootstrappers
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-08 11:34:46 +02:00
Jakub Sztandera e91cc9cd08 Add drand topic scores
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-08 11:34:46 +02:00
Aayush Rajasekaran 741825a04e Correct double-counting in StateMinerAvailableBalance 2020-06-07 20:49:50 -04:00
Aayush Rajasekaran 49b27da426 Add delete functionality to the wallet 2020-06-07 19:36:01 -04:00
Łukasz Magiera bf4bbd15e5 Merge pull request #1945 from filecoin-project/feat/specs-actors-v0.5.6
Update specs-actors to v0.5.6
2020-06-06 20:53:58 +02:00
Łukasz Magiera baa69c3c81 Update specs-actors to v0.5.6 2020-06-06 19:51:10 +02:00
Whyrusleeping ac644605f2 Merge pull request #1942 from filecoin-project/fix/proto-panic
Fix protobuf panic by updating protobuf to 1.4.2
2020-06-05 18:04:20 -07:00
Jakub Sztandera 94da339622 Fix protobuf panic by updating protobuf to 1.4.2
The panic is caused by usage of internal protobuf interface.
It was changed in protobuf 1.4.0 and reluctantly fixed in 1.4.2

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-06 02:47:29 +02:00
Whyrusleeping 366359803a Merge pull request #1903 from filecoin-project/feat/reuse-get-tipset-by-height
reuse GetTipsetByHeight in GetRandomness
2020-06-05 16:06:28 -07:00
Łukasz Magiera 3b13397165 gofmt 2020-06-06 00:59:01 +02:00
Łukasz Magiera 163c2b2544 Merge remote-tracking branch 'origin/master' into next 2020-06-06 00:58:24 +02:00
Łukasz Magiera 9e2603c1bf Merge pull request #1937 from laser/bugs/916-standardize-cid-base32
print "client"-command CIDs as base32-encoded strs
2020-06-06 00:53:07 +02:00
Łukasz Magiera d27750590a Merge pull request #1928 from filecoin-project/fix/lsm-prov-deadlines
Make lotus-storage-miner deadlines correct
2020-06-06 00:37:09 +02:00
Łukasz Magiera 33a00ab9e5 Merge pull request #1938 from filecoin-project/deps/spect-actors-upd
Update specs-actors
2020-06-06 00:31:09 +02:00
Łukasz Magiera f765fe36d7 Make lotus-storage-miner deadlines correct 2020-06-06 00:28:32 +02:00
Whyrusleeping be7a95c9a5 Merge pull request #1915 from filecoin-project/feat/chain-index
implement chain index to make lookbacks faster
2020-06-05 15:13:47 -07:00
Aayush Rajasekaran 2571480bb6 Update chain-val, use tagged specs-actors 2020-06-05 18:13:30 -04:00
Jeromy 73d928751d disallow sourcing randomness from future epochs 2020-06-05 15:12:13 -07:00
Whyrusleeping 0c19544d94 Merge pull request #1941 from filecoin-project/deps/update-hamt
update to new hamt code with improved perf
2020-06-05 14:54:21 -07:00
laser a80dce2e3b move to client command 2020-06-05 14:22:29 -07:00
Jeromy fb09d1ad2b update to new hamt code with improved perf 2020-06-05 14:13:08 -07:00
laser 963e4dd2fc set a Base32 default explicitly 2020-06-05 13:52:36 -07:00
Łukasz Magiera a5d81c6cc9 Merge pull request #1932 from filecoin-project/feat/chainget-state
chain get: @state selector to prettify actor state
2020-06-05 22:42:36 +02:00
laser b167e73acb allow CLI consumer to specify CID encoding for output 2020-06-05 13:33:45 -07:00
Łukasz Magiera e7af464033 Merge pull request #1931 from filecoin-project/feat/compute-state-sub-links
compute-state html: Allow linking to internal executions
2020-06-05 22:29:23 +02:00
laser 28e454fd4a go mod tidy 2020-06-05 13:13:53 -07:00
laser 55a9c9ae0a client deal command outputs Base32-encoded CID 2020-06-05 13:13:33 -07:00
laser b3eef76cdd client commP outputs Base32-encoded string 2020-06-05 13:13:16 -07:00
Łukasz Magiera 3f81ff3507 Update specs-actors 2020-06-05 22:06:11 +02:00
laser 2347ba6f39 print "client"-command CIDs as base32-encoded strs
Fixes #916
2020-06-05 13:04:28 -07:00
Łukasz Magiera b9d3c26eae Merge pull request #1924 from filecoin-project/fix/sealing-betterering
Sealing Improvements
2020-06-05 21:58:31 +02:00
Łukasz Magiera cd6670205c Update sector-storage 2020-06-05 21:31:57 +02:00
Whyrusleeping 9f4ac4f4f3 Merge pull request #1934 from filecoin-project/bugs/return-on-error-#1611
fix unhandled nil return
2020-06-05 12:26:27 -07:00
shannonwells e4bed4d963 return on all err conditions 2020-06-05 11:20:07 -07:00
shannonwells 76b5c8b145 fix unhandled nil return 2020-06-05 11:20:07 -07:00
Łukasz Magiera 9836c45e03 Merge pull request #1935 from filecoin-project/feat/cap-batch-verify-threads
add a simple semaphore to batch verify seals
2020-06-05 20:19:45 +02:00
Jeromy 51f1712564 add a simple semaphore to batch verify seals 2020-06-05 10:47:49 -07:00
Łukasz Magiera e9eff8be5c Merge pull request #1933 from laser/bugs/1209-paramfetch-sigterm
pass context to paramfetch.GetParams
2020-06-05 19:46:23 +02:00
laser 4855045ea2 pass context to paramfetch.GetParams
Fixes #1209
2020-06-05 10:28:00 -07:00
Łukasz Magiera 6b06ae528c chain get: @state selector to prettify actor state 2020-06-05 17:41:21 +02:00
Łukasz Magiera 813961b458 compute-state html: Allow linking to internal executions 2020-06-05 14:57:37 +02:00
Łukasz Magiera 7ae9d26cd1 Merge remote-tracking branch 'origin/next' into fix/sealing-betterering 2020-06-05 14:00:47 +02:00
Łukasz Magiera 9e5cc7c910 Update fsm, sector-storage 2020-06-05 10:46:45 +02:00
Łukasz Magiera 7d166fd730 Merge pull request #1908 from filecoin-project/docs/cpu-choice
add a doc on amd vs intel cpus
2020-06-05 01:21:50 +02:00
Łukasz Magiera 60101fd97b Merge pull request #1926 from filecoin-project/chore/merge-master
Merge in master into next
2020-06-05 01:13:12 +02:00
Jakub Sztandera 0bc174697a Fix WindowPoStScheduler
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-05 00:52:45 +02:00
Jakub Sztandera 7bee5b3abc Merge remote-tracking branch 'origin/master' into next
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-05 00:33:43 +02:00
Aayush Rajasekaran 656b285195 Bugfix: Begin walkback when lookback target's height is too low 2020-06-04 18:17:54 -04:00
whyrusleeping 86083531c6 a couple bugfixes 2020-06-04 18:17:54 -04:00
Jeromy c01f70105f implement chain index to make lookbacks faster 2020-06-04 18:17:54 -04:00
Łukasz Magiera 5aafa91e22 Merge pull request #1898 from filecoin-project/deps/update
Update CLI lib
2020-06-04 23:45:39 +02:00
Łukasz Magiera bada564c10 Merge pull request #1912 from filecoin-project/asr/statesearch
search for a message should stop if we reach sender nonce of 0
2020-06-04 23:42:16 +02:00
Łukasz Magiera f9f0d86ddf Merge pull request #1913 from acruikshank/feat/1853-confirmations-in-StateWaitMsg2
Add confidence and timeout to message wait
2020-06-04 23:23:15 +02:00
vyzo 6beabb5e8a Merge pull request #1914 from filecoin-project/feat/update-pubsub
update libp2p dependencies
2020-06-04 22:50:48 +03:00
vyzo 3719938849 gomod: update go-maddr-filter 2020-06-04 22:35:33 +03:00
vyzo 6420990007 gomod: update go-libp2p-quic-transport 2020-06-04 22:34:07 +03:00
vyzo 1fab24b9bc gomod: update go-libp2p-kad-dht 2020-06-04 22:32:11 +03:00
Łukasz Magiera 8bbe63bd9d Add expected win rate to miner-info 2020-06-04 21:26:29 +02:00
Łukasz Magiera fa3b1552cf Update sector-storage intefraces 2020-06-04 21:26:29 +02:00
Łukasz Magiera c625b30781 Update fsm adapter 2020-06-04 21:26:29 +02:00
vyzo b339750757 gomod: update go-libp2p-yamux 2020-06-04 21:34:01 +03:00
acruikshank da960a9de4 more import rearrangement 2020-06-04 09:54:37 -04:00
Mike Greenberg ce30162907 Fix documentation link for new systemd page 2020-06-04 08:10:08 -04:00
Mike Greenberg c0cdcbb9e0 Adjust service logging and startup settings 2020-06-04 08:09:01 -04:00
vyzo 954a20ff4c gomod: update go-libp2p to v0.9.4 2020-06-04 14:25:17 +03:00
vyzo 8057b994cf go.mod: remove unecessary (and harmful) replace directive for go-systemd 2020-06-04 14:23:59 +03:00
acruikshank ea111b058e imports 2020-06-03 22:34:57 -04:00
acruikshank ce33074626 go fmt 2020-06-03 22:30:09 -04:00
acruikshank 5f95a92135 fix race (sort of) by increasing confidence 2020-06-03 22:18:38 -04:00
Jeromy cd817906b2 handle sourcing randomness from a future block 2020-06-03 18:30:43 -07:00
Jakub Sztandera 29dbc26dbd Update cli
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-04 01:01:41 +02:00
acruikshank 04f0130530 remove timeout 2020-06-03 17:42:06 -04:00
vyzo f210a6e91a pubsub: set Dout parameter to 3 (from the default of 2)
we are using a higher D value than the default, so this can be safely increased.
2020-06-04 00:03:31 +03:00
vyzo aded0706be gomod: update go-libp2p@v0.9.3 and go-libp2p-pubsub@v0.3.2 2020-06-04 00:02:54 +03:00
acruikshank 57567db017 tidy 2020-06-03 15:51:11 -04:00
acruikshank 5574e4f11b add confidence and timeout to message wait 2020-06-03 15:38:37 -04:00
Aayush Rajasekaran 4b01b666f6 Bugfix: searchback for a message should stop if we reach sender nonce of 0 2020-06-03 14:08:05 -04:00
Łukasz Magiera 35740895ed Merge pull request #1899 from filecoin-project/feat/1827-lotus-daemon-stop-cmd
add (sub)commands which shut down lotus daemon and storage miner
2020-06-03 19:15:20 +02:00
Jakub Sztandera 4c5d84d106 Merge pull request #1904 from filecoin-project/feat/peer-scores
Add `lotus net scores` for pubsub score visibility
2020-06-03 18:04:16 +02:00
Jeromy a8915f0331 add a doc on amd vs intel cpus 2020-06-03 08:45:53 -07:00
Jakub Sztandera 7f962e19c2 Fix lint
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-03 03:19:18 +02:00
Jakub Sztandera 186fd4da74 Add lotus net scores for pubsub score visibility
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-03 03:13:49 +02:00
Jeromy 2fdcf5347b reuse GetTipsetByHeight in GetRandomness 2020-06-02 17:35:23 -07:00
Jakub Sztandera 4a983995a8 Merge pull request #1901 from acruikshank/bugs/1893-chain-import-home-directory
Expand tilde before passing file name into chain import
2020-06-02 23:53:04 +02:00
Jakub Sztandera 263bdc9687 Merge pull request #1902 from filecoin-project/chore/merge-master
Merge in master into next
2020-06-02 23:23:41 +02:00
Jakub Sztandera 42c76aaebc Remove mod-download
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 23:11:17 +02:00
Jakub Sztandera 9326cb5411 Update golangci-lint, increase its timeout
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 23:07:48 +02:00
Jakub Sztandera 415b69155b Disable caches
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 23:02:37 +02:00
Jakub Sztandera 3423d29815 Prune go mod cache
Circle reports 1.9GB, should be closer to 300MB

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 22:54:29 +02:00
Jakub Sztandera 673a972fe9 Merge remote-tracking branch 'origin/master' into next
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 22:49:27 +02:00
acruikshank 1fd20b636b tidy 2020-06-02 16:48:50 -04:00
acruikshank d7a2556292 expand tilda before passing file name into chain import 2020-06-02 16:43:39 -04:00
Łukasz Magiera 8aa158d4e6 Merge pull request #1900 from filecoin-project/feat/subcall-timing-compute-state
add subcall timing to compute state output
2020-06-02 22:23:25 +02:00
Łukasz Magiera 3595b1f8e9 compute-state html: Add timing for internal executions 2020-06-02 22:06:03 +02:00
Jeromy 9b867a221a add subcall timing to compute state output 2020-06-02 12:53:24 -07:00
laser 46a016cdce name change, for consistency 2020-06-02 12:38:21 -07:00
laser bea9cd2fe2 rename to better convey intent + document 2020-06-02 12:35:11 -07:00
laser ee9d9a52a9 first take at a "lotus-storage-miner stop" command
Fixes #1827
2020-06-02 12:31:21 -07:00
laser 1e8a875edb shutdownChan instead of shutdownCh, for consistency 2020-06-02 12:31:01 -07:00
laser 36a93c90eb use a real ellipsis, kinda 2020-06-02 12:30:45 -07:00
laser 38d714a28a first take at "daemon stop" command
Fixes #1827

TODO: plumb the daemon-stopping into lotus-storage-miner, too
2020-06-02 12:29:58 -07:00
Whyrusleeping bbb954afc5 Merge pull request #1896 from filecoin-project/chore/lint-2
Fix even more lint warnings
2020-06-02 11:40:57 -07:00
Whyrusleeping de5d16eeac Merge pull request #1897 from filecoin-project/deps/update-json-rpc
update to fixed jsonrpc library
2020-06-02 11:36:31 -07:00
Jeromy 1968195da9 update to fixed jsonrpc library 2020-06-02 11:21:54 -07:00
Jakub Sztandera 22851df145 Undo change in events_test
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 18:46:43 +02:00
Jakub Sztandera 96ade5f2dd Cleanup more lint warnings
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 18:38:41 +02:00
laser 5e727819ad stub the "daemon stop" command 2020-06-02 08:09:18 -07:00
Jakub Sztandera 5605aae269 Fix even more lint warnings
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-06-02 16:29:39 +02:00
Łukasz Magiera c6b6c2990c Merge pull request #1888 from filecoin-project/feat/build-typ-version
Include build type in version
2020-06-01 21:18:30 +02:00
Łukasz Magiera a49dc90386 Fix version test 2020-06-01 21:11:37 +02:00
Łukasz Magiera 64f4e80446 Include build type in version 2020-06-01 20:49:39 +02:00
Łukasz Magiera e67253b6a8 Merge pull request #1887 from filecoin-project/feat/improve-datastore
fsrepo: Use LevelDB for metadata datastore
2020-06-01 20:21:15 +02:00
Łukasz Magiera c73326e96d fsrepo: Use LevelDB for metadata datastore 2020-06-01 20:13:07 +02:00
Łukasz Magiera 7003960fdd Merge remote-tracking branch 'origin/master' into next 2020-06-01 18:52:06 +02:00
Łukasz Magiera 0acc2a2a63 Merge pull request #1880 from filecoin-project/asr/minerfaults
Add an API method to list all faults occuring in a certain range
2020-06-01 18:47:09 +02:00
Łukasz Magiera 596f78f9e6 Merge pull request #1885 from filecoin-project/bugs/sector-size-usage-in-scripts
update scripts and docs to use human-readable sector size
2020-06-01 18:45:20 +02:00
Łukasz Magiera 17f1eec81f Merge pull request #1886 from filecoin-project/feat/1829-repo-already-locked
error message to tell user why repo is already locked
2020-06-01 18:43:05 +02:00
Łukasz Magiera f0d44ea396 Merge pull request #1884 from filecoin-project/feat/fountain-maddr-link
fountain/miner: Add a link to docs about creating owner address
2020-06-01 18:41:57 +02:00
Łukasz Magiera ad4712b593 Merge pull request #1873 from filecoin-project/feat/better-post-faults
wdpost: Better fault handling
2020-06-01 18:39:00 +02:00
laser 92b8d9ad17 tell user why repo is already locked
Fixes #1829
2020-06-01 09:37:10 -07:00
laser 12ff9fd76b update scripts and docs to use human-readable sector size
Commit #fa863595 modified various CLI commands to accept a 
human-readable sector size. We should update docs and scripts, too.
2020-06-01 09:20:44 -07:00
Łukasz Magiera e26cf4e003 fountain/miner: Add a link to docs about creating owner address 2020-06-01 17:49:15 +02:00
Łukasz Magiera b753cd4503 Run window post test on circle 2020-06-01 15:06:10 +02:00
Łukasz Magiera ee29a92021 Add a test for Window Post 2020-06-01 14:49:48 +02:00
Łukasz Magiera c3916e3a7f Merge pull request #1875 from filecoin-project/feat/check-verifreg-cmds
add commands to check individual balances for verifiers and clients
2020-06-01 13:00:08 +02:00
Aayush Rajasekaran ec0baefc48 Add an API method to list all faults occuring in a certain range 2020-05-31 00:57:52 -04:00
Jeromy bac1e3f901 put blocks in cache after get 2020-05-29 15:15:59 -07:00
Jeromy 94555ea8c1 delete block should delete from cache too 2020-05-29 15:13:18 -07:00
Jeromy cc233c6956 add an lru caching blockstore 2020-05-29 15:13:18 -07:00
Jeromy 2a3d79f055 add commands to check individual balances for verifiers and clients 2020-05-29 14:47:17 -07:00
Whyrusleeping 1c01799a4b Merge pull request #1855 from filecoin-project/feat/systemd-usage
Add systemd documention to table of contents
2020-05-29 14:07:09 -07:00
WhyrusleepingandJakub Sztandera 4ef330ba8b Update scripts/lotus-daemon.service
Co-authored-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-29 14:02:07 -07:00
Łukasz Magiera cd2bf04a6b wdpost: Better fault handling 2020-05-29 21:36:11 +02:00
Łukasz Magiera f7a71f4be7 Merge pull request #1837 from filecoin-project/feat/secstor-unseal
Update sector-storage with ReadPiece impl
2020-05-29 20:36:40 +02:00
Łukasz Magiera e5c24ff32b Update sector-storage with ReadPiece impl 2020-05-29 19:53:35 +02:00
Whyrusleeping f87054bde4 Merge pull request #1858 from hayeah/fix-miner-stale-tipset
Fix block production timing to avoid mining old tipset
2020-05-29 10:41:25 -07:00
Łukasz Magiera e954cc0d67 Merge pull request #1872 from filecoin-project/asr/docs
Fix broken link
2020-05-29 18:44:00 +02:00
Aayush Rajasekaran 43c887f2b6 Fix broken link 2020-05-29 12:35:21 -04:00
Aayush Rajasekaran 1cf9b9a67f Merge pull request #1861 from filecoin-project/asr/printmoney
Correctly handle transfers with sender = receiver
2020-05-29 12:27:56 -04:00
Aayush Rajasekaran 7dd25c3ac5 Correctly handle transfers with sender = receiver 2020-05-29 12:15:41 -04:00
Jakub Sztandera 241c3fa673 Merge pull request #1869 from filecoin-project/feat/drand-pubsub
Add pubsub support to drand beacon
2020-05-29 18:06:38 +02:00
Łukasz Magiera 785eeb1eee Merge pull request #1850 from filecoin-project/chore/lint
Cleanup many lint warnings
2020-05-29 18:06:06 +02:00
Jakub Sztandera 30d82ba962 Explicity Watch for randomness
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-29 17:55:24 +02:00
Jakub Sztandera 002d021eb7 Enable HashMsgId
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-29 17:55:24 +02:00
Jakub Sztandera 71eb41b9aa Add pubsub support to drand beacon
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-29 17:55:17 +02:00
Łukasz Magiera f06369166e Merge pull request #1868 from filecoin-project/feat/pond-regen-methods
pond: rerun method-gen
2020-05-29 15:14:20 +02:00
Łukasz Magiera 5129fed7c8 pond: rerun method-gen 2020-05-29 14:36:56 +02:00
Łukasz Magiera f06794ae84 Merge pull request #1856 from filecoin-project/deps/specs-actors-batch-porep
update specs actors to version with batch porep verification
2020-05-29 14:13:04 +02:00
Howard Yeh 1cabecedee Fix block production timing to avoid mining old tipset 2020-05-29 18:13:58 +08:00
Whyrusleeping f17c32c593 Merge pull request #1749 from filecoin-project/feat/shed-verifreg
add some commands for interacting with verified registry actor to lot…
2020-05-28 17:41:28 -07:00
Whyrusleeping b59f88324c Merge pull request #1865 from filecoin-project/fix/missing-err-check-stored-ask
Add missing err check in storage ask initialization
2020-05-28 17:17:50 -07:00
hannahhoward 0c4db8cf6b fix(storageminer): add missing err check
Missing an err check in storage miner initialization in the stored ask
2020-05-28 17:05:17 -07:00
Jeromy 9c020e54b5 Add more verifreg commands to list verifiers and clients 2020-05-28 17:01:01 -07:00
Jeromy 9811375d18 add some commands for interacting with verified registry actor to lotus-shed 2020-05-28 17:01:00 -07:00
Whyrusleeping 2632621f7e Merge pull request #1862 from filecoin-project/mod-tidy/master
Mod-tidy on master
2020-05-28 14:52:00 -07:00
Jakub Sztandera d742efe165 Mod-tidy on master
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-28 23:50:29 +02:00
Jakub Sztandera 492ffac913 Merge pull request #1853 from shepf/master
update struct.go github url
2020-05-28 23:50:05 +02:00
Mike Greenberg 21415a9847 add chainwatch systemd svc config; make install-chainwatch-service 2020-05-28 16:53:00 -04:00
Mike Greenberg 4acf0c7ec0 install service files in suitable path; tweak lotus svc restarting 2020-05-28 16:26:07 -04:00
Aayush Rajasekaran fa69adf45c update chain-validation 2020-05-28 13:21:12 -07:00
Aayush Rajasekaran fa04da2995 Update specs-actors and storage-fsm 2020-05-28 13:19:36 -07:00
Jeromy e2a554c2e6 update specs actors to version with batch porep verification 2020-05-28 13:19:18 -07:00
Jeromy 91da81c8bc mod tidy 2020-05-28 13:17:55 -07:00
Jeromy 7bd18290db Merge branch 'master' into next 2020-05-28 13:16:47 -07:00
Jeromy 8e55c91cd2 check neq zero exit code 2020-05-28 22:11:49 +02:00
Mike Greenberg 514339e855 update systemd services; include make directives and docs for use 2020-05-28 22:11:49 +02:00
frrist 9f8ecb0ac4 update chain-validation
- has new syscalls
2020-05-28 22:11:49 +02:00
frrist be1bbe88b0 update chain-val syscalls interface 2020-05-28 22:11:49 +02:00
Łukasz Magiera f1ccbe496a cli: Trim spaces from token file 2020-05-28 22:11:49 +02:00
vyzo 495554e565 gomod: update go-libp2p-pubsub@v0.3.1 2020-05-28 22:11:49 +02:00
Ignacio Hagopian 17c378c18a fix
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-28 22:11:49 +02:00
Ignacio Hagopian 6e63ea6cce revert file
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-28 22:11:49 +02:00
Ignacio Hagopian 10753f14d0 retrieve: make fileref optional
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-28 22:11:49 +02:00
Ignacio Hagopian 0af7cd1448 allow using ipfs for retrieval
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-28 22:11:49 +02:00
Ignacio Hagopian de3edc2ec7 remote ipfs support & automatic env
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-28 22:11:49 +02:00
Whyrusleeping d0eb4278ae Merge pull request #1860 from filecoin-project/fix/recovery-exit-code-check
check neq zero exit code
2020-05-28 12:59:29 -07:00
Jeromy b807bdbea0 check neq zero exit code 2020-05-28 08:45:34 -07:00
Mike Greenberg 386b818d16 add systemd documention to table of contents 2020-05-27 19:28:31 -04:00
Jakub Sztandera 8639409f74 go mod tidy
,
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-28 01:16:01 +02:00
Jakub Sztandera b372881e91 Fix more lint warnings
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-28 01:15:19 +02:00
Whyrusleeping fc351d08b0 Merge pull request #1849 from filecoin-project/feat/remove-drand-on-miner
Remove drand on miner side, MinerGetBaseInfo provides the same info
2020-05-27 16:06:08 -07:00
shepf eb325e6814 update struct.go github url 2020-05-28 07:05:53 +08:00
Jakub Sztandera 7232e5481c Use origin/next for linting
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-28 00:49:52 +02:00
Jakub Sztandera f26a336afb Use git.base_revision
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-28 00:45:17 +02:00
Whyrusleeping 70e690dac0 Merge pull request #1852 from filecoin-project/feat/systemd-usage
Update systemd usage and docs
2020-05-27 15:23:45 -07:00
Mike Greenberg 78e0c96f22 update systemd services; include make directives and docs for use 2020-05-27 17:17:18 -04:00
Jakub Sztandera d6615b6286 Cleanup many lint warnings
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-27 22:53:20 +02:00
Jakub Sztandera 4604b60fb1 Remove drand on miner side, MinerGetBaseInfo provides the same info
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-27 20:24:26 +02:00
Whyrusleeping 75041b96e4 Merge pull request #1815 from filecoin-project/frrist/new-chainval-syscalls
update chain-val syscalls interface
2020-05-27 11:00:16 -07:00
Whyrusleeping 8544bda14a Merge pull request #1846 from filecoin-project/feat/trim-token-file
cli: Trim spaces from token file
2020-05-27 10:58:09 -07:00
Whyrusleeping 745fba7d1f Merge pull request #1841 from filecoin-project/gomod/update-pubsub
Update go-libp2p-pubsub to v0.3.1
2020-05-27 10:50:19 -07:00
Łukasz Magiera 6986204657 Merge pull request #1848 from filecoin-project/feat/new-drand-client
Update go-log, reduce drand entry log level, add TAG env for dev scripts
2020-05-27 16:22:13 +02:00
Jakub Sztandera 3f9cde28fc Update go-log, reduce drand entry log level, add TAG env for dev scripts
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-27 16:19:21 +02:00
Jakub Sztandera aa682a377d Partially fix pond spawn
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-27 16:19:21 +02:00
Łukasz Magiera af1d54501f Merge pull request #1843 from jsign/jsign/2stackedprs
Allow remote IPFS node support & IPFS for data retrieval & automatic env wiring
2020-05-27 14:59:18 +02:00
Ignacio Hagopian 009cd92010 fix
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-27 09:50:32 -03:00
Łukasz Magiera 6386107b80 Merge pull request #1819 from filecoin-project/feat/new-drand-client
Switch to new drand client
2020-05-27 14:35:01 +02:00
Jakub Sztandera 218b2b82c1 Update drand chain info
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-27 14:09:04 +02:00
Jakub Sztandera b06b0147a9 Switch to new drand client
This is a preview of a change to new drand client.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-27 13:52:33 +02:00
Łukasz Magiera b74e8f5922 Merge pull request #1847 from waynewyang/Deadline-Index
fix: add deadline index for wdpost
2020-05-27 11:40:31 +02:00
waynewyang 94a7ef1c10 add deadline index for wdpost 2020-05-27 17:01:48 +08:00
Łukasz Magiera 02afd7d71f cli: Trim spaces from token file 2020-05-27 10:13:06 +02:00
Ignacio Hagopian a10690359c revert file
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-26 15:35:20 -03:00
Łukasz Magiera fa4ff89dca Set devnet params 2020-05-26 19:58:09 +02:00
Ignacio Hagopian bcd84cbe9d retrieve: make fileref optional
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-26 14:52:52 -03:00
Ignacio Hagopian 61daaa774b allow using ipfs for retrieval
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-26 14:52:52 -03:00
Ignacio Hagopian d5346f8326 remote ipfs support & automatic env
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-05-26 14:52:51 -03:00
frrist 8ce6921b18 update chain-validation
- has new syscalls
2020-05-26 10:51:19 -07:00
frrist c8f28103f3 update chain-val syscalls interface 2020-05-26 10:49:39 -07:00
vyzo 3cd3785385 gomod: update go-libp2p-pubsub@v0.3.1 2020-05-26 20:47:00 +03:00
Łukasz Magiera 9089aadbbf Merge pull request #1821 from filecoin-project/deps/update-ffi
update to latest ffi
2020-05-26 19:34:02 +02:00
Łukasz Magiera 02ca1937f8 mod tidy 2020-05-26 19:07:21 +02:00
Łukasz Magiera 6897110fe5 Merge pull request #1838 from waynewyang/wdpost-input-correct
Fix:the input sectors of wpost  must match with the minerActor
2020-05-26 15:00:58 +02:00
waynewyang b799af3e9a Fix:the input sectors of wpost must match with the minerActor 2020-05-26 17:58:20 +08:00
Łukasz Magiera 9641d93615 Merge pull request #1836 from waynewyang/Wdpost-Gaslimit
Set largest gaslimit for wdpost
2020-05-26 08:53:59 +02:00
waynewyang da6768c94d Set largest gaslimit for wdpost 2020-05-26 11:43:17 +08:00
Lucas Molas 54a8b88d6c Merge pull request #1832 from filecoin-project/fix/disable-relay
Unconditionally disable relay
2020-05-25 10:38:48 -03:00
vyzo ba6217cc2c go mod tidy 2020-05-25 13:46:53 +03:00
vyzo 314da26da3 unconditionally disable relay 2020-05-25 13:39:50 +03:00
Jeromy 646800b8a8 update to latest ffi 2020-05-22 09:26:14 -07:00
Lucas Molas 92d58ab191 Merge pull request #1820 from filecoin-project/fix/sink-message-topic-deliveries
sink message topic deliveries
2020-05-22 11:33:43 -03:00
vyzo 5531f27798 sink the FirstMessageDeliveries boost for the messages topic 2020-05-22 17:25:56 +03:00
vyzo cc98117df2 log block validation time 2020-05-22 17:21:37 +03:00
Whyrusleeping ffd340086e Merge pull request #1817 from filecoin-project/feat/sort-miners-by-deal-count
Add command to sort miners by deal counts
2020-05-21 16:06:44 -07:00
Jeromy 805686be2e Add command to sort miners by deal counts 2020-05-21 15:52:20 -07:00
Whyrusleeping 0d3f602d58 Merge pull request #1804 from filecoin-project/feat/seal-verify-shed
put a command for verifying seals into the shed
2020-05-21 10:07:19 -07:00
Whyrusleeping 83436842c5 Merge pull request #1802 from filecoin-project/feat/gfm-v0.2.7
Use latest go-fil-markets
2020-05-21 10:05:54 -07:00
Whyrusleeping bafb922ff7 Merge pull request #1811 from filecoin-project/feat/update-pubsub
Update pubsub and libp2p
2020-05-21 09:51:00 -07:00
Jeromy 6e024d9994 parse ticket and seal randomness flags 2020-05-21 08:26:32 -07:00
vyzo d597c3fb0d increase OpportunisticGraftThreshold to 5 2020-05-21 14:38:11 +03:00
vyzo 24cebb8b2f gomod: update go-libp2p@v0.9.2 2020-05-21 12:13:14 +03:00
vyzo 0cc8446a79 configure Dout=0 for bootstrappers, turn off Mesh Failure Penalty for messages as well 2020-05-21 12:11:22 +03:00
vyzo 3e383d909a gomod: update go-libp2p-pubsub@v0.3.0 2020-05-21 12:08:13 +03:00
hannahhoward 3264a9faad feat(deps): update to latest go-fil-markets
update to go-fil-markets v0.2.7 with latest changes, modify constructors as needed to accomodate new
DS Prefix customization
2020-05-20 16:01:03 -07:00
hannahhoward c52b75d59e fix(deps): update to new 0.2.7 2020-05-20 16:00:03 -07:00
shannonwells 652c257763 passing w/ new namespace wraps 2020-05-20 15:58:59 -07:00
shannonwells 060f23d748 mod tidy 2020-05-20 15:56:58 -07:00
shannonwells e68ab286f6 upgrade lotus to go-fil-markets v0.2.5 2020-05-20 15:56:58 -07:00
Jeromy 92e5cc5ad7 add args usage 2020-05-20 15:28:19 -07:00
Łukasz Magiera 6831ca9e03 Merge pull request #1808 from filecoin-project/feat/extract-jsonrpc-auth
Extract auth utils to go-jsonrpc
2020-05-20 22:22:53 +02:00
Łukasz Magiera f7325a69c1 Extract auth utils to go-jsonrpc 2020-05-20 20:37:45 +02:00
Łukasz Magiera bb78292faf Merge pull request #1807 from filecoin-project/feat/extract-jsonrpc
Extract lib/jsonrpc to go-jsonrpc
2020-05-20 19:58:50 +02:00
Łukasz Magiera eeca031525 extract lib/jsonrpc to go-jsonrpc 2020-05-20 19:49:09 +02:00
Jeromy f82e0e61e1 put a command for verifying seals into the shed 2020-05-20 10:10:35 -07:00
Łukasz Magiera 75e47db520 Merge pull request #1771 from filecoin-project/feat/post-recover
post: Handle Recovering sectors
2020-05-20 19:08:09 +02:00
Łukasz Magiera 3da1a0d8cc post: Declare recoveries for the next deadline 2020-05-20 19:07:31 +02:00
Travis Person a293bd798f init map 2020-05-20 18:41:22 +02:00
Łukasz Magiera ae60001dcc post: Handle Recovering sectors 2020-05-20 18:41:20 +02:00
Łukasz Magiera cea7c41023 Merge pull request #1761 from dtynn/fix/dtynn/use_abs_path_for_client_filestore
use abs path to construct FileManager
2020-05-20 12:49:53 +02:00
Łukasz Magiera 0fe7a0b2e3 Merge pull request #1764 from filecoin-project/feat/has-cache-bs
add blockstore 'Has' caching
2020-05-20 12:48:50 +02:00
Łukasz Magiera 267368d56c Merge pull request #1767 from filecoin-project/feat/html-trace-improvements
add tipset key and height to html trace output
2020-05-20 12:48:05 +02:00
Łukasz Magiera f5451ad455 Merge pull request #1795 from shannon-6block/master
Pset represents the proving sectors, and Sset repensents all sectors
2020-05-20 12:46:22 +02:00
Łukasz Magiera 555537c528 Merge pull request #1791 from filecoin-project/feat/api-gen-2
improving the autogenerated api docs
2020-05-20 12:40:49 +02:00
shannon cc5875c6bd Pset represents the proving sectors, and Sset repensents all sectors 2020-05-20 12:12:13 +08:00
Jeromy c54d050cb7 slightly better methodgroup parsing, and more group docs 2020-05-19 09:49:47 -07:00
Jeromy cb88237305 improving the autogenerated api docs 2020-05-19 08:48:58 -07:00
Whyrusleeping cc44167f2c Merge pull request #1564 from filecoin-project/feat/api-doc-gen
working on api documentation autogeneration
2020-05-18 19:24:31 -07:00
Whyrusleeping 78c656e4c1 Merge pull request #1788 from filecoin-project/asr/issuetemplate
Create an issue template for mining issues
2020-05-18 17:27:55 -07:00
Jeromy 607bcc401c very basic api documentation autogeneration 2020-05-18 17:20:54 -07:00
Whyrusleeping 7fd481ea6f Merge pull request #1766 from filecoin-project/feat/chain-get-decoders
Feat/chain get decoders
2020-05-18 16:06:41 -07:00
Whyrusleeping 9c91daf19a Merge pull request #1787 from filecoin-project/fix/dont-mine-below-min
having power below the minimum means not having power
2020-05-18 16:05:06 -07:00
Aayush Rajasekaran c1ef9d1731 Create an issue template for mining issues 2020-05-18 18:31:53 -04:00
Jeromy eaf69b160c having power below the minimum means not having power 2020-05-18 14:51:42 -07:00
Łukasz Magiera 269286e587 Merge pull request #1785 from filecoin-project/frrist/chain-val-update
update chain-validation
2020-05-18 23:49:11 +02:00
Łukasz Magiera f99c5416ce Merge pull request #1786 from filecoin-project/asr/clideal
Prevent client list-deals from crashing
2020-05-18 23:48:33 +02:00
Aayush Rajasekaran 8f6c3c2cc7 prevent client list-deals from crashing 2020-05-18 17:44:00 -04:00
frrist a2e25897e9 go mod tidy 2020-05-18 14:35:47 -07:00
frrist fc9e046ca7 update chain-validation 2020-05-18 12:50:36 -07:00
Travis Person 5730d46179 Merge pull request #1728 from filecoin-project/frrist/vm-transfer-exitcodes
return correct exit codes from vm transfer
2020-05-18 19:28:48 +00:00
frrist 9165f14693 feedback: fatal errors in vm.transfer 2020-05-18 12:00:52 -07:00
frrist 9305eca97c don't ignore transfer error in delete actor 2020-05-18 12:00:52 -07:00
frrist 0c2e4e2d4f return correct exitcodes from vm transfer 2020-05-18 12:00:52 -07:00
Łukasz Magiera 59725b3af3 Merge pull request #1784 from filecoin-project/feat/update-serialization-vectors
update serialization vectors
2020-05-18 20:34:44 +02:00
Whyrusleeping a0ab3483ed Merge pull request #1770 from filecoin-project/asr/test
Add an interop test for block header serialisation
2020-05-18 11:28:06 -07:00
Jeromy e6f3b79b23 update serialization vectors 2020-05-18 11:02:34 -07:00
Whyrusleeping 1ed6183344 Merge pull request #1782 from filecoin-project/fix/no-metrics-drand
Change drand to one without metrics
2020-05-18 10:24:15 -07:00
Jakub Sztandera 29b1ac964b mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-18 19:09:19 +02:00
Jakub Sztandera 8d637c515a Change drand to one without metrics
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-18 19:00:30 +02:00
Aayush Rajasekaran 5220a61fc5 Add an interop test for block header serialisation 2020-05-16 17:27:04 -04:00
Jeromy d9502693f0 add tipset key and height to html trace output 2020-05-16 12:53:51 -07:00
Whyrusleeping 9a0d0511c7 Merge pull request #1765 from filecoin-project/fix/miner-info-div-zero
avoid dividing by zero if pset is empty
2020-05-16 12:48:53 -07:00
Jeromy 72eb32ae3c add additional chain get decoders 2020-05-16 12:41:04 -07:00
Jeromy cf9e576028 avoid dividing by zero if pset is empty 2020-05-16 11:35:24 -07:00
Jeromy 9804bd3c4c add blockstore 'Has' caching 2020-05-16 11:31:14 -07:00
dtynn 30e2642f4d use abs path to construct FileManager 2020-05-16 09:36:38 +08:00
Whyrusleeping 54b3eafd6d Merge pull request #1758 from filecoin-project/fix/lotus-bench-secp
register secp signatures for lotus bench usage
2020-05-15 13:05:27 -07:00
Jeromy f6589407c1 register secp signatures for lotus bench usage 2020-05-15 13:01:45 -07:00
Łukasz Magiera 5c73602d24 Merge pull request #1757 from filecoin-project/feat/faster-mpool-add
cache signatures, and dont check them in a lock
2020-05-15 20:27:31 +02:00
Whyrusleeping 70657e35ba Merge pull request #1708 from filecoin-project/feat/block-validator
Improved pubsub block validator
2020-05-15 11:26:26 -07:00
Łukasz Magiera 908053015b Merge pull request #1753 from filecoin-project/feat/less-res-comm2
Update sector-storage with relaxed commit2 resource numbers
2020-05-15 20:17:41 +02:00
Whyrusleeping 8bae22ef61 Merge pull request #1746 from filecoin-project/bug/circleci-mac
install jq in /usr/local/bin
2020-05-15 11:17:12 -07:00
Łukasz Magiera 1012a64110 Merge pull request #1756 from filecoin-project/feat/ffi-88555ec98
Update FFI
2020-05-15 20:16:27 +02:00
Łukasz Magiera 9eb2399539 Merge pull request #1754 from filecoin-project/fix/initial-pledge
state: Calculate slightly larger initial pledge
2020-05-15 20:15:36 +02:00
Łukasz Magiera d539be4875 Merge pull request #1741 from filecoin-project/fix/json-out-chan-closing
properly select channel ID to close for handleOutChans
2020-05-15 20:10:10 +02:00
Jeromy 13fc3f2f54 remove stress test (not really a real test) 2020-05-15 11:00:13 -07:00
Jeromy 33ec4d332b cache signatures, and dont check them in a lock 2020-05-15 10:56:38 -07:00
Whyrusleeping d6bb0500df Merge pull request #1752 from filecoin-project/fix/mpool-slowness
miner: Optimize SelectMessages
2020-05-15 10:48:06 -07:00
Łukasz Magiera b90666b293 miner: optimize SelectMessages 2020-05-15 19:30:31 +02:00
Łukasz Magiera 173a72f374 Merge pull request #1755 from filecoin-project/fix/cw-tkt-crash
chainwatch: Don't crash with nil ticket
2020-05-15 19:17:45 +02:00
Łukasz Magiera 0ae0e89ddd Update FFI 2020-05-15 19:16:06 +02:00
Łukasz Magiera c4d01c04a4 chainwatch: don't crash with nil ticket 2020-05-15 19:06:52 +02:00
Łukasz Magiera 0b56ca3c21 Merge pull request #1751 from filecoin-project/fix/turnoff-block-mesh-penalty
Turn off Mesh Delivery Failure penalty
2020-05-15 19:02:46 +02:00
Łukasz Magiera 022348f426 state: Calculate slightly larger initial pledge 2020-05-15 16:53:35 +02:00
Łukasz Magiera ad108d6051 Update sector-storage with relaxed commit2 resource numbers 2020-05-15 16:00:14 +02:00
vyzo dbe2a1e2cd turn off Mesh Delivery Failure penalty 2020-05-15 12:50:20 +03:00
Aayush Rajasekaran f86a2ced06 Merge pull request #1747 from filecoin-project/asr/docs
Fix 3 typos
2020-05-14 18:34:59 -04:00
Aayush Rajasekaran f7a45f6c12 Fix 3 typos 2020-05-14 18:27:47 -04:00
ognots 658f78d75f install jq in /usr/local/bin
/home/ognots/.bin not in path, causing macos test to fail
2020-05-14 17:32:05 -04:00
Aayush Rajasekaran e9eaee6ef8 Merge pull request #1745 from filecoin-project/asr/docs
Docs finishing touches
2020-05-14 17:08:33 -04:00
Aayush Rajasekaran 505e30c7b2 Docs finishing touches 2020-05-14 16:27:20 -04:00
Whyrusleeping 1ac6f3fa33 Merge pull request #1744 from filecoin-project/fix/signed-message-accounting
use chainmsg type instead of unsigned message for gas price checking
2020-05-14 12:51:19 -07:00
Jeromy 88fa9726cc use chainmsg type instead of unsigned message for gas price checking 2020-05-14 12:44:26 -07:00
Whyrusleeping af87920b6f Merge pull request #1743 from filecoin-project/fix/message-validation-checks
reuse logic between message selection and validation
2020-05-14 12:38:22 -07:00
Jeromy 881b0517b1 reuse logic between message selection and validation 2020-05-14 12:29:11 -07:00
Łukasz Magiera 9b2b72819b Merge pull request #1742 from filecoin-project/asr/syncfix
Don't assert params must be empty for Methodnum = 0
2020-05-14 21:28:38 +02:00
Aayush Rajasekaran 2e74e1d2ae Don't assert params must be empty for Methodnum = 0 2020-05-14 15:10:07 -04:00
Jeromy edae6a3ae8 fix the problem 2020-05-14 12:05:01 -07:00
Jeromy 987571dd8c add test to demonstrate failure 2020-05-14 11:48:58 -07:00
Whyrusleeping 934b2df763 Merge pull request #1739 from filecoin-project/feat/testnet-phase-2
Testnet Phase 2 network info
2020-05-14 11:36:56 -07:00
vyzo 81bc159b3e cache successful block signature validation 2020-05-14 20:48:40 +03:00
vyzo 50e05ae1ba use sigs.CheckBlockSignature 2020-05-14 20:48:40 +03:00
vyzo 432c69c616 update message validator to provide rejection signal 2020-05-14 20:48:40 +03:00
vyzo e714294273 initialize map 2020-05-14 20:48:19 +03:00
vyzo c3a144bcb6 flesh out signature validation logic 2020-05-14 20:48:19 +03:00
vyzo dd86a289ce cache miner worker keys 2020-05-14 20:48:19 +03:00
vyzo 6e0dac06f4 utility to retrieve miner worker key from the chain 2020-05-14 20:48:19 +03:00
vyzo 5bd0e92068 remove source flagging from bogus CID blocks
it's ineffective.
2020-05-14 20:48:19 +03:00
vyzo b032d3524b configure behaviour penalty for gsv1.1 2020-05-14 20:48:19 +03:00
vyzo 6933df918a gomod: update go-libp2p-pubsub@master 2020-05-14 20:45:25 +03:00
Łukasz Magiera d1997b5857 Merge pull request #1740 from filecoin-project/feat/bootstrapper-profile
add profile for bootstrappers
2020-05-14 18:35:38 +02:00
Travis Person aafa00abe4 Testnet Phase 2 network info 2020-05-14 16:29:17 +00:00
Jeromy d3eb808ff4 add profile for bootstrappers 2020-05-14 09:27:07 -07:00
Łukasz Magiera d009b70171 Merge pull request #1727 from filecoin-project/fix/init-sector-size
properly handle parsing of miner init sector sizes
2020-05-14 12:37:47 +02:00
Whyrusleeping d358da43f7 Merge pull request #1731 from filecoin-project/asr/docs
Documentation updates and fixes
2020-05-13 21:32:10 -07:00
Whyrusleeping 6cfc7e3fa0 Merge pull request #1737 from filecoin-project/feat/cleanup-verify
some minor cleanup of data verification for preseals
2020-05-13 21:14:00 -07:00
Jeromy b5cb1fe1e0 some minor cleanup of data verification for preseals 2020-05-13 21:00:32 -07:00
Whyrusleeping 17dace9086 Merge pull request #1735 from filecoin-project/feat/verify-bootstrappers-data
Verify data for presealed data
2020-05-13 20:51:43 -07:00
Jeromy 50fae56baf Verify data for presealed data 2020-05-13 19:35:44 -07:00
Łukasz Magiera 42269e17cc Merge pull request #1733 from filecoin-project/feat/set-verifreg-root-key
set verifreg root key
2020-05-14 02:06:35 +02:00
Jeromy a9689d8345 set verifreg root key 2020-05-13 17:04:08 -07:00
Łukasz Magiera 32dad4d43b Merge pull request #1730 from filecoin-project/fix/events-api-revert-issue-1723
events: Fix revert+apply of msg execution, but not the message
2020-05-14 01:48:47 +02:00
Łukasz Magiera a88700bef4 Merge pull request #1732 from filecoin-project/fix/cleanup-makeout-chan
clean up output channel handling logic to prevent send on closed chan
2020-05-14 01:39:24 +02:00
Jeromy 8d85aedeff clean up output channel handling logic to prevent send on closed channels 2020-05-13 16:31:17 -07:00
Aayush Rajasekaran 744ae23c2c Documentation updates and fixes 2020-05-13 19:19:33 -04:00
Łukasz Magiera 4e13d284b7 events: Fix revert+apply of msg execution, but not the message 2020-05-14 00:48:36 +02:00
Łukasz Magiera 0533cf22e7 Merge pull request #1729 from filecoin-project/feat/disable-lotus-daemon-gpu
disable gpu usage for lotus daemon
2020-05-13 23:24:06 +02:00
Jeromy 17e969bc4a disable gpu usage for lotus daemon 2020-05-13 14:22:05 -07:00
Jakub Sztandera 8b0c0a9439 Merge pull request #1717 from filecoin-project/feat/archive-script
Add archive script
2020-05-13 23:03:15 +02:00
Jakub Sztandera 7d2462ce6b Switch to filecoin-project/lotus-archived
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-13 22:30:18 +02:00
Jeromy e34b20b839 fix nondeterminism 2020-05-13 13:21:46 -07:00
Jeromy 363f575e6c properly handle parsing of miner init sector sizes 2020-05-13 13:12:13 -07:00
Łukasz Magiera 2f272d2703 Merge pull request #1726 from filecoin-project/deps/sectorstorage-4051533c
Update sector-storage
2020-05-13 21:12:48 +02:00
Łukasz Magiera 9a21b75c66 Update sector-storage 2020-05-13 21:12:15 +02:00
hannahhoward bbd2fbc434 test(events): add test to demo issue 2020-05-13 12:10:56 -07:00
Łukasz Magiera b3fc18c988 Merge pull request #1721 from filecoin-project/feat/cli-help-ux
cli: Improve lotus helptext
2020-05-13 20:41:26 +02:00
Łukasz Magiera 4a8e45a88c Merge pull request #1722 from filecoin-project/fix/no-sector-proving-info
cli: fix proving info with no sectors
2020-05-13 20:41:14 +02:00
Łukasz Magiera e12e2b4e4e cli: fix proving info with no sectors 2020-05-13 19:58:49 +02:00
Łukasz Magiera 40972762df Merge pull request #1724 from filecoin-project/feat/wait-msg-cli-nice
make the wait-msg cli print out pretty printed return values
2020-05-13 19:57:14 +02:00
Jeromy 4f624465c2 make the wait-msg cli print out pretty printed return values 2020-05-13 10:53:02 -07:00
Łukasz Magiera 41c019b3d2 cli: Improve lotus helptext 2020-05-13 13:08:59 +02:00
Whyrusleeping ea6121a951 Merge pull request #1720 from filecoin-project/fix/check-gas-limits
check gas limits on messages more places
2020-05-12 22:43:31 -07:00
Jeromy 1d8c8b9a8e check gas limits on messages more places 2020-05-12 22:36:43 -07:00
Whyrusleeping 41ee20013e Merge pull request #1719 from filecoin-project/deps/specs-actors-0.5.2
update to specs actors 0.5.2
2020-05-12 21:09:15 -07:00
Jeromy 01192105b1 update to specs actors 0.5.2 2020-05-12 20:42:53 -07:00
Łukasz Magiera 29a8259b2a Merge pull request #1716 from filecoin-project/feat/msg-gas-limit
sync: enforce message gas limits
2020-05-13 04:32:01 +02:00
Jakub Sztandera 427cb1b14d Cleanup, fix shellcheck warning
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-13 04:21:00 +02:00
Jakub Sztandera 27fd150491 Adapt script for different org
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-13 04:19:14 +02:00
Jakub Sztandera c2acfb5c31 Add archive script
Add script for archiving branches outside of the main repo.
The branches will end up here: https://github.com/Kubuxu/lotus-archived

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-13 04:14:01 +02:00
Jakub Sztandera c642dce97f Merge pull request #1715 from filecoin-project/ci/lint-from-master
ci: lint-changes based on master
2020-05-13 03:48:33 +02:00
Łukasz Magiera 4c64f0ca11 sync: enforce message gas limits 2020-05-13 03:36:56 +02:00
Łukasz Magiera 29b592f62f ci: lint-changes based on master 2020-05-13 02:11:16 +02:00
Whyrusleeping d124d10f7c Merge pull request #1711 from filecoin-project/testnet/3-cleaned
Interop Staging - Cleaned
2020-05-12 17:04:10 -07:00
Whyrusleeping b857c8f9ba Merge pull request #1714 from filecoin-project/asr/specsupdate
Update specs-actors, re-enable full chain validation
2020-05-12 17:03:50 -07:00
Aayush Rajasekaran aec168e05f Update specs-actors, re-enable full chain validation 2020-05-12 19:52:33 -04:00
Whyrusleeping 686c92ba02 Merge pull request #1713 from filecoin-project/feat/hack-reward-initial-value
hack in an initial value for LastPerEpochReward for the genesis block
2020-05-12 16:39:48 -07:00
Jeromy 141c77e17e hack in an initial value for LastPerEpochReward for the genesis block 2020-05-12 16:32:54 -07:00
Whyrusleeping 3c673f0086 Merge pull request #1712 from filecoin-project/frrist/fix-broken-stuff
construct cron actor state correctly
2020-05-12 16:27:17 -07:00
frrist 5726c4bd30 construct cron actor state correctly 2020-05-12 16:12:28 -07:00
Jakub Sztandera 12e373fd43 Sign cleaned testnet/3
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-05-13 00:18:52 +02:00
Łukasz Magiera e3e86ec983 Merge pull request #1710 from filecoin-project/feat/bitfield-decode-shed
add method to decode and print all bitfield entries to lotus shed
2020-05-12 23:35:42 +02:00
Jeromy 3a3e390e90 add method to decode and print all bitfield entries to lotus shed 2020-05-12 14:22:21 -07:00
Łukasz Magiera b462d7eb0b Merge pull request #1709 from filecoin-project/docs/sealworker-updates
docs: Seal-worker updates
2020-05-12 22:06:54 +02:00
Łukasz Magiera 8b326c9dfe Merge pull request #1706 from filecoin-project/feat/specs-actors-v0.5
Update specs-actors to v0.5
2020-05-12 22:06:34 +02:00
Łukasz Magiera 150346ae51 docs: document some mining-related env vars 2020-05-12 22:05:55 +02:00
Łukasz Magiera ed67e4c5a9 docs: seal-worker updates 2020-05-12 21:09:40 +02:00
Łukasz Magiera dcd42eec11 Update sector-storage 2020-05-12 20:33:46 +02:00
Łukasz Magiera 6447198e0e Merge remote-tracking branch 'origin/testnet/3' into feat/specs-actors-v0.5 2020-05-12 20:25:53 +02:00
Łukasz Magiera 3003bb5731 Merge pull request #1707 from filecoin-project/feat/update-ffi
Update FFI
2020-05-12 20:24:45 +02:00
Łukasz Magiera d7b8cc6ef9 mod tidy 2020-05-12 20:23:10 +02:00
Łukasz Magiera 9597e4c501 Merge pull request #1675 from filecoin-project/frrist/puppet-actor
update chain-validation and add puppet actor
2020-05-12 20:20:00 +02:00
Łukasz Magiera f7314646ec Update FFI 2020-05-12 20:18:58 +02:00
Aayush Rajasekaran 46fb5f8602 update CV, skip nested sends test 2020-05-12 14:14:00 -04:00
Łukasz Magiera ba389598ee Cleanup build package 2020-05-12 19:59:28 +02:00
Łukasz Magiera e8d92a5f31 node: Use correct network name for DHT 2020-05-12 19:38:04 +02:00
Łukasz Magiera 741cfb7f00 Merge branch 'feat/specs-actors-v0.5' into frrist/puppet-actor 2020-05-12 19:04:04 +02:00
Łukasz Magiera 6056a52978 Update specs-actors to pre v0.5 2020-05-12 18:58:43 +02:00
Łukasz Magiera 4ea021d151 Merge pull request #1701 from filecoin-project/asr/syncvalidity
Message validation changes
2020-05-12 13:48:33 +02:00
Łukasz Magiera 6712560779 fix import ordering 2020-05-12 13:48:09 +02:00
Aayush Rajasekaran 6bf2dcd97c Message validation changes 2020-05-11 21:54:44 -04:00
Łukasz Magiera d3a99456ae Merge pull request #1702 from filecoin-project/feat/update-markets-0.2.3
Update markets 0.2.3
2020-05-12 01:55:51 +02:00
hannahhoward ecd180ecf4 feat(deps): update markets 0.2.3 2020-05-11 16:33:30 -07:00
Whyrusleeping cab07f61c5 Merge pull request #1697 from filecoin-project/feat/64g
Updates for 64G sectors
2020-05-11 15:17:26 -07:00
Łukasz Magiera ec83b9cf7c Fix tests post specs-actors update 2020-05-11 23:26:33 +02:00
Łukasz Magiera 0704ac4636 Merge remote-tracking branch 'origin/testnet/3' into feat/64g 2020-05-11 22:36:52 +02:00
Łukasz Magiera 6002e359ae Updates for 64G sectors 2020-05-11 22:24:42 +02:00
frrist 9a1d8cecfe update chain-validation
- has nested send puppet test
2020-05-11 12:57:23 -07:00
frrist f73366630f add puppet actor to vm invoker in driver 2020-05-11 11:48:55 -07:00
Whyrusleeping 728ae01012 Merge pull request #1665 from aagdere/aa/Add-Msig-Send-RPC
Added RPC calls for MsigCreate, MsigPropose, MsigApprove, and MsigCancel
2020-05-11 10:58:10 -07:00
Whyrusleeping 6c2c33db56 Merge pull request #1696 from filecoin-project/feat/update-markets-0.2.1
Update to fil-markets 0.2.1
2020-05-11 09:31:25 -07:00
Aris e7065df2d4 Added RPC calls for MsigCreate, MsigPropose, MsigApprove, and MsigCancel 2020-05-11 10:27:48 -04:00
hannahhoward fc2d61a55b fix(deps): update markets v0.2.2 2020-05-08 22:06:11 -07:00
hannahhoward 581e7e6fde chore(deps): update to fil-markets 0.2.1
Update fil-markets to 0.2.1 that no longer keeps streams open
2020-05-08 14:11:40 -07:00
Łukasz Magiera 66d67f66a7 Merge pull request #1685 from filecoin-project/feat/v26
v26 proofs
2020-05-08 22:14:41 +02:00
Łukasz Magiera 85dc2eb36f Merge pull request #1672 from filecoin-project/feat/bisect-errors
Some chain-bisect improvements / fixes
2020-05-08 22:14:19 +02:00
Łukasz Magiera 4cd861eb87 chain bisect: json-marshar the correct thing 2020-05-08 21:55:26 +02:00
Łukasz Magiera 7747c3eb40 Update sector-storage 2020-05-08 21:28:14 +02:00
Łukasz Magiera 00c107548e ffi: use v26 master 2020-05-08 20:36:32 +02:00
Łukasz Magiera e4cb28a310 Merge pull request #1694 from filecoin-project/fix/nil-protections
add some simple sanity checking to incoming blocks in the syncer
2020-05-08 20:26:50 +02:00
Jeromy da73b62074 that doesnt belong there, really 2020-05-08 11:18:01 -07:00
Jeromy d415aa779c also check bls aggregate signature nilness 2020-05-08 11:07:57 -07:00
Jeromy f8c15e2d2d more checks in sync 2020-05-08 11:06:47 -07:00
Łukasz Magiera b74e487af2 Merge pull request #1692 from filecoin-project/bugs/events-called-null-tipset
events: Fix called with confidence on null round
2020-05-08 20:00:41 +02:00
Jeromy 8a69467982 add some simple sanity checking to incoming blocks in the syncer 2020-05-08 10:59:18 -07:00
Łukasz Magiera 1ade0e7b92 events: Fix called with confidence on null round 2020-05-08 10:31:23 +02:00
hannahhoward e5a0252126 test(events): add test to repo issue
Add a test that shows that the called function is never hit above confidence if the scheduled
trigger is at a null tipset
2020-05-07 22:07:23 -07:00
Łukasz Magiera c36bfb36e5 Update sector-storage 2020-05-08 02:12:54 +02:00
Łukasz Magiera fbfab94114 bench: Fix unseal 2020-05-08 01:44:12 +02:00
Łukasz Magiera b23cef8d1e Merge pull request #1684 from filecoin-project/asr/chainval
Update and re-enable chain-validation
2020-05-07 17:31:56 +02:00
Łukasz Magiera 85240c938e Merge pull request #1687 from filecoin-project/feat/min-miner-2g
set minimum miner size to 2g
2020-05-07 17:30:41 +02:00
Łukasz Magiera 27c4cd6360 Merge pull request #1689 from filecoin-project/feat/lotus-shed-param-fetch
Add param fetch to lotus-shed
2020-05-07 17:30:01 +02:00
Łukasz Magiera 5d1b9f854e Merge pull request #1688 from filecoin-project/feat/https-facuet-setup-script
Use https for facuet on interop join script
2020-05-07 17:28:26 +02:00
Travis Person 14bbbe4feb Add param fetch to lotus-shed 2020-05-07 05:20:17 +00:00
Travis Person 34deb5e194 Use https for facuet on interop join script 2020-05-07 05:19:09 +00:00
Jeromy 0f75cb4dfd set minimum miner size to 2g 2020-05-06 22:05:43 -07:00
Aayush Rajasekaran dd79c66d41 Update and re-enable chain-validation 2020-05-06 21:44:09 -04:00
Łukasz Magiera 75642f393d v26 2020-05-07 01:22:59 +02:00
Whyrusleeping 97130684a2 Merge pull request #1680 from filecoin-project/deps/faster-publish-deals
update to specs-actors code with faster publish deals
2020-05-06 14:45:17 -07:00
Aayush Rajasekaran 981b449a3d Merge pull request #1683 from filecoin-project/asr/vmfix
Bugfix: Correctly transfer gas when failing to charge for retValue
2020-05-06 17:06:07 -04:00
Aayush Rajasekaran 187e386740 Bugfix: Correctly transfer gas when failing to charge for retValue 2020-05-06 16:53:32 -04:00
Jeromy b76e229f8e upgrade to v0.4.0 specs actors 2020-05-06 10:47:10 -07:00
Jeromy fa59cdc2ad update to specs-actors code with faster publish deals 2020-05-05 17:06:32 -07:00
Łukasz Magiera 523a7a9d8d Merge pull request #1670 from filecoin-project/feat/update-markets-0.2.0
Update go-fil-markets
2020-05-06 01:45:33 +02:00
Whyrusleeping 51142f45c3 Merge pull request #1678 from filecoin-project/asr/verifysig
The VerifySig syscall should verify sigs
2020-05-05 15:00:58 -07:00
Whyrusleeping 5a7fdfe3ed Merge pull request #1679 from filecoin-project/feat/collab-cluster-paramfetch
fetch groth parameters from proofs.filecoin.io
2020-05-05 15:00:43 -07:00
hannahhoward ed117719aa fix(deps): update to tagged go-fil-markets 2020-05-05 14:44:03 -07:00
Jeromy 66cafc7c71 fake signatures when constructing genesis state 2020-05-05 14:36:39 -07:00
ognots 397efddbc6 fetch groth parameters from proofs.filecoin.io
proof parameters are no longer pinned to IPFS public gateways, but on collab IPFS Cluster instead
change default gateway url to proofs.filecoin.io
2020-05-05 17:27:44 -04:00
Whyrusleeping 749db0bf45 Merge pull request #1677 from terichadbourne/patch-1
Add link to new conceptual docs site
2020-05-05 13:28:25 -07:00
Łukasz Magiera 60b78a74f7 Merge pull request #1676 from filecoin-project/cleanup/multi-addr-miner
block producers should have only one address
2020-05-05 22:12:32 +02:00
Teri Chadbourne 31c14dc908 Add link to new conceptual docs site 2020-05-05 16:00:24 -04:00
Jeromy 368fff246b replace outdated comment 2020-05-05 12:39:43 -07:00
Aayush Rajasekaran 8a9862bdb4 The VerifySig syscall should verify sigs 2020-05-05 15:26:34 -04:00
Jeromy 8b58f22c2e block producers should have only one address 2020-05-05 12:01:44 -07:00
Whyrusleeping 25c10e4b36 Merge pull request #1674 from filecoin-project/feat/update-pubsub
update go-libp2p-pubsub
2020-05-05 11:38:26 -07:00
vyzo 486fda17a2 gomod: update go-libp2p-pubsub@master 2020-05-05 21:12:16 +03:00
Whyrusleeping 1cd932fedd Merge pull request #1661 from filecoin-project/feat/better-pubsub-integration
Improved pubsub integration
2020-05-05 10:41:51 -07:00
Łukasz Magiera 50291408c7 Merge pull request #1673 from filecoin-project/fix/lookback-tipset
add flag to choose what to do when looking back tipsets in null rounds
2020-05-05 19:10:18 +02:00
Jeromy 74510adaaa add flag to choose what to do when looking back tipsets in null rounds 2020-05-05 10:06:05 -07:00
Łukasz Magiera 479a456279 chain bisect: Improve errors 2020-05-05 18:18:52 +02:00
vyzo eb24baa70c use go-libp2p-core/peer instead of the deprecated alias, try to pacify the silly linter 2020-05-05 17:26:59 +03:00
vyzo 4e5179557d flag block source when messages cannot be retrieved 2020-05-05 16:49:43 +03:00
vyzo 5824714cdc use extended validator interface 2020-05-05 16:35:03 +03:00
hannahhoward a9866c757e feat(deps): update go-fil-markets
Update to latest 0.2.0 release of go-fil-markets with less-blocking node io
2020-05-04 18:36:51 -07:00
Aayush Rajasekaran 299a017ef5 Merge pull request #1668 from filecoin-project/feat/actor-create-exit
dont override exit codes for actor creation failure
2020-05-04 19:41:38 -04:00
Jeromy a553d438c0 dont override exit codes for actor creation failure 2020-05-04 16:31:26 -07:00
Łukasz Magiera f865ae9f10 Merge pull request #1667 from filecoin-project/deps/update-cbor-gen
update to latest cbor-gen
2020-05-05 00:39:31 +02:00
Jeromy 1bd88b24d4 upgrade go-address 2020-05-04 15:23:07 -07:00
Jeromy d7af5c67e9 update to latest cbor-gen 2020-05-04 15:19:48 -07:00
Whyrusleeping ecd85c3b02 Merge pull request #1666 from unknow16/patch-1
fix: content bug
2020-05-04 13:16:55 -07:00
unknow16 4a68d02a4e fix: content bug 2020-05-05 03:58:54 +08:00
Whyrusleeping cf2e8b2cab Merge pull request #1664 from filecoin-project/fix/graphsync-field-indexes
block header changed, updating field indexes to match
2020-05-04 12:19:44 -07:00
Jeromy da72dfae3d block header changed, updating field indexes to match 2020-05-04 12:09:39 -07:00
Łukasz Magiera 80f7492d06 Merge pull request #1663 from filecoin-project/feat/compute-state-hashlinks
compute-state: html: Hash links to invocations
2020-05-04 20:52:01 +02:00
Łukasz Magiera 65752a9cc4 compute-state: html: Hash links to invocations 2020-05-04 20:30:27 +02:00
Łukasz Magiera f7e6e45442 Merge pull request #1662 from filecoin-project/feat/compute-state-html
compute-state: Add html output option
2020-05-04 20:21:04 +02:00
Łukasz Magiera 8770cf2f4b compute-state: html: Show top-level message CID 2020-05-04 20:19:01 +02:00
Łukasz Magiera 51f92b6ed0 mod tidy 2020-05-04 20:13:43 +02:00
Łukasz Magiera 2e0a3fca1a compute-state: decode returns/params 2020-05-04 20:12:58 +02:00
Łukasz Magiera 4f959adbc8 compute-state: html: Print invocation duration 2020-05-04 19:19:23 +02:00
Łukasz Magiera de701a06de compute-state: html: decode code / method names 2020-05-04 18:48:50 +02:00
vyzo e3f6e586ee use blake2b hash as the message ID function 2020-05-04 19:34:30 +03:00
vyzo 1b6f6b295b gomod: update go-libp2p-pubsub@master 2020-05-04 19:07:49 +03:00
Łukasz Magiera 2a2b63086a compute-state: Add html output option 2020-05-04 18:07:43 +02:00
vyzo 805d07bca6 turn off the mesh in bootstrappers 2020-05-04 19:04:24 +03:00
vyzo 112aca7896 pubsub-specific configuration 2020-05-04 18:30:54 +03:00
vyzo cfcf946556 gomod: update go-libp2p-pubsub@master 2020-05-04 18:13:54 +03:00
Aayush Rajasekaran c649fbf43b Merge pull request #1659 from filecoin-project/asr/hash
Use blake2b, instead of sha256, for ticket creation and verification
2020-05-02 12:26:39 -04:00
Aayush Rajasekaran c196570dd8 Use blake2b, instead of sha256, for ticket creation and verification 2020-05-01 22:43:36 -04:00
Whyrusleeping 63bc34a1a0 Merge pull request #1658 from filecoin-project/fix/winning-post-rand-epoch
winning post wants the actual epoch of the block, not the previous
2020-05-01 15:05:18 -07:00
Łukasz Magiera 584a4aba4c Merge pull request #1657 from filecoin-project/fix/worker-disconnect
workers: Handle disconnecting workers more gracefully
2020-05-01 23:10:52 +02:00
Łukasz Magiera 35b1963eeb gofmt 2020-05-01 21:51:31 +02:00
Łukasz Magiera 4014cbdb44 jsonrpc: Correctly cancel server-side contexts on lost connection 2020-05-01 21:50:34 +02:00
Jeromy be2a357102 winning post wants the actual epoch of the block, not the previous 2020-05-01 12:42:59 -07:00
Łukasz Magiera 971282a9a5 jsonrpc: Test hanging ctx on unclean disconnect 2020-05-01 21:30:32 +02:00
Łukasz Magiera f9be73c73e storageminer: Fix 'storage list' with disconnected storage 2020-05-01 20:43:39 +02:00
Łukasz Magiera c616e5e14e Merge remote-tracking branch 'origin/testnet/3' into fix/worker-disconnect 2020-05-01 20:33:11 +02:00
Łukasz Magiera bc1fa74d0c Merge pull request #1656 from filecoin-project/feat/sminer-cli-ux
storageminer: Improve CLI UX
2020-05-01 20:32:02 +02:00
Łukasz Magiera 9f2df68906 workers: handle disconnecting workers more gracefully 2020-05-01 20:15:06 +02:00
Łukasz Magiera 6077edb3d0 jsonrpc: Test channel closing on when connection drops 2020-05-01 16:52:05 +02:00
Łukasz Magiera d9acd484c0 storageminer: Improve CLI UX 2020-05-01 14:06:19 +02:00
Whyrusleeping b535a801bc Merge pull request #1654 from filecoin-project/asr/dealstest
Update HAMT and cbor, test to demonstrate HAMT issue
2020-04-30 19:28:00 -07:00
Aayush Rajasekaran d096c75c6e Update HAMT and cbor gen 2020-04-30 22:08:47 -04:00
Aayush Rajasekaran 897b269139 Test to demonstrate HAMT issue 2020-04-30 20:54:41 -04:00
Łukasz Magiera a6bb8ec688 Merge pull request #1652 from filecoin-project/feat/real-winpost-test
Test real winning post mining
2020-05-01 00:36:41 +02:00
Łukasz Magiera 72c27a9f73 Test real winning post mining 2020-05-01 00:31:58 +02:00
Łukasz Magiera 2e1441cde7 Merge pull request #1651 from filecoin-project/fix/randomness-for-mining-base
fix mining base randomness
2020-05-01 00:16:25 +02:00
Whyrusleeping 414dd9f74e Merge pull request #1650 from filecoin-project/feat/ldflags
Handle LDFLAGS
2020-04-30 15:11:52 -07:00
Jeromy bee25d221f fix mining base randomness 2020-04-30 15:11:14 -07:00
Jakub Sztandera 75076ba422 Update
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-30 23:24:51 +02:00
Jakub Sztandera de8499a69b Handle system LDFLAGS
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-30 23:20:26 +02:00
Łukasz Magiera 4d51f9f700 Merge pull request #1647 from filecoin-project/feat/this-weeks-randomness-changes-2
fix winning post inputs
2020-04-30 22:30:40 +02:00
Whyrusleeping 15847756cc Merge pull request #1646 from filecoin-project/asr/hamt
Update hamt
2020-04-30 13:22:03 -07:00
Jeromy c4852e04c9 Use miner address in randomness mixing 2020-04-30 13:21:46 -07:00
Aayush Rajasekaran 441734647d Update hamt 2020-04-30 16:11:23 -04:00
Łukasz Magiera 847a916cd7 Merge pull request #1626 from filecoin-project/feat/storage-better-fetch
Update sector-storage with better fetch logic
2020-04-30 22:00:50 +02:00
Łukasz Magiera a1a2bf1a0e Merge pull request #1643 from filecoin-project/asr/createactor
some create actor changes
2020-04-30 21:34:28 +02:00
Łukasz Magiera ed500dbbdf Merge remote-tracking branch 'origin/testnet/3' into asr/createactor 2020-04-30 21:29:04 +02:00
Łukasz Magiera 02c936c2ff Merge pull request #1649 from filecoin-project/fix/drand-peer-rotation
fix race condition, 'thundering herd'-like issue, and add logging
2020-04-30 21:22:17 +02:00
Jeromy 6caf725e14 fix race condition, 'thundering herd'-like issue, and add logging 2020-04-30 11:58:21 -07:00
Łukasz Magiera 5026091623 Merge remote-tracking branch 'origin/testnet/3' into feat/storage-better-fetch 2020-04-30 20:56:52 +02:00
Łukasz Magiera 6d1914ce43 Merge pull request #1645 from filecoin-project/feat/client-deal-start-epoch
Add flag to specify deal start epoch
2020-04-30 20:47:52 +02:00
Whyrusleeping f18f6bb994 Merge pull request #1642 from filecoin-project/deps/update-drand
Update drand to v0.8.1
2020-04-30 11:47:26 -07:00
Łukasz Magiera a1bb005b7c Merge pull request #1648 from filecoin-project/asr/fatal
Elevate an actor construction fail-case to fatal
2020-04-30 20:44:54 +02:00
Jeromy 931a862abc remove usage of previous round in beacon entries 2020-04-30 11:39:37 -07:00
Jeromy 4b3cc2ca7e fix winning post inputs 2020-04-30 11:27:22 -07:00
Aayush Rajasekaran 6cd3e7f7cb Update chain validation 2020-04-30 14:21:36 -04:00
Aayush Rajasekaran a047e158ed Add some validity checks to runtime.CreateActor() 2020-04-30 14:21:29 -04:00
Aayush Rajasekaran bd1ac4d91b Only charge for actor creation after making a meaningful state change 2020-04-30 14:18:26 -04:00
Travis Person 59dcbe93a4 Update drand to v0.8.1 2020-04-30 11:07:00 -07:00
Jeromy e345525672 Add flag to specify deal start epoch 2020-04-30 10:51:08 -07:00
Aayush Rajasekaran d9a1d912fd Elevate an actor construction fail-case to fatal 2020-04-30 13:46:33 -04:00
Whyrusleeping d7d2b12a32 Merge pull request #1635 from filecoin-project/feat/gossipsub-v1.1
Initial Gossipsub v1.1 integration
2020-04-30 10:43:18 -07:00
Whyrusleeping f16ae9dffb Merge pull request #1638 from filecoin-project/frrist/fix-lack-gas-retval
fix: insufficient gas remaining to cover retval
2020-04-30 10:20:17 -07:00
Whyrusleeping ae420fc9f4 Merge branch 'testnet/3' into feat/gossipsub-v1.1 2020-04-30 10:19:42 -07:00
Łukasz Magiera f6c4c2b72e Merge pull request #1641 from filecoin-project/feat/ipfsclient
Support making deals with data directly from IPFS nodes
2020-04-30 13:40:41 +02:00
Łukasz Magiera a0bdf95845 ipfsclient: Add some docs 2020-04-30 13:21:51 +02:00
Łukasz Magiera 0d4bf2e980 Merge branch 'testnet/3' into feat/ipfsclient 2020-04-30 13:09:47 +02:00
Łukasz Magiera be439d3b13 Merge remote-tracking branch 'origin/master' into testnet/3 2020-04-30 13:03:08 +02:00
Łukasz Magiera 81e3b714a2 gofmt 2020-04-30 12:51:19 +02:00
Łukasz Magiera e2b0e00547 Merge pull request #1644 from filecoin-project/feat/new-drand
New drand network
2020-04-30 11:47:47 +02:00
Travis Person a29f19e482 New drand network 2020-04-30 04:55:53 +00:00
Łukasz Magiera fce2ec0470 Merge pull request #1639 from filecoin-project/feat/this-weeks-randomness-changes
implement latest changes to randomness
2020-04-30 02:08:52 +02:00
Łukasz Magiera 5ec76d4b7b support making deals with data directly from IPFS nodes 2020-04-30 01:56:45 +02:00
Jeromy d73b369fa5 implement latest changes to randomness 2020-04-29 16:50:45 -07:00
frrist c66415ae4c fix: insufficient gas remaining to cover retval
proceed as in the case of method execution failure.
2020-04-29 16:38:34 -07:00
Whyrusleeping 639b800505 Merge pull request #1640 from filecoin-project/asr/misc
update chain validation to point to commit in master
2020-04-29 16:14:01 -07:00
Aayush Rajasekaran 35fcf04d3d update chain validation to point to commit in master 2020-04-29 19:05:18 -04:00
Łukasz Magiera e4bb94e939 Merge pull request #1637 from filecoin-project/feat/mpool-stat-local
mpool cli: --local flag
2020-04-30 00:39:34 +02:00
vyzo 43aca717d1 gossipsubv1.1: tweak score parameters 2020-04-29 23:15:29 +03:00
Łukasz Magiera cb5e5a1325 mpool cli: --local flag 2020-04-29 21:52:04 +02:00
vyzo 7de882b4d0 gossipsubv1.1: use score parameter helpers 2020-04-29 22:50:51 +03:00
vyzo 426bd4cfed gomod: update go-libp2p-pubsub 2020-04-29 22:49:24 +03:00
Łukasz Magiera 1e38e02456 Merge pull request #1636 from filecoin-project/feat/specs-actors-v0.3
specs-actors v0.3
2020-04-29 20:16:26 +02:00
Łukasz Magiera 89b19af43f specs-actors v0.3 2020-04-29 20:06:05 +02:00
Łukasz Magiera ba12b9ac3f Update sector-storage with scheduling improvements 2020-04-29 18:03:59 +02:00
vyzo f8f6e28985 fix linter complaint 2020-04-29 19:01:45 +03:00
vyzo 9570ebfe0a fix comparison logic for bootstrap peers 2020-04-29 18:56:58 +03:00
vyzo 667fb17b43 gossipsubv1.1: configure larger overlay D params 2020-04-29 17:09:39 +03:00
vyzo 7d7c83ef79 gossipsubv1.1: configure scores for bootstrapper PX 2020-04-29 17:03:41 +03:00
vyzo 6b56652768 gossipsubv1.1: score parameters and flood publishing 2020-04-29 16:41:44 +03:00
vyzo c7939ff580 gomod: use go-libp2p-pubsub@master 2020-04-29 14:40:01 +03:00
Łukasz Magiera 068e9a29d2 Merge remote-tracking branch 'origin/testnet/3' into feat/storage-better-fetch 2020-04-29 13:27:49 +02:00
Łukasz Magiera 014092443f Merge pull request #1619 from filecoin-project/feat/message-version-field
add version field to message type
2020-04-29 02:51:52 +02:00
Aayush Rajasekaran cf8691ed87 update chain validation 2020-04-28 20:31:41 -04:00
Jeromy eb4f4675a5 add version field to message type 2020-04-28 19:12:52 -04:00
Łukasz Magiera 41d925ab8a Merge pull request #1630 from filecoin-project/asr/misc
Minor / irrelevant improvements go here
2020-04-29 00:21:45 +02:00
Łukasz Magiera 2ead8c089e Merge pull request #1631 from filecoin-project/feat/on-chain-deal-states
add on-chain deal information to client list-deals output
2020-04-29 00:21:01 +02:00
Łukasz Magiera 1b0c0e10c6 Merge pull request #1632 from filecoin-project/feat/use-other-drand-server
use other drand server for now
2020-04-29 00:12:50 +02:00
Jeromy f186e1a4f7 use other drand server for now 2020-04-28 15:10:12 -07:00
Łukasz Magiera fb1788a3e9 Merge pull request #1621 from filecoin-project/feat/devnet-script
add script to run a local devnet, and helper command
2020-04-28 22:59:29 +02:00
Łukasz Magiera ac6573cca7 Merge pull request #1629 from filecoin-project/deps/update-specs-actors
WIP: updating to specs actors v0.2.0
2020-04-28 22:56:47 +02:00
Jeromy 6a27c65201 updating to specs actors v0.2.0 2020-04-28 13:52:07 -07:00
Łukasz Magiera 5c6cf8b619 Merge pull request #1625 from filecoin-project/feat/shed-bitfields
shed: Add some bitfield tools
2020-04-28 22:01:34 +02:00
Łukasz Magiera 6014530145 shed bitfield: use Count to check for overflows 2020-04-28 21:36:58 +02:00
laser 160bc0676f add on-chain deal information to client list-deals output 2020-04-28 11:37:20 -07:00
Whyrusleeping cd5cbcfe4f Merge pull request #1627 from filecoin-project/fix/safe-actor-serialization
vm: Don't treat actor state serialization errors as fatal
2020-04-28 10:50:53 -07:00
Aayush Rajasekaran ae47bc15ff Remove / rename fallback post stuff 2020-04-28 13:39:35 -04:00
Jeromy 33076d5b43 fix replace directive 2020-04-28 10:35:07 -07:00
Łukasz Magiera 9dcb42328e gofmt 2020-04-28 19:27:13 +02:00
Whyrusleeping 3ec736bc04 Merge pull request #1623 from filecoin-project/asr/validate
caller must be validated exactly once
2020-04-28 09:06:28 -07:00
Łukasz Magiera c760a88c22 vm: don't treat actor state serialization errors as fatal 2020-04-28 15:21:31 +02:00
Łukasz Magiera 8d35aacd31 Update sector-storage with better fetch logic 2020-04-28 14:57:53 +02:00
Łukasz Magiera 4579e9bb84 shed: add some bitfield tools 2020-04-28 10:44:10 +02:00
Aayush Rajasekaran 5900d765fd caller must be validated exactly once 2020-04-28 00:07:47 -04:00
Whyrusleeping e65d293ba4 Merge pull request #1607 from filecoin-project/feat/chainwatch-updates
chainwatch: Record drand entries
2020-04-27 16:23:47 -07:00
Whyrusleeping b2dda08368 respect shutdown signals when sleeping in miner code (#1617) 2020-04-27 15:54:41 -07:00
Travis PersonandTravis Person c807469a5a bitswap: disable provider (#1620)
Co-authored-by: Travis Person <travisperson@users.noreply.github.com>
2020-04-27 15:54:16 -07:00
Jeromy bfa93bb933 add script to run a local devnet, and helper command 2020-04-27 15:26:46 -07:00
Travis PersonandTravis Person d3796abac7 Quick setup script (#1352)
* Quick setup script

* Auto noncefix and properly record stderr of miner

* Use new pledge sector command

* Build native ffi

* Add PreCommit1 and PreCommit2

* Move into scripts dir

Co-authored-by: Travis Person <travisperson@users.noreply.github.com>
2020-04-27 12:52:55 -07:00
Jakub Sztandera bd3a43a367 Remove old cached params (#1618)
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-27 11:06:56 -07:00
ldoublewood b7c6cc5321 fix wrong special id (#1615) 2020-04-27 10:26:28 -07:00
Łukasz Magiera 939d7a7a0b Merge pull request #1606 from filecoin-project/asr/internal
Remove SysErrInternal, some interop / spec changes
2020-04-27 13:02:11 +02:00
Łukasz Magiera 33a419fbdb Merge pull request #1609 from filecoin-project/asr/misc
Fixes to multisig functionality in CLI
2020-04-27 12:54:06 +02:00
Aayush Rajasekaran fa1b559b2c CLI: multisig approve needs to recreate proposal hash 2020-04-26 19:47:18 -04:00
Aayush Rajasekaran e46c4652a5 Forbid internal message in State Transaction() 2020-04-25 02:01:26 -04:00
Aayush Rajasekaran 832657edfb Eliminate use of SysErrInternal, some interop changes 2020-04-25 01:55:59 -04:00
Aayush Rajasekaran c3b1cf19a4 Actually use the multisig source flag 2020-04-25 01:55:10 -04:00
Aayush Rajasekaran 1565e10fff Allow users to specify sender when creating multisigs 2020-04-25 01:55:10 -04:00
Łukasz Magiera e38484a109 Merge remote-tracking branch 'origin/testnet/3' into feat/chainwatch-updates 2020-04-25 00:27:59 +02:00
Łukasz Magiera 0522af155d chainwatch: Record drand entries 2020-04-25 00:25:33 +02:00
Łukasz Magiera 1947f26cdb Update specs-actors 2020-04-25 00:25:03 +02:00
Frrist 0f0589bcf5 Update validation driver to match latest in chain-validation (#1532)
* update driver to match new chain-validation interfaces

* update chain-validation

* update filecoin-ffi

* gofmt

* update chain-validation again
2020-04-24 15:08:16 -07:00
Łukasz Magiera e8e2b3a6f9 Merge pull request #1597 from filecoin-project/asr/misc
Various improvements to deal workflow
2020-04-24 23:07:33 +02:00
Łukasz Magiera 5287119f4e Merge pull request #1605 from filecoin-project/feat/update-specs-actors
update to specs actors with sectors fixes
2020-04-24 23:06:03 +02:00
Łukasz Magiera fd7af33d4b Merge pull request #1604 from filecoin-project/feat/better-sminer-info
storageminer: Print some balances in info
2020-04-24 23:05:06 +02:00
Łukasz Magiera af794a6281 storageminer: Print some balances in info 2020-04-24 23:02:27 +02:00
Jeromy 360d87cbab update to specs actors with sectors fixes 2020-04-24 10:51:47 -07:00
Łukasz Magiera bf0e50d717 Merge pull request #1603 from filecoin-project/feat/fixed-null-miner-cron
specs-actors: Fix miner cron on null blocks
2020-04-24 19:20:08 +02:00
Łukasz Magiera 55f7c81aaf specs-actors: Fix miner cron on null blocks 2020-04-24 19:12:30 +02:00
Łukasz Magiera a02bf83332 Merge pull request #1600 from filecoin-project/deps/badger2
Update badger
2020-04-24 16:58:28 +02:00
Jakub Sztandera 36cd9826aa Update badger
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-24 16:29:34 +02:00
Aayush Rajasekaran 7c22dabb63 default to setting max piece size to sector size 2020-04-24 01:01:22 -04:00
Aayush Rajasekaran 45722772fc Print a miner ask's max piece size 2020-04-24 01:01:22 -04:00
Aayush Rajasekaran 1a708b2e2a Resolve miner address before trying to verify ask siggy 2020-04-24 01:01:22 -04:00
Łukasz Magiera ab776352b1 Merge pull request #1595 from filecoin-project/feat/update-badger
update badger
2020-04-24 02:51:51 +02:00
Łukasz Magiera 15e07b38b6 Merge pull request #1594 from filecoin-project/fix/api-tags
apistruct: Check tags in tests
2020-04-24 02:47:12 +02:00
Jeromy e34ae07b9a update badger 2020-04-23 17:44:58 -07:00
Łukasz Magiera a28e64227b apistruct: Check tags in tests 2020-04-24 02:41:18 +02:00
Travis PersonandTravis Person 1b6aa537d3 fountain: decode peer id (#1593)
Co-authored-by: Travis Person <travisperson@users.noreply.github.com>
2020-04-23 17:34:31 -07:00
Łukasz Magiera 88ccd73139 Merge pull request #1592 from filecoin-project/feat/pond-methodgen
pond: Method mapping generator
2020-04-24 02:17:38 +02:00
Łukasz Magiera db2e1fc2c4 Merge pull request #1591 from filecoin-project/feat/import-analyze
add command to analyze import bench output
2020-04-24 02:14:49 +02:00
Łukasz Magiera fbd346a36b pond: Method mapping generator 2020-04-24 02:13:48 +02:00
Jeromy 7ee42e61d5 add command to analyze import bench output 2020-04-23 16:48:54 -07:00
Łukasz Magiera 9b55f4b471 Merge pull request #1578 from filecoin-project/cleanup/lotus-bench
Cleanup/lotus bench
2020-04-24 01:21:41 +02:00
Jeromy 86ccaa1981 properly load in registered proof type when benchmarking existing sectors 2020-04-24 01:16:26 +02:00
Jeromy a9b62bcc5c small amount of cleanup for lotus bench 2020-04-24 01:16:26 +02:00
Łukasz Magiera 016d0d15c3 Merge pull request #1588 from filecoin-project/feat/check-deps
Add tests for api depending on ffi
2020-04-24 01:08:02 +02:00
Łukasz Magiera da7db5fa98 Merge remote-tracking branch 'origin/testnet/3' into feat/check-deps 2020-04-24 00:59:15 +02:00
Łukasz Magiera 322ab8fd6f Merge pull request #1569 from filecoin-project/feat/dht-upgrade
Upgrade DHT Version
2020-04-24 00:57:56 +02:00
Jeromy 8ee296d130 fix tests 2020-04-23 15:53:24 -07:00
Łukasz Magiera e6ce6211de Merge remote-tracking branch 'origin/testnet/3' into feat/dht-upgrade 2020-04-24 00:50:23 +02:00
Łukasz Magiera 96f9d58066 Merge pull request #1575 from filecoin-project/feat/estimate-gas-price-api
add an api for estimating gas prices
2020-04-24 00:47:27 +02:00
Jeromy f4948dcba0 remove api dependency on sealing fsm package 2020-04-23 15:33:59 -07:00
Łukasz Magiera 309f54aa0c Update sector-storage 2020-04-23 15:29:31 -07:00
Jeromy ef1d485c6e move head change type out of chainstore package 2020-04-23 15:28:59 -07:00
Jakub Sztandera 041e9e14a2 Add tests for api depending on ffi
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-23 15:28:59 -07:00
Łukasz Magiera 233c84ef3e Merge pull request #1590 from filecoin-project/feat/newminer
Better mining tests, Fix no-sector miner panic
2020-04-24 00:14:19 +02:00
Łukasz Magiera c137b0cf73 Merge remote-tracking branch 'origin/testnet/3' into feat/newminer 2020-04-23 23:53:23 +02:00
Łukasz Magiera 86e7f5914b testing: test 2-miner mining 2020-04-23 23:20:02 +02:00
Łukasz Magiera 40f56243d1 testing: Node test refactoring 2020-04-23 23:16:39 +02:00
WhyrusleepingandŁukasz Magiera faa9002cce working on sector pledge requirements after specs-actors 1.0.0 (#1584)
* WIP: working on sector pledge requirements after specs-actors 1.0.0

* update storage-fsm with pledge collateral logic

* Set bigger balances for miners

* Return only additional required pledge

* split collateral methods into two methods

Co-authored-by: Łukasz Magiera <magik6k@gmail.com>
2020-04-23 12:39:34 -07:00
Łukasz Magiera df5e3f6227 Merge pull request #1589 from filecoin-project/feat/deal-id-in-list-deals-output
add deal identity to client list-deals output
2020-04-23 21:19:11 +02:00
laser 959d91ec65 add deal identity to client list-deals output 2020-04-23 12:08:16 -07:00
Yu DaandDa Yu 9b598e5ec3 fix #1574 (#1583)
* fix #1566

* fix #1566

Co-authored-by: Da Yu <dayu26@dadeMacBook-Pro.local>
2020-04-23 09:44:25 -07:00
Aayush Rajasekaran 58fe29d705 Merge pull request #1481 from jsign/jsign/testnet3/DoubleTestAPIDealFlowFAIL
Double Deal Flow test
2020-04-23 12:19:40 -04:00
Łukasz Magiera 70f21d6ca5 Merge pull request #1586 from yaohcn/fix/deploy-node-script
fix deploy node sh
2020-04-23 14:12:20 +02:00
yaohcn ecdedd33e2 fix deploy node sh 2020-04-23 16:48:31 +08:00
Whyrusleeping b761a2994b Merge pull request #1582 from filecoin-project/fix/fountain-proper-peerid
fountain: use proper peerid
2020-04-22 20:20:16 -07:00
Travis Person 1169fb4b86 mod tidy 2020-04-23 03:13:03 +00:00
Whyrusleeping c4302ddc1f Merge pull request #1581 from filecoin-project/fix/send-msg-cid
make send print its cid
2020-04-22 20:11:56 -07:00
Travis Person 332b6b9e0a fountain: use proper peerid 2020-04-23 02:57:47 +00:00
Jeromy 42c5c6b4e4 make send print its cid 2020-04-22 19:57:11 -07:00
Łukasz Magiera c89c21b47a Merge pull request #1579 from filecoin-project/fix/chainwatch-sql
chainwatch: fix sql syntax error
2020-04-23 01:08:35 +02:00
Travis Person 4e1dddab67 chainwatch: fix sql syntax error 2020-04-22 22:57:17 +00:00
Jeromy 1d5059c281 add tipsetkey to estimate gas api 2020-04-22 15:37:59 -07:00
Jeromy 7e7caa8859 more expressive estimate gas api 2020-04-22 15:28:51 -07:00
Jeromy 18f4e9d828 enable autonat service 2020-04-22 15:28:01 -07:00
Łukasz Magiera 93b30ab865 Merge pull request #1565 from filecoin-project/feat/retrieval-market-#1552
Feat/retrieval market #1552
2020-04-22 23:10:04 +02:00
Łukasz Magiera f7228f9465 gofmt 2020-04-22 23:09:43 +02:00
shannonwells f0fec60841 ensure unlock on error 2020-04-22 13:58:26 -07:00
Łukasz Magiera 6b2b2b678f Merge pull request #1577 from filecoin-project/fix/dont-empty-post
post: Don't send empty posts
2020-04-22 21:20:47 +02:00
Łukasz Magiera 262d7b2372 post: Don't send empty posts 2020-04-22 21:16:19 +02:00
Jeromy 9c704db12b mod tidy 2020-04-22 11:17:21 -07:00
Adin Schmahmann 9199c03f0d disable using the DHT to find provider records or arbitrary values 2020-04-22 11:13:26 -07:00
Adin Schmahmann 744a02eb5a update DHT options and use automatic DHT mode switching 2020-04-22 11:13:25 -07:00
Adin Schmahmann 83ad29648e update dht deps 2020-04-22 11:12:23 -07:00
Łukasz Magiera c8d23b5947 Merge pull request #1576 from filecoin-project/feat/reverse-lookup
cli: state lookup --reverse
2020-04-22 18:44:15 +02:00
Łukasz Magiera b621754514 cli: state lookup --reverse 2020-04-22 18:38:09 +02:00
Jeromy 2a97045317 add an api for estimating gas prices 2020-04-22 09:37:38 -07:00
Łukasz Magiera c64dbfcf40 Merge pull request #1571 from diwufeiwen/patch-1
Update miners.go
2020-04-22 14:46:59 +02:00
Łukasz Magiera 05df832ae4 Merge pull request #1572 from filecoin-project/fix/seed-merge-set-peerid
lotus-seed: preserve first peerid during merge
2020-04-22 14:42:49 +02:00
Łukasz Magiera f1ea33c658 Merge pull request #1573 from filecoin-project/fix/specs-actor-version
deps: update specs-actors due to lost commit during squash
2020-04-22 11:17:32 +02:00
Travis Person 8f500046ac deps: update specs-actors due to lost commit during squash 2020-04-22 02:38:56 +00:00
Travis Person 3285dd0cf1 lotus-seed: preserve first peerid during merge 2020-04-22 02:05:35 +00:00
diwufeiwen d873d8489d Update miners.go
Remove code that does n’t make sense
2020-04-22 10:00:57 +08:00
shannonwells 28c5697578 separate lock/unlock and do independent waiting per PR comments 2020-04-21 16:19:40 -07:00
shannonwells a9c98eab8d call paychmgr wait funcs, make sure tests are passing 2020-04-21 16:19:40 -07:00
shannonwells 162784e98f updates after rebase against feat/windowed-post 2020-04-21 16:19:40 -07:00
shannonwells 3ca71e146c missed return value 2020-04-21 16:19:40 -07:00
shannonwells fd7f4ef080 begin implementing funcs to support latest go-fil-markest retrieval market API 2020-04-21 16:19:40 -07:00
Ignacio Hagopian 1f2b767696 testnet/3 rebasing
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-04-21 19:38:04 -03:00
Ignacio Hagopian 1e810eb2c8 avoid rename after refactor
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-04-21 19:38:04 -03:00
Ignacio Hagopian 95c13ddd92 Double Deal Flow test failing
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-04-21 19:38:04 -03:00
Whyrusleeping f960cccc51 Merge pull request #1568 from filecoin-project/feat/fix-reward-redeem
fix reward redeem command to work again
2020-04-21 15:23:49 -07:00
Łukasz Magiera 4d5e3201c3 Merge pull request #1522 from filecoin-project/feat/windowed-post
Windowed PoSt
2020-04-22 00:15:56 +02:00
Jeromy e3f2dfaec0 fix reward redeem command to work again 2020-04-21 14:45:33 -07:00
Łukasz Magiera 9f9ae155e3 windowed post: Review cleanup 2020-04-21 23:38:33 +02:00
Łukasz Magiera eba0743d47 bench: --num-sectors option 2020-04-21 21:47:07 +02:00
Łukasz Magiera 24c764c91e Don't print QAPower as bytes 2020-04-21 21:46:50 +02:00
Łukasz Magiera f10eed3ae3 genesis: Setup verifier registry 2020-04-21 20:25:43 +02:00
Łukasz Magiera 9923c909c1 Merge remote-tracking branch 'origin/testnet/3' into feat/windowed-post 2020-04-21 19:28:00 +02:00
Łukasz Magiera c406b875fa gofmt, mod tidy 2020-04-21 19:23:49 +02:00
Łukasz Magiera 8be9494672 windowed post: Get correct sector set 2020-04-21 19:22:53 +02:00
Łukasz Magiera fcc51f3591 cli: Support --tipset in chain get /pstate 2020-04-21 17:07:12 +02:00
Łukasz Magiera c2806fe189 cli: allow specyfying tipset by @height 2020-04-21 17:06:54 +02:00
Łukasz Magiera f43ce74604 Update specs-actors 2020-04-21 16:32:17 +02:00
Łukasz Magiera 00eb0e6378 genesis: Add sectors to NewSectors set 2020-04-21 14:36:54 +02:00
Łukasz Magiera b941b29fe5 miner: Use correct randomness for sealing 2020-04-20 20:33:53 +02:00
Łukasz Magiera ecc38d1bd8 sync: env var to fix drand 2020-04-20 20:33:53 +02:00
Łukasz Magiera d99f40797e sync: env var to fix drand 2020-04-20 19:43:02 +02:00
Łukasz Magiera a86595bc88 Use nicer DeadlineInfo struct 2020-04-20 19:34:08 +02:00
Łukasz Magiera 851a7dc180 Merge pull request #1562 from filecoin-project/fix/websocket-client-disconnects
handle websocket clients disconnecting more properly
2020-04-20 18:55:46 +02:00
Jeromy 216072468f handle websocket clients disconnecting more properly 2020-04-20 09:52:16 -07:00
Łukasz Magiera 6dd2f5369e genesis: Fix importing 8k+ deals 2020-04-20 15:54:06 +02:00
Łukasz Magiera 32e45557fa Merge pull request #1558 from filecoin-project/fix/faucet-rate-limit
Rate limit fix
2020-04-18 02:28:52 +02:00
Łukasz Magiera f11b1bbbeb mpool: get nonce for correct address 2020-04-18 02:25:43 +02:00
Whyrusleeping bb7bb2600a Merge pull request #1559 from filecoin-project/fix/commp-convert-cmd
parse input as hex
2020-04-17 17:25:16 -07:00
Jeromy 2de6a38c8b update docs 2020-04-17 17:12:39 -07:00
Jeromy 3962194fad parse input as hex 2020-04-17 17:09:09 -07:00
Łukasz Magiera 9c5cda0efa Merge pull request #1557 from filecoin-project/feat/power-table-lookback
Use lookback to get sector set and power for miners
2020-04-18 01:53:54 +02:00
Jeromy 91f56742c4 Use lookback to get sector set and power for miners 2020-04-17 16:44:18 -07:00
Łukasz Magiera fe6d666150 Get all tests to pass 2020-04-18 01:14:39 +02:00
Łukasz Magiera 99a3902c07 Fix deal flow tests 2020-04-18 01:13:02 +02:00
Łukasz Magiera ba73b9d3c4 Fix DealFlow test 2020-04-18 01:01:11 +02:00
Łukasz Magiera 3b7ae0d6d9 mod tidy, gofmt 2020-04-18 00:02:43 +02:00
Łukasz Magiera 712e2683d6 miner: proving info commands 2020-04-18 00:02:18 +02:00
Jeromy 073962a60d resolve addresses to IDs for checks 2020-04-17 14:23:30 -07:00
Jeromy 24b7661837 fix up some tests 2020-04-17 13:44:13 -07:00
Łukasz Magiera e6270e4291 Update fsm; get sectorset form correct ts 2020-04-17 21:49:32 +02:00
Travis Person 850803f138 Rate limit fix 2020-04-17 18:24:29 +00:00
Łukasz Magiera a40872f74d Merge pull request #1554 from filecoin-project/feat/increase-gen-gas
increase gas limit during genesis generation
2020-04-17 19:54:55 +02:00
Łukasz Magiera 8e13920e7b cbor-gen 2020-04-17 19:53:09 +02:00
Łukasz Magiera 8828668541 mpool: Adjust sends from ID addresses 2020-04-17 18:47:14 +02:00
Łukasz Magiera 93b2b6d65d Merge branch 'testnet/3' into feat/windowed-post 2020-04-17 18:38:20 +02:00
Łukasz Magiera ebc2895d15 gofmt, mod tidy 2020-04-17 18:27:11 +02:00
Łukasz Magiera 95bd55b754 Merge pull request #1544 from dayu26/interopnet_dy
fix error "unknown address protocol" when run lotus msig create in cli/…
2020-04-17 18:25:13 +02:00
Łukasz Magiera f7666bc641 Drop commented-out code 2020-04-17 18:24:23 +02:00
Łukasz Magiera 769cf43b52 seed: Set valid PeerIDs 2020-04-17 18:22:17 +02:00
Łukasz Magiera cdbf79fff5 non-debug 2k sector build mode 2020-04-17 17:58:20 +02:00
Łukasz Magiera bab352fb44 Wireup WinningPost validation 2020-04-17 16:47:19 +02:00
Jeromy 708988244d WIP: working on winning post integration 2020-04-16 22:39:55 -07:00
Jeromy 4153f128ef a more betterer supply impl 2020-04-16 16:03:38 -07:00
Łukasz Magiera 706c0b8d3a Stub syscalls.TotalFilCircSupply 2020-04-17 00:19:54 +02:00
Łukasz Magiera 15a4565714 Fix deal publishing 2020-04-16 23:43:39 +02:00
Łukasz Magiera 918b759d03 mpool: Fix PushWithNonce for ID addresses 2020-04-16 23:06:31 +02:00
Łukasz Magiera 50a8b6a184 Update GetMinerSlashed 2020-04-16 22:52:40 +02:00
Łukasz Magiera dc2a67f13f Fix worker key resolving 2020-04-16 22:38:42 +02:00
Whyrusleeping 0db5fc422a Merge pull request #1534 from filecoin-project/patch/syscalls
VerifyConsensusFault syscall impl
2020-04-16 13:33:58 -07:00
Łukasz Magiera 6eaafcf79d wireup windowPost scheduling logic to miner actor 2020-04-16 22:11:07 +02:00
Whyrusleeping 06970a662c Merge pull request #1524 from filecoin-project/asr/vmminer
Two minor improvements
2020-04-16 13:06:03 -07:00
Henri S 8594af970f fix typo: 2020-04-16 15:52:49 -04:00
Aayush Rajasekaran 6a8e4bf87e Lower a log level 2020-04-16 15:34:01 -04:00
Aayush Rajasekaran 4a93ad33f9 Propose Deal: Fail early if data doesn't fit in a sector 2020-04-16 15:34:01 -04:00
Aayush Rajasekaran 14ad808a00 Remove unused fields from VM 2020-04-16 15:34:01 -04:00
Łukasz Magiera afdfc8807d api: Single method for static miner info 2020-04-16 19:36:36 +02:00
Łukasz Magiera 8338be3a6e Fix genesis creation 2020-04-16 19:17:56 +02:00
Łukasz Magiera 98f3cab24e Update specs-actors 2020-04-16 18:41:45 +02:00
Łukasz Magiera f88e400d74 make things build 2020-04-16 00:17:39 +02:00
Łukasz Magiera 246a9f0e45 gofmt 2020-04-15 22:41:20 +02:00
Łukasz Magiera 85993848be bring back api.StateMinerProvingSet 2020-04-15 22:40:46 +02:00
Łukasz Magiera 0336b32fcd windowpost: Wire up challenge generation 2020-04-15 22:22:58 +02:00
Travis Person 16347270e0 increase gas limit during genesis generation 2020-04-15 20:09:33 +00:00
Łukasz Magiera 149bb56b8e wip updates to sector set handling 2020-04-15 21:59:11 +02:00
Whyrusleeping 8a83415596 Merge pull request #1541 from filecoin-project/feat/drand-2
real drand network integration
2020-04-15 11:22:00 -07:00
Aayush Rajasekaran c0204cdd83 Add a shed command to turn raw commPs into CIDs 2020-04-15 14:01:00 -04:00
Aayush Rajasekaran efd435d763 Treat proposed deals as manual iff a commP is provided 2020-04-15 14:00:53 -04:00
Aayush Rajasekaran fc933858e1 Add an API method to calculate piece CIDs 2020-04-15 14:00:42 -04:00
Jakub Sztandera c34fb24cef Reove 2048 min power in shared params
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-15 16:49:17 +02:00
Jakub Sztandera 56eaf143db fix lint
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-15 16:37:03 +02:00
Jakub Sztandera c2db85b99b mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-15 16:36:21 +02:00
Jakub Sztandera 08e74a90f9 Add missing files
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-15 16:13:20 +02:00
Jeromy 05536042f9 drop outdated comment 2020-04-14 16:37:10 -07:00
Jeromy 4e6839b5ef some small cleanup 2020-04-14 15:13:52 -07:00
Jakub Sztandera 0feab0aad4 Bake drand public key into build params
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-14 22:34:44 +02:00
Jakub Sztandera 0c5e3e2533 Make tests use mock beacon
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-14 20:41:05 +02:00
Jakub Sztandera eb501f7290 Cache more
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-14 19:55:53 +02:00
Jakub Sztandera 5ab9636365 Call VerifyBeacon, hack around genesis
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-14 16:52:18 +02:00
Jakub Sztandera 624dd7d2ce Verify PrevRound too
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-14 16:18:34 +02:00
Jakub Sztandera 3e976fd74b Make tests pass
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-14 16:09:11 +02:00
Da Yu 2a10a79460 fix error unknown address protocol when run lotus msig create in cli/mutisig.go 2020-04-14 17:18:19 +08:00
Jeromy 674be39af1 real drand network integration 2020-04-13 20:06:10 -07:00
Łukasz Magiera e4641fc7ed bench: Also bench windowed post 2020-04-14 00:17:37 +02:00
Łukasz Magiera 5bf80a60f1 Get proof type in NewWinningPoStProver constructor 2020-04-13 23:25:46 +02:00
Łukasz Magiera bb3789b130 Fix ADT uses 2020-04-13 23:06:11 +02:00
Łukasz Magiera ac8aaf2739 chain cli: Update slash-consensus cmd 2020-04-13 23:05:16 +02:00
Łukasz Magiera 349b2890bf Drop 'rewards list' for now 2020-04-13 22:43:27 +02:00
Łukasz Magiera 2db9c24817 genesis: Update power state construction 2020-04-13 22:41:05 +02:00
Łukasz Magiera ff5494af4e Cleanup gohacks, use ffi master 2020-04-13 22:21:13 +02:00
Henri S a4cdfe89fd fix parent grinding check 2020-04-13 15:55:53 -04:00
Henri S 23dc776bd1 finalize logic, still need to import appropriate fields to the shim 2020-04-13 15:55:53 -04:00
Henri S aa5cec39ca first stab 2020-04-13 15:55:53 -04:00
Łukasz Magiera 704978a6ba genesis: Set ssize in VerifyDealsOnSectorProveCommitParams 2020-04-11 01:46:55 +02:00
Łukasz Magiera a2554952d1 Some electionPoSt -> winningPoSt renaming 2020-04-11 00:22:45 +02:00
Łukasz Magiera d3ffe48fcb Get things to mostly build 2020-04-10 23:29:05 +02:00
Łukasz Magiera e053cd6b9c Merge remote-tracking branch 'origin/testnet/3' into feat/windowed-post 2020-04-10 23:09:01 +02:00
Łukasz Magiera 613e61222b mostly wire up WindowedPoSt 2020-04-10 23:07:18 +02:00
Łukasz Magiera 3426611340 Merge pull request #1526 from filecoin-project/feat/pass-deal-schedule-for-pre-commit-expiry-scheduling
provide deal scheduling info to FSM so that it can set pre-commit expiry
2020-04-10 23:05:50 +02:00
Łukasz Magiera 1c75bf30ac genesis: Try updating for QA power 2020-04-10 22:04:04 +02:00
Łukasz Magiera 072dd8b744 Merge remote-tracking branch 'origin/testnet/3' into feat/windowed-post 2020-04-10 20:38:25 +02:00
Łukasz Magiera 0f0015f45c Merge pull request #1520 from filecoin-project/feat/graphsync-chainsync-extension
Update to latest go-fil-markets w/ enhanced Graphsync
2020-04-10 20:27:05 +02:00
laser 19573c0319 adjust imports to conform to convention 2020-04-10 08:22:28 -07:00
laser 4a12a98451 set pre-commit expiration to 10000000, which was original value in FSM 2020-04-10 08:22:28 -07:00
laser 6dffe9377f provide deal scheduling info to FSM so that it can set pre-commit expiry 2020-04-10 08:22:28 -07:00
Łukasz Magiera b0fe8b8b4c v25: get bench to almost work 2020-04-10 14:19:06 +02:00
Łukasz Magiera 37e7c512e6 Update ffi (v25 proofs) 2020-04-09 23:17:23 +02:00
Łukasz Magiera 70d654e4a6 Merge pull request #1527 from filecoin-project/feat/drand
Initial randomness beacon implementation
2020-04-09 19:48:09 +02:00
Jeromy 09b013b7a5 close resp chan 2020-04-09 10:35:43 -07:00
Jeromy 83416e2758 remove deadcode 2020-04-09 10:34:54 -07:00
Jeromy ac271b021d finish addressing review 2020-04-09 10:13:09 -07:00
Jakub Sztandera 7ee6388686 Make drand build
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-09 14:39:51 +02:00
Jakub Sztandera 029ffc2dc3 go mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-09 14:33:37 +02:00
Jeromy 1a3ab63e47 WIP: drand client integration 2020-04-08 19:55:17 -07:00
Jeromy c5c18659a4 address some review 2020-04-08 17:24:10 -07:00
Whyrusleeping 4bf784b44f Merge pull request #1529 from filecoin-project/asr/type
Sever the API's dependency on VM
2020-04-08 16:25:00 -07:00
Jeromy ef6fb1b756 rename beacon to randombeacon 2020-04-08 16:10:08 -07:00
Aayush Rajasekaran 17e9feb633 Sever the API's dependency on VM 2020-04-08 18:27:31 -04:00
Jakub Sztandera 1bd28bdb6a Fix lint errors
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:37:04 +02:00
Jakub Sztandera f17929f032 Change lint-changes to base of testnet/3
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:30:37 +02:00
Jakub Sztandera 661d373fa2 Fix blockheader tests
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:27:55 +02:00
Jakub Sztandera d909119bb6 Make debug_advance build, still doesn't work
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:19:17 +02:00
Jakub Sztandera f4f649acf4 Fix chainwatch
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:17:44 +02:00
Jakub Sztandera d71ba5039b Merge branch 'feat/drand' of github.com:filecoin-project/lotus into feat/drand
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:08:35 +02:00
Jakub Sztandera ce4978d8c3 Reintroduce correct ticket randomness alongside ElectionProof
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 21:06:41 +02:00
Whyrusleeping 69353e8210 Merge pull request #1516 from jsign/jsign/fixdockerfile
docker: fix build, upgrade Go
2020-04-08 11:15:19 -07:00
Jeromy be85f2aff7 handle beacon gaps 2020-04-08 10:49:50 -07:00
Jakub Sztandera 9a17beba9e Skip block header test vectors
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 18:48:47 +02:00
Jakub Sztandera 2d2b89fcd8 make debug_advance build
Still doesn't work

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 18:46:57 +02:00
Jakub Sztandera f1c890ca54 Tests pass
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 18:31:16 +02:00
Jeromy 8e0ca306d2 more wiring up of drandomness 2020-04-08 08:11:42 -07:00
Łukasz Magiera 2b0bf372a7 Merge pull request #1507 from filecoin-project/feat/completions
Shell completions
2020-04-08 16:29:18 +02:00
Jakub Sztandera c16806eb78 gofmt
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-08 14:54:06 +02:00
hannahhoward cda2be93f5 fix(deps): update gs/data-transfer/markets to master 2020-04-07 23:27:41 -07:00
hannahhoward 00cd89750d feat(deps): update fil-markets, graphsync
Updates dependencies for graphsync, fil-markets, data-transfer. Moves to new graphsync blockstore
swapping capabilities, and also locks down graphsync impl so it does not accept arbitrary requests
2020-04-07 23:25:29 -07:00
Aayush Rajasekaran 1120298b05 Merge pull request #1523 from filecoin-project/asr/docs
Add info for miners who want to accept storage deals
2020-04-07 20:51:21 -04:00
Aayush Rajasekaran d73a9f4f34 Add info for miners who want to accept storage deals 2020-04-07 20:40:44 -04:00
Jeromy 056284c00b wip: chain sync winner check 2020-04-07 15:54:01 -07:00
Jakub Sztandera 9fd1b95fd5 Fix build errors
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-07 15:32:23 -07:00
Jakub Sztandera 9c250f24fa Nex wip
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-07 15:32:23 -07:00
Jakub Sztandera afdb1db529 drand wip
,
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-07 15:32:23 -07:00
Jeromy 7075eaba26 WIP: random beacon interface
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-07 15:32:23 -07:00
Łukasz Magiera 09aa1507c8 v25 proof parameters 2020-04-07 21:59:22 +02:00
Łukasz Magiera e36f356908 wip changes for windowed post 2020-04-07 21:55:34 +02:00
Łukasz Magiera f2dd0f046e wdpost: Make chain notif loop reconnect friendly 2020-04-07 20:02:52 +02:00
Łukasz Magiera 5524241645 fpost -> windowPost renaming 2020-04-07 19:41:41 +02:00
Łukasz Magiera 7e96b15091 Merge pull request #1519 from filecoin-project/feat/extracted-fsm
consume newly-extracted storage FSM
2020-04-07 18:42:53 +02:00
Łukasz Magiera 9b99850585 Merge pull request #1521 from filecoin-project/interopnet
New interop network info
2020-04-07 18:36:37 +02:00
laser 110c869dd3 cut over to storage-fsm, deleting local sealing package 2020-04-07 09:34:09 -07:00
Travis Person 6603fc5975 Add new bootstrapper 2020-04-07 05:09:46 +01:00
Travis Person 298e942edf New interop network info 2020-04-07 03:50:15 +01:00
Łukasz Magiera 086a66efc9 Merge pull request #1517 from filecoin-project/feat/lotus-agnostic-node-interface
remove lotus types from sealing package in preparation for extraction
2020-04-07 00:42:30 +02:00
laser 43f4db2308 SectorID -> SectorNumber 2020-04-06 15:31:33 -07:00
Łukasz Magiera 4ee8254133 Merge pull request #1510 from filecoin-project/feat/fsm-updates
FSM Updates
2020-04-06 23:11:46 +02:00
laser 0170418fc1 revert name change 2020-04-06 14:05:26 -07:00
laser c268b5b7ac use latest sector-storage 2020-04-06 13:42:27 -07:00
laser 2f4732760a update CBOR encoders/decoders 2020-04-06 13:35:29 -07:00
laser ab44ae1354 move to types 2020-04-06 13:31:49 -07:00
laser 2781e16ef4 go mod tidy 2020-04-06 13:27:27 -07:00
laser f53250ee90 reorder imports 2020-04-06 13:27:14 -07:00
laser dcd9e7da27 miscellaneous fixes post-rebase 2020-04-06 13:23:37 -07:00
laser 650a31b050 remove all lotus types from sealing package in preparation for extraction
events adapter

implement StateWaitMsg and StateComputeDataCommitment

implement StateGetSectorPreCommitOnChainInfo

implement ChainHead and SendMsg

implement remaining methods
2020-04-06 12:57:55 -07:00
Jeromy 3ad16c58d7 cache address resolutions in state tree 2020-04-06 12:32:22 -07:00
Łukasz Magiera 6c285898a8 Merge pull request #1513 from filecoin-project/fix/miner-remote-sealer-addr
Fix/miner remote sealer addr
2020-04-06 20:36:44 +02:00
Łukasz Magiera 68fa9f20c3 Merge pull request #1511 from filecoin-project/fix/runtime-exit-edge-cases
handle some runtime error edge cases
2020-04-06 20:34:22 +02:00
Ignacio Hagopian 312bab0843 docker: fix build, upgrade Go
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-04-06 11:25:18 -03:00
Łukasz Magiera 8448771ce6 Merge pull request #1512 from filecoin-project/feat/cache-addr-resolves
cache address resolutions in state tree
2020-04-04 05:06:31 +02:00
Łukasz Magiera f05be81275 fsm: Get correct interactive randomness if it lands on a nullblock 2020-04-04 04:57:05 +02:00
Łukasz Magiera 303d4a31fe fsm: Handle invalid Commits 2020-04-04 03:50:05 +02:00
Łukasz Magiera 9a7aa3fc87 chain get: @Hu: for uvaring hamt keys 2020-04-04 03:49:42 +02:00
lanzafame 209e8b3041 only add RemoteListenAddress to StorageMinerNode config 2020-04-04 09:56:52 +10:00
Jeromy bb6e8de056 cache address resolutions in state tree 2020-04-03 16:26:52 -07:00
Jeromy ab51501849 remove todo 2020-04-03 15:50:52 -07:00
Jeromy 2d5becaaba further removals 2020-04-03 15:05:59 -07:00
Jeromy 4c6fa1b2c0 handle some runtime error edge cases 2020-04-03 14:38:11 -07:00
Łukasz Magiera 4d92798f5b fsm: Update cbor-gen 2020-04-03 21:34:20 +02:00
Łukasz Magiera 6284fad33e fsm: Implement handlers for Commit errors 2020-04-03 19:45:48 +02:00
Łukasz Magiera a63a0b3077 sealing fsm: Separate precommit 1/2 2020-04-03 18:54:15 +02:00
Łukasz Magiera 147e18e28e fsm: Fix tests after changisg SectorState to a string 2020-04-03 18:36:48 +02:00
Łukasz Magiera a1b35aa9d5 Change api.SectorState to a string 2020-04-03 18:29:31 +02:00
Łukasz Magiera 847bdb203a Merge pull request #1508 from filecoin-project/feat/reward-list-fil
rewards cli: Print amount in list as Fil
2020-04-03 15:39:06 +02:00
Łukasz Magiera 2ddbb19c3a Merge pull request #1509 from filecoin-project/feat/update-ffi-paths
Update FFI
2020-04-03 15:38:48 +02:00
Łukasz Magiera 23d6dc67cf Update FFI 2020-04-03 07:04:40 +02:00
lanzafame 27e81f37f3 fix todo comment 2020-04-03 15:01:39 +10:00
lanzafame 3ba2b0e365 instead of guessing the address, just use a config value 2020-04-03 14:54:07 +10:00
Łukasz Magiera dd6adcd240 rewards cli: Print amount in list as Fil 2020-04-03 06:31:59 +02:00
Łukasz Magiera 5b6bbfe903 Merge pull request #1506 from filecoin-project/feat/faster-snapshots
avoid flushing disk when doing state tree snapshots
2020-04-03 04:04:57 +02:00
Łukasz Magiera 2bdedefa05 Shell completions 2020-04-03 04:03:53 +02:00
Jeromy 7a475d5ca5 drop outdated comment 2020-04-02 18:52:18 -07:00
Jeromy 89b15c03cf nil out layers when dropping to allow for GC 2020-04-02 18:20:49 -07:00
Jeromy 212c346c21 avoid flushing disk when doing state tree snapshots 2020-04-02 17:18:25 -07:00
Łukasz Magiera 11777c5f24 Merge pull request #1502 from filecoin-project/feat/import-bench
add a command to lotus-bench to benchmark importing and validating
2020-04-03 01:30:12 +02:00
Jeromy beaa3dffab add a command to lotus-bench to benchmark importing and validating a chain 2020-04-02 16:18:38 -07:00
Łukasz Magiera d060dda0c5 Merge pull request #1505 from filecoin-project/fix/pond-tskeys
pond: Use tipestKeys for state calls
2020-04-03 01:17:01 +02:00
Łukasz Magiera 91c9f447cd Merge pull request #1504 from filecoin-project/interopnet
New interop network info
2020-04-03 01:11:17 +02:00
Łukasz Magiera 0417e4bd0c pond: Use tipestKeys for state calls 2020-04-03 01:09:31 +02:00
Whyrusleeping a5552e4c36 Merge pull request #1496 from filecoin-project/feat/shed-importcar
shed: import-car for state debugging
2020-04-02 15:29:41 -07:00
Travis Person 698f529602 New interop network info 2020-04-02 23:02:40 +01:00
Łukasz Magiera 48821e6272 Merge pull request #1501 from filecoin-project/fix/aerrors-exitcode-type
use exitcode type from specs actors instead of byte
2020-04-02 21:04:32 +02:00
Jeromy 8a265a0e8d use exitcode type from specs actors instead of byte 2020-04-02 11:24:38 -07:00
Łukasz Magiera c7e206b993 Merge pull request #1498 from filecoin-project/interopnet
New interop network info
2020-04-02 07:07:50 +02:00
Travis Person c41ad767c5 New interop network info 2020-04-02 05:55:24 +01:00
Łukasz Magiera 31571cf655 Merge pull request #1497 from filecoin-project/fix/gas-rewards
use gas used in block rewards
2020-04-02 06:18:33 +02:00
whyrusleeping aa23266c6f use gas used in block rewards 2020-04-01 21:16:16 -07:00
Łukasz Magiera acfb7cee07 shed: import-car for state debugging 2020-04-02 05:28:35 +02:00
Łukasz Magiera f6adbc369a Merge pull request #1495 from filecoin-project/feat/mining-use-base-state
Add GetMiningBaseInfo api and use it for mining
2020-04-02 04:36:56 +02:00
Jeromy fe1d61b276 also use correct set when validating blocks 2020-04-01 18:39:38 -07:00
Jeromy c55501024e remove hacky bits 2020-04-01 18:25:58 -07:00
Jeromy 5b9ee1dea9 Add GetMiningBaseInfo api and use it for mining 2020-04-01 18:15:25 -07:00
Łukasz Magiera 7bbc8a4652 Merge pull request #1491 from filecoin-project/feat/sm-init-ssize-str
storageminer: Parse pretty sector sizes in init
2020-04-02 00:27:39 +02:00
Łukasz Magiera 67a47f428f Merge pull request #1492 from filecoin-project/feat/wallet-import-gfc
allow wallet import to import keys in go-filecoin key format
2020-04-02 00:04:22 +02:00
Łukasz Magiera f15eb8b172 Merge pull request #1487 from filecoin-project/fix/partial-sync-responses
properly handle partial sync responses
2020-04-02 00:03:25 +02:00
Jeromy fb287e8385 allow wallet import to import keys in go-filecoin key format 2020-04-01 15:01:14 -07:00
Łukasz Magiera fa86359549 storageminer: Parse pretty sector sizes in init 2020-04-01 23:56:49 +02:00
Łukasz Magiera 7ef08bfbdf Merge pull request #1490 from filecoin-project/fix/charge-gas
Fix charge gas in case of overcharge
2020-04-01 23:00:28 +02:00
Jakub Sztandera ff510b7542 Merge pull request #1489 from filecoin-project/feat/disable-bst-buf
bufbs: Env var to disable blockstore buffering
2020-04-01 22:56:54 +02:00
Jakub Sztandera 013f441658 Fix charge gas in case of overcharge
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-01 22:55:10 +02:00
Łukasz Magiera 565099f06f Merge pull request #1488 from filecoin-project/feat/rbf
Add Replace by Fee
2020-04-01 22:45:01 +02:00
Łukasz Magiera f727f1db26 bufbs: Env var to disable blockstore buffering 2020-04-01 22:37:34 +02:00
Jakub Sztandera d88c2f8a43 Add Replace by Fee
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-04-01 22:26:14 +02:00
Jeromy 27d57264d9 properly handle partial sync responses 2020-04-01 11:35:09 -07:00
Łukasz Magiera f6c260c49f Merge pull request #1484 from filecoin-project/fix/interop-improvements
several fixes and improvements while debugging interop
2020-04-01 17:51:42 +02:00
Łukasz Magiera cdd97ce959 Revert ticket compare function to comparing vrf hashes 2020-04-01 17:44:51 +02:00
lijunlong 8c05251cce simplify code 2020-04-01 09:41:26 +08:00
Jeromy 417d434973 several fixes and improvements while debugging interop 2020-03-31 18:35:23 -07:00
Whyrusleeping 12f288016d Merge pull request #1483 from filecoin-project/feat/chain-get-pstate
chain get: /pstate prefix
2020-03-31 17:13:41 -07:00
Łukasz Magiera 77a84e7e6b Merge remote-tracking branch 'origin/testnet/3' into feat/chain-get-pstate 2020-04-01 02:09:33 +02:00
Łukasz Magiera 7d2f9366b4 Merge pull request #1482 from filecoin-project/feat/netname-from-genesis
Get network name from genesis
2020-04-01 02:06:42 +02:00
Łukasz Magiera 4ae1238c0c chain get: /pstate prefix 2020-04-01 02:06:26 +02:00
Łukasz Magiera 13f2c21e1d Get network name from genesis 2020-04-01 01:15:49 +02:00
Whyrusleeping ea135991e3 Merge pull request #1480 from filecoin-project/feat/better-deal-info
Better deal info at the command line
2020-03-31 13:29:07 -07:00
Whyrusleeping 0526ee8042 Merge pull request #1472 from jsign/jsign/testnet3/badfiledescriptor
fix ClientRetrieve with CAR exporting & add test coverage
2020-03-31 13:28:00 -07:00
hannahhoward ae3f7522f0 feat(cli): use MarketListIncompleteDeals for miner deals cmd
Switch from DealsList to MarketListIncompleteDeals which (while poorly named) provides much more
information about what's happening with a miners deals
2020-03-31 11:54:37 -07:00
hannahhoward 0c69e99b7c feat(cli): add message to deal output
Add the message field to deal output for client deals -- message will often contain additional
useful info about what happened with the deal, especially for errors
2020-03-31 11:53:30 -07:00
Whyrusleeping be4ac89b57 Merge pull request #1479 from filecoin-project/interopnet
New interop network info
2020-03-31 11:45:45 -07:00
Travis Person 663e2874a1 New interop network info 2020-03-31 19:38:43 +01:00
Łukasz Magiera 16cc3e94ac Merge pull request #1478 from subvisual/pfac/testnet3-fix-deals-import-arg-check
Fix offline deal import command arguments check
2020-03-31 20:38:29 +02:00
Pedro Costa 5e2a94e22f Fix offline deal import command arguments check
Why:

* It is failing if the number of arguments is the expected one.
2020-03-31 19:18:13 +01:00
Łukasz Magiera b78ea464e5 Merge pull request #1477 from filecoin-project/asr/update
Update chain-validation, enable state root validation
2020-03-31 18:58:52 +02:00
Aayush Rajasekaran 8ec19812e3 Update chain-validation, enable state root validation 2020-03-31 03:09:42 -04:00
Ignacio Hagopian 8f89501118 fix ClientRetrieve with CAR exporting & add test coverage
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-03-30 11:08:20 -03:00
lijunlong 7c15d1e8c3 add bench mark for bls sign and verify 2020-03-28 12:34:12 +08:00
Łukasz Magiera 34e9e9fe34 Merge pull request #1469 from filecoin-project/feat/extract-sectorstorage
Extract sector-storage
2020-03-28 01:44:09 +01:00
Łukasz Magiera 95ee1c1cde Extract sector-storage 2020-03-28 01:32:39 +01:00
Łukasz Magiera eb6bc0399a Merge pull request #1468 from filecoin-project/feat/untangle-secstorage
sectorstorage: Untangle from lotus deps
2020-03-27 22:37:19 +01:00
Łukasz Magiera c66d3dfad7 sectorstorage: Untangle from lotus deps 2020-03-27 22:35:33 +01:00
Łukasz Magiera de1f2be505 Merge pull request #1458 from filecoin-project/feat/merge-sectorbuilder
Merge sectorbuilder into sectorstorage
2020-03-27 18:53:58 +01:00
Łukasz Magiera ddd3b3f587 Merge pull request #1460 from filecoin-project/interopnet
New interop network info
2020-03-27 18:51:30 +01:00
Łukasz Magiera cba97000c8 Merge pull request #1467 from filecoin-project/fix/charge-gas
use charge gas safe in places we return errors
2020-03-27 18:49:03 +01:00
Łukasz Magiera f882c5b229 sectorstorage: Address review 2020-03-27 18:45:32 +01:00
Jeromy 97a7b449e6 use charge gas safe in places we return errors 2020-03-27 10:11:21 -07:00
Łukasz Magiera dc49a81a05 Merge pull request #1463 from filecoin-project/feat/readd-api-flag
re add storage miner api flag
2020-03-27 16:11:26 +01:00
Jeromy 3470ed7847 re add storage miner api flag 2020-03-26 22:19:29 -07:00
Travis Person 93a90fbe82 New interop network info 2020-03-27 03:45:57 +00:00
Whyrusleeping a0b25c3718 Merge pull request #1462 from filecoin-project/fix/low-gas-limit
Increase low gas limits everywhere to 10000
2020-03-26 20:27:35 -07:00
Travis Person 838a50be39 Increase low gas limits everywhere to 10000 2020-03-27 03:24:35 +00:00
Whyrusleeping bb7820cfd7 Merge pull request #1461 from filecoin-project/fix/no-fatal-errors
dont  use fatal errors in the vm
2020-03-26 20:22:08 -07:00
Jeromy 672956af5d addressing review 2020-03-26 20:13:32 -07:00
Jeromy 1b50be09af dont use fatal errors in the vm 2020-03-26 20:03:04 -07:00
Travis Person 59e77ba6c8 Merge pull request #1457 from filecoin-project/feat/exitcodes
Update to new sepcs actors, more debug
2020-03-26 17:54:25 -07:00
Travis Person 090261f304 Revert gas exhausted exit code to SysErrOutOfGas 2020-03-27 00:19:34 +00:00
Jakub Sztandera 06cfbf5742 Switch exitcodes
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 22:11:06 +01:00
Łukasz Magiera e050e0307e Cleanup after dropping sectorbuilder 2020-03-26 20:35:16 +01:00
Jakub Sztandera 326490be86 Fix miner
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 17:26:48 +01:00
Jakub Sztandera 437a418afe update filecoin-ffi
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 17:20:57 +01:00
Jakub Sztandera 7b19e26692 Update filecoin-ffi
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 14:41:02 +01:00
Aayush Rajasekaran dc5159ce74 Update chain-validation, make necessary changes 2020-03-26 06:41:02 -04:00
Aayush Rajasekaran 1e1d0676ae Set system actor's initial state correctly 2020-03-26 06:38:45 -04:00
Łukasz Magiera 4be54a976c Merge sectorbuilder into sectorstorage 2020-03-26 03:51:06 +01:00
Łukasz Magiera ac3ca7981f Merge pull request #1456 from filecoin-project/fix/seal-with-fillers
Fix sealing sectors with multiple pieces
2020-03-26 02:28:34 +01:00
Łukasz Magiera 6399499e9b Fix sealing sectors with multiple pieces 2020-03-26 02:18:13 +01:00
Jakub Sztandera edf03c9ba8 Use adt.Empty
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 02:00:25 +01:00
Jakub Sztandera 7a6eb723ad Use correct epoch for vrf
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 01:33:35 +01:00
Jakub Sztandera 300c89f541 Update to new sepcs actors, more debug
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-26 01:02:13 +01:00
Łukasz Magiera 78b4872793 Merge pull request #1454 from filecoin-project/feat/wocker-task-flags
seal-worker: Task type flags
2020-03-25 22:32:46 +01:00
Łukasz Magiera d686fce7f9 stores: Mute serve-stat debug log 2020-03-25 22:23:01 +01:00
Łukasz Magiera ae69e0fef1 seal-worker: Task type flags 2020-03-25 22:15:10 +01:00
Łukasz Magiera 5a7d18e9f3 Merge pull request #1453 from filecoin-project/feat/auth-apiinfo
cli: auth api-info
2020-03-25 21:46:59 +01:00
Łukasz Magiera 91c640197c cli: auth api-info 2020-03-25 21:42:24 +01:00
Łukasz Magiera 02e5148720 Merge pull request #1451 from filecoin-project/feat/secstor-move-sealed
sectorstorage: Move sealed sectors to storage in FinalizeSector
2020-03-25 21:22:44 +01:00
Łukasz Magiera 42c9d53ae1 workers: gofmt 2020-03-25 21:20:24 +01:00
Łukasz Magiera 05f52b1fad stores: 'None' file type 2020-03-25 21:19:58 +01:00
Whyrusleeping 1aef03bdd7 Merge pull request #1450 from filecoin-project/asr/gas
Re: #1446: Enable gas tracking in validation tests
2020-03-25 12:53:57 -07:00
Whyrusleeping 6851b8d7bf Merge pull request #1452 from jsign/jsign/testnet3/includedealid
Include DealID in DealInfo
2020-03-25 12:50:24 -07:00
Ignacio Hagopian 3896902d49 include DealID in DealInfo
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-03-25 16:30:59 -03:00
Jeromy 088d693eea code review changes 2020-03-25 12:13:09 -07:00
Łukasz Magiera 00cfb3bdcf sectorstorage: Move sealed sectors to storage in FinalizeSector 2020-03-25 19:21:53 +01:00
Aayush Rajasekaran 60ec264470 enable gas validation 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran 7b9872c473 don't skip any tests 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran ebcefa80e3 provide msg length to vm::ApplyMessage 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran c951e0cc83 do not reprocess duplicate messages in a block 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran 3a0df321d1 actually create new bls keys 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran 3896631a1c Remove pre-execution validity checks on messages 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran 490f85e690 Send implicit messages for block rewards, cron ticks, state calls, and genesis setup 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran ad15750be3 Charge sender no gas, and penalise miner for certain invalid messages 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran 654f933d3f set up builtin actors correctly for validation testing 2020-03-25 08:25:03 -04:00
Aayush Rajasekaran 09a46e5d80 fix some gas charge bugs, and make our new account actor creation follow GFC 2020-03-25 08:25:03 -04:00
Łukasz Magiera 08ca60cfa8 Merge pull request #1405 from filecoin-project/feat/new-workers
New workers
2020-03-25 01:31:48 +01:00
Łukasz Magiera 201d0a4b19 Merge remote-tracking branch 'origin/testnet/3' into feat/new-workers 2020-03-25 01:02:23 +01:00
Łukasz Magiera cfc65f525a sectorstorage: wire up closing logic 2020-03-25 00:52:55 +01:00
Łukasz Magiera ecf53f88ce workers: More review related fixes 2020-03-25 00:37:40 +01:00
Whyrusleeping 60ea9e6ec8 Merge pull request #1426 from filecoin-project/asr/statewait
Re: #1412: Add a non-blocking version of StateWaitMsg
2020-03-24 16:17:47 -07:00
Whyrusleeping f7b0bb0e9c Merge pull request #1448 from filecoin-project/fix/retval-checking
chain validation nil return values should be []byte{}
2020-03-24 14:10:51 -07:00
Łukasz Magiera 146bfe75f8 sectorstorage: Remove unsealed sector in FinalizeSector 2020-03-24 21:28:07 +01:00
Jeromy ec0d0a51db chain validation nil return values should be []byte{} 2020-03-24 13:09:04 -07:00
Łukasz Magiera 5de17e903c storageminer: Config for local worker task types 2020-03-24 20:38:00 +01:00
Łukasz Magiera 62cf9a5dd7 Update FFI 2020-03-24 19:41:25 +01:00
Łukasz Magiera c7122597be Merge remote-tracking branch 'origin/testnet/3' into feat/new-workers 2020-03-24 19:18:39 +01:00
Łukasz Magiera 5b8c6b687e Merge pull request #1447 from filecoin-project/interopnet
New interop network info
2020-03-24 19:17:49 +01:00
Łukasz Magiera 66a682b55d Merge remote-tracking branch 'origin/testnet/3' into feat/new-workers 2020-03-24 19:09:02 +01:00
Łukasz Magiera 726c9c1fe7 workers: Address review 2020-03-24 19:01:04 +01:00
Travis Person a2162672a7 New interop network info 2020-03-24 17:49:57 +00:00
Whyrusleeping 71f0acd7a3 Merge pull request #1442 from filecoin-project/feat/chainval-tests
WIP: updating and getting chainval tests passing
2020-03-24 10:00:07 -07:00
Whyrusleeping 1d16857997 Merge pull request #1445 from jimpick/fix/spelling
Error message spelling fixes
2020-03-24 09:22:08 -07:00
Aayush Rajasekaran d350a9d415 Re: #1412: Add a non-blocking version of StateWaitMsg
- This commit adds a new method called StateSearchMsg
- We can probably overhaul StateWaitMsg onto this new method at a later point in time
2020-03-24 06:43:15 -04:00
Aayush Rajasekaran d5b1bfe197 only skip one test 2020-03-24 04:44:50 -04:00
Aayush Rajasekaran df13cfa52b Only resolve origin to pubkey address when creating a new account actor 2020-03-24 04:43:09 -04:00
Aayush Rajasekaran 753e8ff7f5 Award gas fees to miners correctly 2020-03-24 03:35:58 -04:00
Aayush Rajasekaran 9ccc02d664 Load actor states afresh before making state changes
- Not doing this is causing bugs when reverting, since the actor cache gets reset
2020-03-24 03:33:22 -04:00
Jim Pick bc914de388 Error message spelling fixes 2020-03-23 23:54:39 -07:00
Jeromy 14591e718d skip tests so we can get this merged in 2020-03-23 18:52:39 -07:00
Jeromy 9e67bef4bd drop balance checks in block validation 2020-03-23 18:50:58 -07:00
Jeromy 2228f13f99 a couple vm fixes 2020-03-23 18:50:58 -07:00
Jeromy 6fe245a278 use proper exitcodes for caller validation 2020-03-23 18:50:28 -07:00
Aayush Rajasekaran 066b755b6a set up initial account state of new Secp accounts 2020-03-23 18:50:28 -07:00
Aayush Rajasekaran 72c6552b0b Allow invocation of account actor methods 2020-03-23 18:50:28 -07:00
Aayush Rajasekaran 05d43af3fc Only try to resolve origin address during top-level invocation 2020-03-23 18:50:28 -07:00
Jeromy 1c55c6afba update to anorths chainval PR 2020-03-23 18:50:28 -07:00
Jeromy 8bc4195b7a WIP: updating and getting chainval tests passing 2020-03-23 18:50:18 -07:00
Whyrusleeping d74ede5a79 Merge pull request #1428 from filecoin-project/feat/graphsync-fetching
WIP: integrate graphsync for chainsync requests
2020-03-23 18:47:17 -07:00
Łukasz Magiera 8559c89560 storageminer: More storage stats in storage list 2020-03-23 23:43:38 +01:00
Jeromy 719cec13d5 prefer blocksync, fallback to graphsync 2020-03-23 13:46:15 -07:00
Łukasz Magiera 8d1fab1e05 sectorstorage: Enable sealing on the local worker by default 2020-03-23 17:28:40 +01:00
Łukasz Magiera 0bb37d1fd6 sectorstorage: Fix remote sector deletion 2020-03-23 16:40:36 +01:00
Łukasz Magiera a3ba8eb0d7 workers: Basic monitoring tools 2020-03-23 15:56:22 +01:00
Łukasz Magiera 80d0f1f2c1 storageminer: Cleanup CLI 2020-03-23 13:29:24 +01:00
Łukasz Magiera cb1e7bd1b1 sector index: Don't add duplicate storage URLs 2020-03-23 13:12:43 +01:00
Łukasz Magiera eeec5a1bba Merge pull request #1274 from filecoin-project/feat/doc/actors
doc: add comments related to actor code review
2020-03-23 12:49:41 +01:00
Łukasz Magiera 5e4a7e54df Rename agvmgr+sealmgr to sectorstorage 2020-03-23 12:47:10 +01:00
Łukasz Magiera cd618dfdbd gofmt 2020-03-22 22:39:27 +01:00
Łukasz Magiera d43f2a2e3b workers: Address review 2020-03-22 22:39:06 +01:00
Łukasz Magiera 881ed6aef7 Merge pull request #1440 from filecoin-project/fix/genesis-field-values
Fix/genesis field values
2020-03-22 22:10:33 +01:00
Łukasz Magiera df9aa0e357 storagemitner: manage ulimit on start 2020-03-22 22:08:22 +01:00
Łukasz Magiera 09c9fcce00 workers: fix panics with schedQueue 2020-03-22 21:45:12 +01:00
Łukasz Magiera 66d71d9974 sealing: Improve sector log 2020-03-22 21:44:27 +01:00
Łukasz Magiera 971fe6fdfd workers: Drop sectors from origin after transfers 2020-03-22 05:27:28 +01:00
Jeromy f1dbd35407 change genesis fields to match interop 2020-03-21 15:25:00 -07:00
Jeromy f3781e8329 update and rerun cbor gen 2020-03-21 14:17:01 -07:00
whyrusleeping 9d7f19b950 some cleanup 2020-03-20 21:30:24 -07:00
hannahhoward 2e9a052f62 fix(chainsync): support longer graphsync fetches with loop 2020-03-20 21:30:24 -07:00
hannahhoward 34f755b2b9 feat(chainsync): fixes to make graphsync work for chain fetching
- store to chain blockstore (ok for now, since storage provider is a seperate process)
- simplify request fetching and processing
2020-03-20 21:30:24 -07:00
whyrusleeping 1076a1a89d WIP: integrate graphsync for chainsync requests 2020-03-20 21:30:24 -07:00
Whyrusleeping 21255eddee Merge pull request #1439 from filecoin-project/fix/chain-export
Rewrite chain export walker function to actually do the right thing
2020-03-20 19:55:11 -07:00
Jeromy 6fcfd0a4f0 add a test to roundtrip export/import a chain 2020-03-20 18:22:24 -07:00
Jeromy 921f11db34 Rewrite chain export walker function to actually do the right thing 2020-03-20 17:18:57 -07:00
Łukasz Magiera 709fd034b4 mod tidy 2020-03-20 23:43:20 +01:00
Łukasz Magiera e6aa01653a Merge remote-tracking branch 'origin/testnet/3' into feat/new-workers 2020-03-20 23:42:46 +01:00
Łukasz Magiera c6f67911de storageminer: Improve storage find cmd 2020-03-20 23:39:07 +01:00
Łukasz Magiera c57c0e7f55 workers: Memory based scheduling 2020-03-20 23:30:17 +01:00
Whyrusleeping aad449f28a Merge pull request #1425 from filecoin-project/fix/randomness-for-ec
use proper lookback, and proper serialization for randomness generation
2020-03-20 15:03:22 -07:00
Whyrusleeping a3fd1d4b51 Merge pull request #1401 from filecoin-project/fix/nonce-miss-no-gas
Missmatching nonce does not charge gas
2020-03-20 14:56:33 -07:00
Jeromy 90f43d99ca cbor marshal address for ticket generation 2020-03-20 14:56:05 -07:00
Łukasz Magiera 628a598ca0 Merge pull request #1431 from luqz/master
Correct the number of waiting blocks
2020-03-20 22:18:38 +01:00
Whyrusleeping 0ca935e0b9 Merge pull request #1417 from filecoin-project/fix/sshot-after-gas
take snapshot after gas transfer so its not reverted on method failure
2020-03-20 14:16:54 -07:00
Whyrusleeping f9bd0fb2ce Merge pull request #1433 from filecoin-project/feat/serialization-vectors
Integrate updated serialization vectors as tests
2020-03-20 14:11:28 -07:00
Jeromy 588a55c9d7 update chain validation 2020-03-20 14:08:47 -07:00
whyrusleeping 84fd969710 take snapshot after gas transfer so its not reverted on method failure 2020-03-20 13:50:46 -07:00
Whyrusleeping badaa5fad1 Merge pull request #1429 from filecoin-project/asr/NAA
Calculate new actor addresses as per updated spec
2020-03-20 13:50:08 -07:00
Jakub Sztandera 4ba4de3379 Missmatching nonce does not charge gas
It should charge miner but we don't have that mechanism yet.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-20 20:44:45 +01:00
Aayush Rajasekaran ef288b8a6c Calculate new actor addresses as per updated spec 2020-03-20 15:43:08 -04:00
whyrusleeping 438aac190f use proper lookback, and proper serialization for randomness generation 2020-03-20 12:20:56 -07:00
Whyrusleeping 7b69697439 Merge pull request #1434 from filecoin-project/feat/more-gas
Rework gas charging
2020-03-20 12:18:18 -07:00
Whyrusleeping 9df4fce282 Merge pull request #1438 from filecoin-project/frrist/display-chainval-testname
print chain-validation test name when running
2020-03-20 12:03:53 -07:00
Whyrusleeping 78de82158d Merge pull request #1436 from filecoin-project/asr/hash
Use blake2b, not SHA, for VRFs
2020-03-20 11:30:04 -07:00
Aayush Rajasekaran 5e46c0b4e9 Use blake2b, not SHA, for VRFs 2020-03-20 11:23:22 -07:00
Jakub Sztandera c874bd6a15 go mod tidy
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-20 19:01:12 +01:00
frrist e6b0eaed61 go mod tidy 2020-03-20 10:41:10 -07:00
frrist 100fc47812 print chain-validation test name when running
- makes debugging easier
2020-03-20 10:35:59 -07:00
Jakub Sztandera ac09a6432c Skip failing tests, update chain-validation
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-20 18:21:13 +01:00
Jakub Sztandera ae40654907 Rework gas charging 2020-03-20 03:26:40 -04:00
Łukasz Magiera 076cc428af workers: Fix moving storage around in later steps 2020-03-20 01:55:49 +01:00
Łukasz Magiera e0c15b24fc storageminer: Fix preseal meta import for genesis miners 2020-03-20 01:20:01 +01:00
Łukasz Magiera 978a718159 storage: storage find command 2020-03-19 20:51:33 +01:00
Łukasz Magiera 314fba049f workers: get sectors back to miner process after precommit 2020-03-19 20:17:58 +01:00
Łukasz Magiera 80cca91584 workers: get to executing tasks remotely! 2020-03-19 18:11:45 +01:00
Łukasz Magiera d87b7c264d stores: Use index in local store 2020-03-19 16:11:04 +01:00
Jason b96aedd720 Correct the number of waiting blocks 2020-03-19 16:00:42 +08:00
whyrusleeping 905fc968bf Integrate updated serialization vectors as tests 2020-03-18 22:53:15 -07:00
Łukasz Magiera 2fa3f2578f impl: Move CommonAPI into a separate pkg 2020-03-19 03:31:53 +01:00
Łukasz Magiera 1ed7779701 Merge remote-tracking branch 'origin/testnet/3' into feat/new-workers 2020-03-19 03:28:55 +01:00
Łukasz Magiera 825a3e1d5c Merge pull request #1424 from filecoin-project/feat/state-tree-itnerop
add simple test for helping to test state tree interop
2020-03-19 03:24:30 +01:00
Łukasz Magiera 2d1e30ae3b workers: Call find* on remote 2020-03-19 03:23:21 +01:00
Whyrusleeping 6d9b8ee0dc Merge pull request #1423 from filecoin-project/interopnet
New interop network info
2020-03-18 17:24:49 -07:00
whyrusleeping 1fb70fc0e0 add simple test for helping to test state tree interop 2020-03-18 17:23:59 -07:00
Travis Person da631478a8 New interop network info 2020-03-19 00:22:59 +00:00
Lucas Molas d21cb96ddb doc: add comments related to actor code review 2020-03-18 16:43:58 -07:00
Łukasz Magiera 94ebbd9d90 workers: Actually register in miner 2020-03-19 00:23:32 +01:00
Whyrusleeping 7b0fc4ae7e Merge pull request #1422 from filecoin-project/feat/update-specs-actors-2
update to latest specs actors code
2020-03-18 15:25:41 -07:00
whyrusleeping f1327b75c3 update to latest specs actors code 2020-03-18 15:16:50 -07:00
Łukasz Magiera 3676daf7dc Merge pull request #1421 from filecoin-project/fix/gas-limit-type
change gas limit to be a normal int64
2020-03-18 22:41:16 +01:00
whyrusleeping ddf1beac6c change gas limit to be a normal int64 2020-03-18 13:45:37 -07:00
Łukasz Magiera 500ce56371 Merge pull request #1415 from filecoin-project/fix/debug-miner-size
Fix/debug miner size
2020-03-18 21:00:16 +01:00
Łukasz Magiera ff5a6773b1 Merge pull request #1419 from filecoin-project/feat/update-to-latest-go-fil-markets
update to latest go-fil-markets
2020-03-18 20:58:51 +01:00
laser 366db2f38c adjust import order as per PR feedback 2020-03-18 12:43:06 -07:00
laser 4458d090b3 tidy 2020-03-18 11:57:32 -07:00
laser f59bf6fab1 wire up dtypes.ClientDatastore 2020-03-18 11:57:22 -07:00
laser a8dd6a831c implement storage client and provider node adapters 2020-03-18 11:37:32 -07:00
Łukasz Magiera 14e387e3ac Merge pull request #1418 from filecoin-project/asr/cli
Add a minor detail to the FAQs
2020-03-18 19:07:27 +01:00
Łukasz Magiera b2d4d37539 Merge pull request #1416 from filecoin-project/feat/import-data-usage
Feat/import data usage
2020-03-18 19:06:37 +01:00
laser 6622576cf8 update retrieval provider node adapter to new API 2020-03-18 10:53:06 -07:00
laser ec3e86ad18 update retrieval client node adapter to new API 2020-03-18 10:44:54 -07:00
laser eacf991bb2 update go-fil-markets dependency 2020-03-18 10:21:50 -07:00
Aayush Rajasekaran 163527a021 Merge pull request #1313 from filecoin-project/asr/spam
Re: #1302: Refine invalid message filtering
2020-03-18 03:24:12 -04:00
Aayush Rajasekaran 6fda3c877e Re: #1302: Refine invalid message filtering
- This commit slightly weakens the current invalid message check
- The behaviour is that if you can't add a message to your pool, you *probably* won't broadcast it to your peers
- The exceptions are that you will broadcast a message if you fail to validate it because nonce / balance lookup fails
- This commit also lowers the invalid message log to debug (to lessen the annoyance of several invalid messages coming in, and hopefully to prevent confusion among node operators)
2020-03-18 03:14:18 -04:00
Aayush Rajasekaran 4dfe467e66 Merge pull request #1383 from filecoin-project/asr/actoraddress
New Actor Addresses should be generated as per spec
2020-03-18 03:10:42 -04:00
Aayush Rajasekaran 993505b461 Enable full validation tests 2020-03-18 02:57:11 -04:00
Aayush Rajasekaran f22f427cde Put the correct error into ExecutionResult 2020-03-18 02:57:11 -04:00
Aayush Rajasekaran 51cf5d5f1b New Actor Addresses should be generated as per spec
- The pubkey address address of the sender should be used, not the ID address
- We should use the internal callSeqNum as input (was hard-coded to zero)
- The external message nonce should be used, not the actor's nonce in the post-increment state
2020-03-18 02:57:11 -04:00
Whyrusleeping 8d0b2947d6 Merge pull request #1409 from filecoin-project/feat/proofs-v24
Update to v24 params
2020-03-17 22:24:52 -07:00
whyrusleeping 66a950942e add a usage text to import-data command 2020-03-17 22:08:14 -07:00
Whyrusleeping df0a19d5c4 Merge pull request #1413 from filecoin-project/feat/single-graphsync
unified graphsync instance
2020-03-17 22:07:21 -07:00
Łukasz Magiera d8c8832a37 stores: fix StorageList 2020-03-18 05:40:25 +01:00
whyrusleeping 24fb72f926 Set minimum miner size to 2048 bytes in debug mode 2020-03-17 20:30:55 -07:00
Łukasz Magiera 5f2caffb51 Fix tests after specs-storage changes 2020-03-18 02:08:11 +01:00
hannahhoward f259bc6a09 feat(graphsync): unified graphsync instance
setup a single graphsync that loads from both the chainstore & client blockstore
2020-03-17 17:25:12 -07:00
Łukasz Magiera d8ce5078d9 Use new specs-storage interface 2020-03-17 21:19:52 +01:00
Łukasz Magiera de1c984b48 workers: Handle init on first run 2020-03-16 19:46:02 +01:00
Łukasz Magiera 9e6ec71520 Merge pull request #1402 from filecoin-project/fix/jsonrpc-resanderr
Fix Error and Result being returne at the same time in JSON-RPC
2020-03-16 19:31:48 +01:00
Łukasz Magiera 7e997e40f3 workers: Simple storage diagnostics 2020-03-16 18:50:07 +01:00
Łukasz Magiera 416a0d2722 Merge branch 'feat/proofs-v24' into feat/new-workers 2020-03-16 10:45:22 +01:00
Łukasz Magiera 1f9fdf0c5c gofmt 2020-03-16 10:43:27 +01:00
Aayush Rajasekaran 77019c547b Add a minor detail to the FAQs 2020-03-15 21:57:46 -04:00
Łukasz Magiera a71906525a seed: Support parsing string sector-size 2020-03-15 21:42:44 +01:00
Łukasz Magiera 630df050c0 bench: Option to skip commit2 2020-03-15 18:48:53 +01:00
Jakub Sztandera 06ce4f21c5 Warn on non zero result with error
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-14 15:08:24 +01:00
Łukasz Magiera 1bc55714ed Update to v24 params 2020-03-14 03:45:44 +01:00
Łukasz Magiera f4bf6ee186 Merge pull request #1408 from jimpick/fix/websocket-upgrade-case
Make websocket connection upgrade header check case-insensitive
2020-03-13 22:28:33 +01:00
Jim Pick b6d5ea629b Make websocket connection upgrade header check case-insensitive
I was having troubles configuring an nginx reverse-proxy when
using Websockets.

It turns out my configuration was sending a "Connection: upgrade"
header, but Lotus expected "Connection: Upgrade".

This commit converts the check to be case-insensitive.

Some of the examples on the MDN page show lower-case "upgrade",
so I think it's not unusual for the usage to vary.
2020-03-13 13:07:39 -07:00
Łukasz Magiera e6ec20b4ca Merge branch 'testnet/3' into feat/new-workers 2020-03-13 17:58:13 +01:00
Łukasz Magiera 96730bae75 workers: Report sectors paths after worker creates them 2020-03-13 17:54:55 +01:00
Łukasz Magiera 2c7f579838 workers: Implement SectorIndex 2020-03-13 12:59:19 +01:00
Łukasz Magiera a75ad492f1 workers: Declare sectors after fetching in remote store 2020-03-13 11:40:24 +01:00
Łukasz Magiera bc7fede68b workers: Wire up most pieces 2020-03-13 02:37:38 +01:00
Łukasz Magiera 86871e5abc workers: Basic Remote store 2020-03-13 01:23:05 +01:00
Frrist 7371274ea7 update chain-validation: adds miner workflow test (#1403)
* update chain-validation. adds miner workflow test
* replace real sealing with mocked impl
2020-03-12 10:22:45 -07:00
Łukasz Magiera 56968d858c workers: Make LocalWorker public 2020-03-11 22:23:16 +01:00
Whyrusleeping 954085d33e Merge pull request #1404 from filecoin-project/asr/segfault
Bugfix: Check if vmctx is nil before dereferencing in ApplyMessage
2020-03-11 13:29:33 -07:00
Aayush Rajasekaran 4777ca21c3 Bugfix: Check if vmctx is nil before dereferencing in ApplyMessage 2020-03-11 15:42:51 -04:00
Jakub Sztandera 21b34ba133 Fix chan handling
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-11 19:14:49 +01:00
Jakub Sztandera 8d870a03b5 Fix Error and Result being returne at the same time in JSON-RPC
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-11 18:48:02 +01:00
Whyrusleeping a0f1c8c87f Merge pull request #1397 from filecoin-project/feat/interoptnet
new interoptnet
2020-03-11 01:06:13 -07:00
Travis Person 66add465bd new interoptnet 2020-03-11 08:02:15 +00:00
Whyrusleeping ad753c90ff Merge pull request #1396 from filecoin-project/fix/power-deduction
move power deduction out of the loop
2020-03-11 00:30:49 -07:00
whyrusleeping 3d6577838c move power deduction out of the loop 2020-03-11 00:29:17 -07:00
Łukasz Magiera 71afcb0333 workrs: refactor sector store for more composability 2020-03-11 08:22:21 +01:00
Whyrusleeping fb91ea2470 Merge pull request #1389 from filecoin-project/feat/chain-get-raw-type
cli: add cbor-hex type to chain get
2020-03-11 00:10:57 -07:00
Whyrusleeping 4d572d3ae8 Merge pull request #1395 from filecoin-project/deps/update-specs-actors-2
update specs actors with post and cron fixes
2020-03-11 00:09:43 -07:00
whyrusleeping 3971bf0c99 update specs actors with post and cron fixes 2020-03-11 00:08:51 -07:00
Whyrusleeping 9bad73b995 Merge pull request #1388 from filecoin-project/fix/nonce-before-gas
Check for correct nonce before taking gas
2020-03-10 23:58:28 -07:00
Whyrusleeping d48d073bcf Merge pull request #1394 from filecoin-project/fix/fallbackpost-finally
get fallback post running successfully!
2020-03-10 23:41:41 -07:00
whyrusleeping 16d087cce4 get fallback post running successfully! 2020-03-10 23:30:48 -07:00
Łukasz Magiera 7e2e30f94b workers: Transfer logic refactoring 2020-03-11 06:49:17 +01:00
Łukasz Magiera eb61a36fd7 workers: RPC scaffolding 2020-03-11 02:58:02 +01:00
Whyrusleeping 65506376a4 Merge pull request #1390 from filecoin-project/fix/genesis-double-power-accounting
Don't double account for miner power when setting up genesis blocks
2020-03-10 18:56:47 -07:00
Whyrusleeping d4c0dfa851 Merge pull request #1392 from jsign/jsign/addDealId
Add DealID to DealInfo
2020-03-10 18:45:07 -07:00
Ignacio Hagopian 07df6e010f add dealID in DealInfo
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2020-03-10 21:48:55 -03:00
Travis Person 6faffd832c cli: add cbor-hex type to chain get 2020-03-10 23:12:10 +00:00
Whyrusleeping 61e5b05262 Merge pull request #1386 from filecoin-project/fix/replay-not-found
dont panic when replay fails to find a message
2020-03-10 15:52:40 -07:00
Whyrusleeping f8f0d7def7 Merge pull request #1387 from filecoin-project/misc/less-errors
Less noisy mapool add
2020-03-10 15:50:01 -07:00
whyrusleeping 14f9724bc9 Don't double account for miner power when setting up genesis blocks 2020-03-10 15:42:41 -07:00
Jakub Sztandera f3c4288311 Check for correct nonce before taking gas
Otherwise as a miner you are able to include an invalid message forever
and get whole GasLimit of gas from it every time.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-10 21:14:50 +01:00
Jakub Sztandera cc7d25394c Less noisy mapool add
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-10 21:06:58 +01:00
whyrusleeping baca881473 dont panic when replay fails to find a message 2020-03-10 12:44:50 -07:00
Whyrusleeping da52596d79 Merge pull request #1382 from filecoin-project/feat/interoptnet
new interoptnet
2020-03-09 23:48:24 -07:00
whyrusleeping 1beab85d61 Drop debug messages 2020-03-09 23:46:13 -07:00
Travis Person d19f5e411c new interoptnet 2020-03-10 06:45:26 +00:00
Łukasz Magiera eeca91e43d Merge pull request #1381 from filecoin-project/feat/stats-nosync
stats: add flag to disable sync wait
2020-03-10 07:12:52 +01:00
Travis Person e9a7c8c7fa stats: add flag to disable sync wait 2020-03-10 06:10:16 +00:00
Łukasz Magiera a9dc2aa58b Merge pull request #1375 from filecoin-project/feat/mpool-debug-future
mpool: add debug logs for future detection
2020-03-10 07:02:41 +01:00
Łukasz Magiera 238d022d8d Merge pull request #1380 from filecoin-project/feat/update-specs-actors
update to latest specs-actors
2020-03-10 07:02:11 +01:00
whyrusleeping bccec5af95 update to latest specs-actors 2020-03-09 22:43:43 -07:00
Travis Person 0fe55f81f6 mpool: add debug logs for future detection 2020-03-10 05:41:24 +00:00
Whyrusleeping 7b5e7178f4 Merge pull request #1369 from filecoin-project/fix/reward-ticket-count
pass ticket count into reward application message
2020-03-09 22:35:46 -07:00
Whyrusleeping 8be9134e32 Merge pull request #1378 from filecoin-project/feat/clean-up-spec-shim
squash the spec shim and the vmcontext into the new runtime type
2020-03-09 22:28:07 -07:00
whyrusleeping 85e17fa5b0 fix state cid accounting after 'Transaction' calls 2020-03-09 22:20:46 -07:00
whyrusleeping 114cb2d2aa squash the spec shim and the vmcontext into the new runtime type 2020-03-09 21:44:29 -07:00
Łukasz Magiera 69a854de8b Merge pull request #1377 from filecoin-project/feat/enable-32gb-sectors
fountain: add 32GiB sectors
2020-03-10 03:24:45 +01:00
Travis Person c655162dd6 fountain: add 32GiB sectors 2020-03-10 02:21:37 +00:00
Łukasz Magiera dcd12bff7c Merge pull request #1376 from filecoin-project/feat/shed-ncfix-auto
shed: auto mode for nonce-fix
2020-03-10 03:01:37 +01:00
Łukasz Magiera 47e3b5b902 shed: make non-auto nonce-fix safer 2020-03-10 02:11:07 +01:00
Łukasz Magiera 2bf9f10f16 mpool stat: sort by address 2020-03-10 01:44:15 +01:00
Łukasz Magiera 9daaaa3ec2 shed: corect start nonce in nc-fix 2020-03-10 01:28:59 +01:00
Łukasz Magiera e396454138 shed: auto mode for nonce-fix 2020-03-10 01:26:10 +01:00
Łukasz Magiera 5d6d75f546 Merge pull request #1373 from filecoin-project/fix/amgr-races
storage: Improve thread safety
2020-03-09 23:11:17 +01:00
Łukasz Magiera 26374e2644 cli: Handle sighup 2020-03-09 23:03:33 +01:00
Łukasz Magiera 0c3f4eb7dd storageminer: Create dir with --init 2020-03-09 23:00:29 +01:00
Łukasz Magiera f3798f9d40 Merge pull request #1374 from filecoin-project/fix/state-power-json
make state power a pointer so it marshals properly
2020-03-09 22:48:53 +01:00
Łukasz Magiera 24956a49f4 gofmt 2020-03-09 22:47:58 +01:00
Łukasz Magiera 0c2af7a8ee repo: Fix fsrepo.SetStorage on init 2020-03-09 22:46:17 +01:00
whyrusleeping 26ca72e252 make state power a pointer so it marshals properly 2020-03-09 14:41:57 -07:00
Łukasz Magiera fe85c4111a update sectorbuilder with precommit1 mkdir fix 2020-03-09 22:13:13 +01:00
Łukasz Magiera b3d8273a03 storage: Referance path struct by pointer 2020-03-09 20:41:05 +01:00
Łukasz Magiera 01087e01d2 storage: Improve thread safety 2020-03-09 20:22:30 +01:00
Łukasz Magiera 946fff39a6 chainwatch: Fix message index creation 2020-03-09 19:18:30 +01:00
Whyrusleeping 70552e3e0d Merge pull request #1368 from filecoin-project/feat/build-cleanup
build: Remove unused vars, fix debug build
2020-03-09 11:03:27 -07:00
Łukasz Magiera f8159dcbfc Merge pull request #1372 from filecoin-project/fix/lint-not-working
Update golangci lint to resolve some files not being linted
2020-03-09 16:48:24 +01:00
Jakub Sztandera b6880c5f50 Update golangci lint to resolve some files not being linted
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-03-09 13:25:26 +01:00
Łukasz Magiera 2eb06760a3 Merge pull request #1371 from filecoin-project/feat/update
interopnet: pull lastest master
2020-03-09 09:43:15 +01:00
Łukasz Magiera 06d18484f6 Merge remote-tracking branch 'origin/master' into feat/update 2020-03-09 09:34:31 +01:00
Łukasz Magiera 5902daf3b5 chainwatch: Add to/from message indexes 2020-03-09 09:34:04 +01:00
whyrusleeping f1ff55f8b6 pass ticket count into reward application message 2020-03-09 00:45:40 -07:00
Whyrusleeping e6ba4a227a Merge pull request #1367 from filecoin-project/feat/chainget-hamtaddr
chain get: hamt-address type
2020-03-09 00:05:32 -07:00
Łukasz Magiera 72bf00bf00 circle: test debug build 2020-03-09 08:01:59 +01:00
Łukasz Magiera 1647798396 build: Remove unused vars, fix debug build 2020-03-09 07:54:29 +01:00
Łukasz Magiera 13a8e2c09d chain get: hamt-address type 2020-03-09 07:45:24 +01:00
Łukasz Magiera 2ff4a2846b Merge pull request #1366 from filecoin-project/fix/set-price-units
Add units to set price command
2020-03-09 07:28:42 +01:00
Łukasz Magiera 6981cfb8bc Merge pull request #1365 from filecoin-project/feat/miner-storage-add
storageminer: 'storage attach' command
2020-03-09 07:28:11 +01:00
Łukasz Magiera 0b14ab8000 fountain: Fix miner wait page title 2020-03-09 07:27:07 +01:00
whyrusleeping 33aa9bd03f Add units to set price command 2020-03-08 23:22:11 -07:00
Łukasz Magiera 1cf26fc652 repo: Implement memrepo.SetStorage 2020-03-09 07:21:42 +01:00
Łukasz Magiera c10142816e Merge pull request #1363 from filecoin-project/feat/cwatch-update
Update chainwatch
2020-03-09 07:16:40 +01:00
Whyrusleeping f9c38ac35e Merge pull request #1362 from filecoin-project/fix/no-storage-init
storageminer: Correctly initialize storage.json with --no-local-storage
2020-03-08 23:16:20 -07:00
Whyrusleeping 93137b02be Merge pull request #1364 from filecoin-project/feat/no-path-storage
storage: Allow starting with no paths
2020-03-08 23:15:53 -07:00
Łukasz Magiera 33fcf8eb44 gofmt, mod tidy 2020-03-09 07:13:45 +01:00
Łukasz Magiera c87ebe8590 storageminer: storage attach cmd 2020-03-09 07:13:22 +01:00
Łukasz Magiera 4b576cde50 storagemgr: Actually set updated config in AddLocalStorage 2020-03-09 06:56:32 +01:00
Łukasz Magiera f01e8bc509 storage: Allow starting with no paths 2020-03-09 06:52:12 +01:00
Łukasz Magiera 7c94f2f3be storageminer: Correctly initialize storage.json with --no-local-storage 2020-03-09 06:45:12 +01:00
Łukasz Magiera a46296d340 Update chainwatch 2020-03-09 06:43:32 +01:00
Łukasz Magiera bf1d3579c1 Merge pull request #1361 from filecoin-project/feat/interoptnet
New interopt network info
2020-03-09 06:17:14 +01:00
Travis Person ba0c667cad New interopt network info 2020-03-09 05:12:53 +00:00
Whyrusleeping 3a94d9d176 Merge pull request #1354 from filecoin-project/feat/state-compute-trace
implement compute state trace output
2020-03-08 21:22:40 -07:00
Whyrusleeping 4aa0669e61 Merge pull request #1360 from filecoin-project/feat/more-chain-get-types
Add more chain get types
2020-03-08 21:22:30 -07:00
whyrusleeping bf6948f8d6 update to latest specs-actors 2020-03-08 21:21:46 -07:00
Travis Person 9216a1eb07 Add more chain get types 2020-03-09 03:16:43 +00:00
whyrusleeping 4260cc38c9 implement compute state trace output 2020-03-08 20:07:25 -07:00
Łukasz Magiera 697ab30304 Merge pull request #1328 from filecoin-project/metrics/rework-default-view
remove high cardinality tags from metrics
2020-03-08 21:40:16 +01:00
Łukasz Magiera 85f01e4ded Merge pull request #1355 from filecoin-project/fix/fpost-again
Fix fallback post scheduling to hopefully do the right thing
2020-03-08 21:36:48 +01:00
whyrusleeping ab51c7e2d2 Fix fallback post scheduling to hopefully do the right thing 2020-03-08 00:19:38 -08:00
Łukasz Magiera cb1e797d72 Merge pull request #1353 from filecoin-project/feat/merge-master
Merge master back into testnet/3
2020-03-08 09:05:46 +01:00
whyrusleeping 24bf720a9a Merge branch 'master' into testnet/3 2020-03-07 16:46:12 -08:00
Whyrusleeping c553a6f458 Merge pull request #1349 from filecoin-project/feat/chain-get-types
add some type info to chain get
2020-03-07 16:10:00 -08:00
Łukasz Magiera bd708fa205 Merge pull request #1347 from filecoin-project/fix/reward-balance
fix initial reward actor balance
2020-03-07 07:10:15 +01:00
Łukasz Magiera 9c75c1365f Merge pull request #1351 from filecoin-project/fix/fpost
fixup fallback post
2020-03-07 06:41:10 +01:00
whyrusleeping f41f324fbc fixup fallback post 2020-03-06 21:26:00 -08:00
Łukasz Magiera b24fb44fba Merge pull request #1350 from filecoin-project/feat/interoptnet-info
interoptnet
2020-03-07 06:25:16 +01:00
Travis Person ea38116571 interoptnet 2020-03-07 03:50:08 +00:00
Whyrusleeping 0b5991850c Merge pull request #1346 from filecoin-project/feat/stat-cmd
Add stat-obj to API and a few extras
2020-03-06 18:55:48 -08:00
whyrusleeping cdd37bda1c add some type info to chain get 2020-03-06 18:47:19 -08:00
whyrusleeping 34ad13fc22 fix initial reward actor balance 2020-03-06 17:33:24 -08:00
Travis Person 1a31571493 lotu-shed: add stateroot stats command 2020-03-07 00:55:11 +00:00
Travis Person ebca777efd cli: export load tipset function 2020-03-07 00:46:20 +00:00
Travis Person 7628a64a55 cmd: add stat-obj 2020-03-07 00:43:44 +00:00
Whyrusleeping 84a887cc58 Merge pull request #1345 from filecoin-project/fix/noop-plan-loop
sealing: Fix noop plan loop
2020-03-06 15:39:52 -08:00
Łukasz Magiera 8f7f2e77c3 Merge pull request #1344 from filecoin-project/asr/debug
fix make debug
2020-03-07 00:07:53 +01:00
Łukasz Magiera a2f4d467fd sealing: Fix noop plan loop 2020-03-07 00:03:57 +01:00
Whyrusleeping f17962182f Merge pull request #1343 from filecoin-project/feat/sb-pc1-mkdir-fix
Update sectorbuilder to fix the mkdir bug in precommit1
2020-03-06 14:38:32 -08:00
Aayush Rajasekaran 55f155a72c fix make debug 2020-03-06 14:31:16 -08:00
Łukasz Magiera a962479ce7 Update sectorbuilder to fix the mkdir bug in precommit1 2020-03-06 23:26:22 +01:00
Łukasz Magiera d70fe95104 Merge pull request #1342 from filecoin-project/fix/miner-init-redux
Fix/miner init redux
2020-03-06 23:24:45 +01:00
whyrusleeping 4101147a5b one more miner init issue 2020-03-06 14:23:21 -08:00
Whyrusleeping 8a6b3cff57 Merge pull request #1317 from filecoin-project/feat/car-import
Add ability to import CAR files and retrieve to a CAR file
2020-03-06 13:27:17 -08:00
hannahhoward eef48c4be3 feat(client): support car to filestore
Store filestore reference for CAR files
2020-03-06 13:14:02 -08:00
hannahhoward 9f5f70a93f feat(client): add car import/export option
adds option on client file import and client retrieval to read/write to CAR file
2020-03-06 13:14:02 -08:00
Whyrusleeping 7662f03629 Merge pull request #1312 from filecoin-project/asr/internal
Re: #1239: Expose information about invoked messages
2020-03-06 12:41:47 -08:00
Łukasz Magiera 3a923e8aae Merge pull request #1340 from filecoin-project/feat/lib-dedupe
Switch to using extracted libs
2020-03-06 20:22:21 +01:00
Aayush Rajasekaran 340afc3503 Add information about internal message executions to SimulationResult
- The VM now tracks a list of ExecutionResults to keep track of internal messages
2020-03-06 11:11:06 -08:00
Aayush Rajasekaran 2d63b007f2 Unify MethodCall and ReplayResults into SimulationResult
- Call and Replay now return the same type, which includes both Message and MessageReceipt
2020-03-06 11:10:40 -08:00
Łukasz Magiera 3cab8bd5d1 gofmt 2020-03-06 20:01:28 +01:00
Łukasz Magiera 3d1a5f4bf3 libs: Use go-statemachine 2020-03-06 20:01:03 +01:00
Łukasz Magiera 79237a9309 libs: Remove rlepluslazy (using specs-actors everywhere) 2020-03-06 19:52:38 +01:00
Łukasz Magiera e51fa5c9ac libs: Use zerocomm from sectorbuilder 2020-03-06 19:50:41 +01:00
Łukasz Magiera 61802b9d42 Merge pull request #1334 from filecoin-project/feat/miner-rewards-cmd
add command to inspect and redeem block rewards
2020-03-06 19:05:03 +01:00
Łukasz Magiera 38241d66cb Merge branch 'testnet/3' into feat/miner-rewards-cmd 2020-03-06 19:04:36 +01:00
Łukasz Magiera b019e41f1c Merge pull request #1339 from filecoin-project/fix/fountain-create-miner-return
fountain: decode create miner results correctly
2020-03-06 09:14:05 +01:00
Łukasz Magiera ea0dcdcfac Merge pull request #1338 from filecoin-project/fix/miner-init
fix storage miner init logic
2020-03-06 09:11:27 +01:00
Whyrusleeping 05a95cace5 Merge pull request #1336 from filecoin-project/vet/some-go-vet-fixes
some go vet fixes
2020-03-06 00:11:13 -08:00
Whyrusleeping 30d28a942e Merge pull request #1335 from filecoin-project/feat/update-sb-ffi
Update FFI
2020-03-06 00:10:53 -08:00
Travis Person 277c037676 fountain: decode create miner results correctly 2020-03-06 08:08:07 +00:00
whyrusleeping 09c543c526 fix storage miner init logic 2020-03-06 00:06:59 -08:00
Łukasz Magiera b15c476698 node_test: set sector counters in repo 2020-03-06 08:47:03 +01:00
Whyrusleeping 3e67ca855a Merge pull request #1337 from filecoin-project/feat/testnet3-reduce-minimum
Reduce minimum to 2GiB
2020-03-05 23:19:40 -08:00
Travis Person bc5cd3c2a1 reduce minimum to 2GiB 2020-03-06 07:17:28 +00:00
whyrusleeping 16096e2c71 some go vet fixes 2020-03-05 22:46:07 -08:00
Łukasz Magiera 52d0ecd977 mod tidy 2020-03-06 07:08:22 +01:00
whyrusleeping 0b9c770b4e mod tidy 2020-03-05 21:49:41 -08:00
Łukasz Magiera 7d3e16986c sectorbuilder type updates 2020-03-06 06:38:59 +01:00
whyrusleeping 1183e082af add command to inspect and redeem block rewards 2020-03-05 21:32:52 -08:00
Łukasz Magiera ec00636b52 Update FFI 2020-03-06 05:54:43 +01:00
Łukasz Magiera 1a2eb56b54 Merge pull request #1332 from filecoin-project/Stebalien-chore/update-deps
chore(dep): update dependencies
2020-03-06 05:47:02 +01:00
Łukasz Magiera e0d0d49ea0 Merge branch 'testnet/3' of github.com:filecoin-project/go-lotus into testnet/3 2020-03-06 01:43:13 +01:00
Łukasz Magiera ac3d0dc30c Config fauces for inteop devnet 2020-03-06 01:42:59 +01:00
whyrusleeping 56cb88819c add 512MB params to testnet in non-debug mode 2020-03-05 16:41:06 -08:00
Steven Allen 6992fd4dba chore(dep): update dependencies
Updates:

* cid, multihash, and multiaddr to ensure that minimal varints are used.
* log to deduplicate some code between version 2 and version 1.
* multistream to avoid writing from multiple threads.
* badger/datastore to harden prefix handling in queries.
* libp2p to 0.5.2

BREAKING:

The new libp2p version now formats addresses with /p2p instead of /ipfs. /ipfs
multiaddrs are still supported.
2020-03-05 16:28:42 -08:00
Łukasz Magiera 4244ab72d5 Merge pull request #1331 from filecoin-project/deps/update-specs-actors
update to latest specs-actors
2020-03-06 01:24:55 +01:00
whyrusleeping 8a7f249aaa update to latest specs-actors 2020-03-05 16:20:57 -08:00
Łukasz Magiera 0ef6c756b6 Merge pull request #1305 from filecoin-project/feat/4stage-seal
Begin work on integrating new sectorbuilder interfaces
2020-03-06 00:59:42 +01:00
Łukasz Magiera 1c052b7c81 Merge remote-tracking branch 'origin/testnet/3' into feat/4stage-seal 2020-03-06 00:59:12 +01:00
Łukasz Magiera a5c6d83cd9 gofmt; mod tidy 2020-03-05 23:43:41 +01:00
Łukasz Magiera d10b84d8cd worker: Fix build 2020-03-05 23:40:40 +01:00
Łukasz Magiera 16cb27b5f9 Get node_test to pass 2020-03-05 23:27:30 +01:00
Łukasz Magiera 1461e475da storage: Support adding paths at runtime 2020-03-05 23:02:01 +01:00
Whyrusleeping 71c87ac32f Merge pull request #1329 from filecoin-project/frrist/enable-gas-tracking
Frrist/enable gas tracking
2020-03-05 13:51:27 -08:00
frrist b8394c3573 update, you guessed it, chain-validation 2020-03-05 13:41:35 -08:00
frrist 00f5ee6064 add TODO for return value checking 2020-03-05 13:41:35 -08:00
frrist f4b07a7293 enable multisig tests 2020-03-05 13:41:35 -08:00
frrist a34a6c65e7 fix gas limit check in apply message 2020-03-05 13:41:35 -08:00
frrist 4e41479464 bls key deterministic, enable paych test 2020-03-05 13:41:35 -08:00
Frrist e4728eb719 update chain-val with latest tests (#1325)
* update chain-val with latest tests
2020-03-05 13:39:28 -08:00
Whyrusleeping 1a0bcfe018 Merge pull request #1326 from filecoin-project/asr/cli
Re: #1307: Provide ArgsUsage for all CLI commands
2020-03-05 13:11:04 -08:00
whyrusleeping 2cd06e3ea0 update to latest specs-actors 2020-03-05 13:02:33 -08:00
Łukasz Magiera a5e5918fc5 mod tidy; gofmt 2020-03-05 20:21:06 +01:00
Łukasz Magiera fa5bc3a5a9 Merge remote-tracking branch 'origin/testnet/3' into feat/4stage-seal 2020-03-05 20:20:47 +01:00
Łukasz Magiera 7d95e134eb storageminer: Print what we can in info cmd 2020-03-05 19:26:05 +01:00
Łukasz Magiera f06bf6721e sealmgr: Implement all sealing steps 2020-03-05 19:19:32 +01:00
Adrian Lanzafame d0c748460e remove high cardinality tags from metrics 2020-03-05 19:47:20 +10:00
Łukasz Magiera 4beed065b6 sealmgr: Working local addpiece 2020-03-05 03:18:22 +01:00
Łukasz Magiera 0760968a3b Merge pull request #1327 from filecoin-project/fix/reward-actor
Fix/reward actor
2020-03-05 02:53:50 +01:00
whyrusleeping eef3aaee60 mod tidy 2020-03-04 17:42:13 -08:00
whyrusleeping 4e9e3f3dc3 make state tree snapshots properly stack based 2020-03-04 17:19:15 -08:00
Łukasz Magiera c91d970c41 storageminer: Init with default local storage 2020-03-05 02:12:52 +01:00
Aayush Rajasekaran e9afba3490 Add ArgsUsages to the CLI where missing
- This commit also standardises some notation
2020-03-04 16:58:46 -08:00
Aayush Rajasekaran f2c518455e Improve UX when importing keys into wallet using CLI 2020-03-04 16:57:03 -08:00
Łukasz Magiera 7db1dd52bd storagemgr: Wire up most of AddPiece logic 2020-03-05 01:38:07 +01:00
Łukasz Magiera 76698fe2db jsonrpc: Don't try to reconnect on the server side 2020-03-05 01:34:29 +01:00
whyrusleeping 5076b2b950 fix reward actor and block reward application 2020-03-04 13:21:24 -08:00
Łukasz Magiera e483383a44 node: wire up new storage manager 2020-03-04 20:42:49 +01:00
Łukasz Magiera 799ff17c7c Merge remote-tracking branch 'origin/testnet/3' into feat/4stage-seal 2020-03-04 06:37:11 +01:00
Łukasz Magiera 1d3877fab3 sync: Use correct epost randomness 2020-03-04 06:32:33 +01:00
Łukasz Magiera f50e26e5dd update sectorbuilder 2020-03-04 06:32:13 +01:00
whyrusleeping 37d5baf0b2 fix blocks topic 2020-03-03 21:03:35 -08:00
Łukasz Magiera 9bf4aa7546 Merge pull request #1321 from filecoin-project/feat/chainwatch-miner-heads-stateroot-index
chainwatch: add stateroot index on miner_heads
2020-03-04 05:55:46 +01:00
Travis Person 9b98ef5de4 chainwatch: add stateroot index on miner_heads 2020-03-04 04:50:53 +00:00
Łukasz Magiera 4e46d00eb6 Merge remote-tracking branch 'origin/testnet/3' into feat/4stage-seal 2020-03-04 04:01:13 +01:00
Łukasz Magiera dcf5fb36f3 Merge pull request #1242 from filecoin-project/feat/offline-deal-making
Feat/offline deal making
2020-03-04 03:53:52 +01:00
whyrusleeping 9169a073b6 add miner side commands and a few other goodies 2020-03-03 18:49:00 -08:00
Łukasz Magiera 12d870e274 sealmgr: Read only multi-path file manager 2020-03-04 03:24:08 +01:00
whyrusleeping 52acfb88ee use proper manual piece and size setting 2020-03-03 18:19:28 -08:00
whyrusleeping 2be2891647 wire up lotus side of make deal for manual commP 2020-03-03 16:18:08 -08:00
whyrusleeping 99c842e027 integrate client interface to allow for offline deals 2020-03-03 16:18:08 -08:00
Whyrusleeping e7f6554c68 Merge pull request #1318 from filecoin-project/fix/net-cmds
fix a few libp2p related problems
2020-03-03 16:10:34 -08:00
Whyrusleeping 0025b3c1dc Merge pull request #1300 from filecoin-project/frrist/chainval-integrate
implement chain-validation driver
2020-03-03 16:10:16 -08:00
Whyrusleeping 08ce9258d1 Merge pull request #1315 from filecoin-project/conform-protocol-names-to-spec
conform protocol ids to spec
2020-03-03 16:08:50 -08:00
whyrusleeping 7b11224130 go mod updates, and a couple small fixes 2020-03-03 16:07:27 -08:00
whyrusleeping 0da2f81252 get most of the chain validation tests passing 2020-03-03 16:06:41 -08:00
frrist 1c864d1eef fixs after rebase 2020-03-03 16:06:41 -08:00
whyrusleeping 8657b4698f fix invoker tests 2020-03-03 16:06:41 -08:00
frrist dfad346cff add test skipper and update chain-validation 2020-03-03 16:06:41 -08:00
whyrusleeping 0f6c365411 Do proper shimming for chain validation library 2020-03-03 16:06:41 -08:00
frrist bd91008462 clean up validation config 2020-03-03 16:06:41 -08:00
frrist 72132c851b update chain-validation version for miner creation 2020-03-03 16:06:41 -08:00
frrist 0de43748f7 better test name 2020-03-03 16:06:41 -08:00
frrist b60458d236 implement chain-validation driver 2020-03-03 16:06:41 -08:00
Whyrusleeping 8f1bf7a0ed Merge pull request #1320 from filecoin-project/feat/fix-signature-verification
Fix signature verification in adapters
2020-03-03 16:01:05 -08:00
whyrusleeping 33ca9dabef mod tidy 2020-03-03 15:50:45 -08:00
whyrusleeping d6723935b9 fixup to match spec, move constants to common location 2020-03-03 15:48:25 -08:00
Łukasz Magiera a0dbb6bdd6 Storage Manager refactor 2020-03-03 23:19:22 +01:00
hannahhoward 72c0dbd8e5 fix(markets): fix sig verification
fix handling of signatures in the adapters
2020-03-03 13:23:06 -08:00
Whyrusleeping 41bf668189 Merge pull request #1294 from natewalck/more-opencensus-metrics
More opencensus metrics
2020-03-03 12:02:13 -08:00
whyrusleeping c51a83b404 fix a few libp2p related problems 2020-03-02 20:55:25 -08:00
hannahhoward 9beacabd66 fix(paychmgr): Fix issues with payment channels
Load full addresses for payment channels so they can be signed, fixes bugs with saving vouchers and
catching duplicates, updates to version of go-fil-markets that solves a retrieval bug to complete
retrieval deal
2020-03-02 18:15:32 -08:00
lanzafame 4f2baa8953 conform protocol ids to spec
Signed-off-by: lanzafame <adrianlanzafame92@gmail.com>
2020-03-03 11:34:43 +10:00
Łukasz Magiera 3abb59a550 sealmgr: Interfaces; simple initial impl 2020-03-03 01:46:58 +01:00
Łukasz Magiera 2cca6ab3db Merge pull request #1314 from filecoin-project/feat/storage-miner-default-worker-count
Reduce default storage miner worker count
2020-03-03 00:30:46 +01:00
Travis Person c362d75a38 Reduce default storage miner worker count
The current default worker count of 5 can result in high memory usage of
the lotus-storage-miner process when a user starts multiple sector
pledges within a short time of each other and can result in the process
being killed for OOM.

Reducing the worker count to 2 will provide a safer default.
2020-03-02 23:28:05 +00:00
Jim bce50a802b Merge pull request #1308 from filecoin-project/asr/clidocs
Documentation updates
2020-03-01 21:46:06 -08:00
whyrusleeping 61fcbd1664 remove unnecessary cid casting 2020-03-01 20:38:18 -08:00
Aayush Rajasekaran e1570eedf3 Add a section for the CLI to lotu.sh 2020-03-01 20:30:17 -08:00
Aayush Rajasekaran 06ea2f573e Correct some sync info on lotu.sh 2020-03-01 20:30:17 -08:00
whyrusleeping ca882725ce fixup imports 2020-03-01 17:15:18 -08:00
whyrusleeping 60b19c51ef more misc fixes 2020-03-01 17:09:38 -08:00
Nate Walck 65cd13301c Add ReceivedFrom to block validation failure metrics 2020-03-01 20:01:52 -05:00
Nate Walck 8283bb994a Add block metrics to incoming pubsub validate funcs 2020-03-01 19:57:16 -05:00
Nate Walck 33af2409e8 Use head notif func for current node height, add pubsub metrics 2020-03-01 19:26:09 -05:00
Łukasz Magiera 98dbb2f70f bench: set correct registered proofs on things 2020-03-01 22:05:13 +01:00
Łukasz Magiera f4310e8f69 bench: set sector size in saved commit2 inputs 2020-03-01 05:26:10 +01:00
Łukasz Magiera 3c7880cc10 Merge pull request #1292 from filecoin-project/asr/clisign
Re: #1290: Add sign and verify CLI commands
2020-03-01 04:50:33 +01:00
Łukasz Magiera ee3e631b1a bench: Prove command 2020-03-01 03:52:46 +01:00
Łukasz Magiera 4521ff3e95 Merge pull request #1306 from filecoin-project/fix/payment-channel-specs-actors
Fix issues with payment channels
2020-03-01 03:31:18 +01:00
hannahhoward fed548623d fix(deps): update go-fil-markets 2020-02-28 19:32:33 -08:00
hannahhoward bda5315866 fix(paychmr): decode address correctly, pass wallet 2020-02-28 19:26:33 -08:00
hannahhoward 0d7afef0c5 fix(paychmgr): add to paych serialziation 2020-02-28 19:26:33 -08:00
Łukasz Magiera 342e85d378 bench: flag to save commit2 input 2020-02-29 03:31:25 +01:00
Łukasz Magiera 9794c04b94 Update sectorbuilder with Fr fix 2020-02-29 03:31:14 +01:00
Łukasz Magiera f54a555aa8 Merge remote-tracking branch 'origin/testnet/3' into feat/4stage-seal 2020-02-29 03:21:01 +01:00
Łukasz Magiera fa245c1e53 Merge pull request #1299 from filecoin-project/feat/update-sectorbuilder
Update lotus to use v23 proofs
2020-02-29 03:14:19 +01:00
whyrusleeping 194093469a fix subtool builds 2020-02-28 18:05:19 -08:00
whyrusleeping c7508a0512 self review fixes 2020-02-28 18:02:40 -08:00
whyrusleeping 1a07cb7bbf a few more fixes 2020-02-28 17:12:47 -08:00
whyrusleeping cf2eefdfbe Fix up client storage deal matcher 2020-02-28 16:05:56 -08:00
Aayush Rajasekaran fe8db295e7 Re: #1290: Add a lotus wallet verify API and CLI command
- The command takes an address, message, and signature, and returns true if the sig is valid
2020-02-28 15:56:15 -08:00
Aayush Rajasekaran f6bda96d5a Re: #1290: Add a lotus wallet sign CLI command
- The command takes an address and a message (in hex) and prints out a signature of the msg
2020-02-28 15:56:00 -08:00
whyrusleeping 115167659d tidy that mod go 2020-02-28 14:02:54 -08:00
whyrusleeping 713059275d progress is made incrementally 2020-02-28 14:00:34 -08:00
whyrusleeping 5b657a2905 pass on proper sector types 2020-02-28 12:52:14 -08:00
whyrusleeping b03d2e2f9e un go-mod hack things, integrate newly merged fixes 2020-02-28 11:31:28 -08:00
whyrusleeping 0945d8725e fixing miner logic to make more tests pass 2020-02-28 11:31:28 -08:00
Łukasz Magiera 2a1253e45a types: Simplify Ticket.Equals 2020-02-28 11:31:28 -08:00
Henri S 96555aa74b update to use VRF digest appropriately and simplify drawing rand past genesis 2020-02-28 11:31:28 -08:00
hannahhoward 44f73103db fix(markets): detect storage deal active correctly
Use SectorStartEpoch to determine if a deal is active, rather than Proposal.StartEpoch
2020-02-28 11:31:28 -08:00
Łukasz Magiera 5a4f917c60 4-stage v23 lotus-bench 2020-02-28 19:06:59 +01:00
Łukasz Magiera e1aa4d6265 Merge pull request #1295 from filecoin-project/patch/specRand
Patch/spec rand
2020-02-28 18:23:54 +01:00
Łukasz Magiera 43bcae17b3 types: Simplify Ticket.Equals 2020-02-28 18:21:22 +01:00
Łukasz Magiera d5b8defcbb Begin work on integrating new sectorbuilder interfaces 2020-02-28 18:17:40 +01:00
Nate Walck 7db39115e8 Fixed ctx issue, changed to track failures instead of success 2020-02-27 23:43:52 -05:00
Łukasz Magiera a97e7ea52a Merge pull request #1303 from filecoin-project/feat/stats-head-buffer
stats: add small head change buffer to reduce collecting extraneous stats from small reorgs
2020-02-28 04:13:50 +01:00
Travis Person 7f731db9dd stats: add small head change buffer to reduce collecting extraneous stats from small reorgs 2020-02-28 03:01:23 +00:00
Nate Walck 353c5d8b12 Relocation opencensus metrics to its own package and add more node stats 2020-02-27 21:49:18 -05:00
Whyrusleeping b9c51e359f Merge pull request #1301 from filecoin-project/feat/message-filtering
implement basic message filtering
2020-02-27 17:55:47 -08:00
whyrusleeping 00efd097c7 implement basic message filtering 2020-02-27 17:40:16 -08:00
Łukasz Magiera 4dc35285dd Minimum sector size is now 2k 2020-02-28 01:48:34 +01:00
Łukasz Magiera 9161b865f3 v23 parameters.json 2020-02-28 01:08:43 +01:00
Łukasz Magiera 58f8481a12 sbmock: Set commR with correct cid codec 2020-02-28 00:49:28 +01:00
Łukasz Magiera f83bbc2cbe Regen cbor marshalers 2020-02-28 00:34:48 +01:00
whyrusleeping d8dda1ee66 debugging test failure 2020-02-27 15:14:15 -08:00
whyrusleeping e4dcb7441b fixup lotus-bench 2020-02-27 14:23:05 -08:00
whyrusleeping df6e3e83bf make it all build finally 2020-02-27 13:45:31 -08:00
Łukasz Magiera 01ea48a8fe Merge pull request #1297 from filecoin-project/fix/detect-deal-active-correctly
fix(markets): detect storage deal active correctly
2020-02-27 18:05:07 +01:00
Łukasz Magiera 48619dc238 Merge branch 'feat/update-sectorbuilder' of github.com:filecoin-project/go-lotus into feat/update-sectorbuilder 2020-02-27 01:56:15 +01:00
Łukasz Magiera 2aeab13aae zerocomm: 'Fix' the test 2020-02-27 01:56:09 +01:00
whyrusleeping 6c12068fb7 more fixes for random garbage 2020-02-26 16:42:39 -08:00
hannahhoward c1979f2c7f fix(markets): detect storage deal active correctly
Use SectorStartEpoch to determine if a deal is active, rather than Proposal.StartEpoch
2020-02-26 15:48:07 -08:00
whyrusleeping 767392332e WIP: update sectorbuilder 2020-02-26 14:54:34 -08:00
Łukasz Magiera cb09e48e8c Some test fixes 2020-02-26 10:05:22 +01:00
Henri S cf0a3af1f8 update to use VRF digest appropriately and simplify drawing rand past genesis 2020-02-25 21:47:42 -08:00
Łukasz Magiera 1b6646b55a Merge pull request #1243 from filecoin-project/feat/specs-actors
Spec Actors integration
2020-02-26 00:31:59 +01:00
Łukasz Magiera 0a9e0acc6f types: Drop some redundant alias types 2020-02-25 22:09:22 +01:00
Łukasz Magiera ae634ef7df actors: Remove addrass aliases 2020-02-25 21:54:58 +01:00
Łukasz Magiera cd10a3126b actors: drop a bunch of type aliases 2020-02-25 21:35:15 +01:00
Łukasz Magiera f1d9033194 Address some minor review nits 2020-02-25 21:25:52 +01:00
Łukasz Magiera 1920981713 hello: regen type-gen 2020-02-25 21:21:58 +01:00
Łukasz Magiera 5d9b869d93 gofmt; mod tidy 2020-02-24 18:45:42 +01:00
Łukasz Magiera 794429dd55 post-upstream-merge fixes 2020-02-24 18:45:25 +01:00
Łukasz Magiera d787aa5007 Merge branch 'testnet/3' into feat/specs-actors 2020-02-24 18:32:02 +01:00
Łukasz Magiera def0e0a7a1 Merge remote-tracking branch 'origin/master' into testnet/3 2020-02-24 17:30:46 +01:00
Łukasz Magiera 9f0e0ced5e Merge pull request #1155 from jsign/issue127_2
fix issue #127
2020-02-24 17:22:58 +01:00
Łukasz Magiera 929161c070 pond: Update some mapping arrays 2020-02-24 01:05:20 +01:00
Łukasz Magiera ba6d1091f2 pond: Fix node startup 2020-02-24 00:39:45 +01:00
whyrusleeping 66624b1a8f fixup debug advance cmd 2020-02-23 13:30:42 -08:00
Łukasz Magiera 1d417685d1 Fix Sealing in TestAPIDealFlow 2020-02-23 21:33:10 +01:00
Łukasz Magiera 917df9a5b8 More unified randomness handling 2020-02-23 21:00:47 +01:00
Łukasz Magiera a82d156ccb Deal flow fixes 2020-02-23 16:50:36 +01:00
whyrusleeping 97425ea1c9 fix some tests 2020-02-22 23:49:15 -08:00
Łukasz Magiera 226685dc1c Implement committed capacity sectors 2020-02-23 01:47:47 +01:00
Łukasz Magiera 1381baf088 Generate zero CommP table 2020-02-22 15:06:38 +01:00
Łukasz Magiera 03b8ab724a state replay: find correct tipset 2020-02-22 14:31:13 +01:00
Łukasz Magiera b8428423a1 get chain to runnable state 2020-02-22 14:10:46 +01:00
Łukasz Magiera 99c0e14fd8 Fix genesis writing 2020-02-22 13:03:41 +01:00
Łukasz Magiera b12482df89 move peermgr, tracing into lib 2020-02-22 12:36:22 +01:00
Łukasz Magiera e655e8bc19 remove unused bin directory 2020-02-22 12:32:35 +01:00
Łukasz Magiera 57064c97e0 docs: Fix add-miner command in local-dev-net.md 2020-02-21 22:02:30 +01:00
Łukasz Magiera 111d35deef seed: New genesis creation commands 2020-02-21 21:57:00 +01:00
Łukasz Magiera 3b29aacfdc Fix debug build 2020-02-21 20:31:45 +01:00
Łukasz Magiera 18627e77ff gofmt; mod tidy 2020-02-21 20:28:20 +01:00
Łukasz Magiera 4e98f2e438 some test fixes 2020-02-21 20:28:01 +01:00
Łukasz Magiera d6dffed203 Fix genesis car generation 2020-02-21 20:27:29 +01:00
Łukasz Magiera 5b96b648b4 hello fixes 2020-02-21 20:25:57 +01:00
Łukasz Magiera 49ece5fddf storageminer: Fix build 2020-02-21 19:20:22 +01:00
Łukasz Magiera 852e888232 cmd/lotus: Fix build 2020-02-21 19:00:10 +01:00
Łukasz Magiera a6268f055d storageminer: Update api interfaces 2020-02-21 18:43:44 +01:00
Łukasz Magiera 104871d6c9 paych: Lanes are back to u64 2020-02-21 18:26:44 +01:00
Łukasz Magiera c744dc06c6 Fix implicit account creation 2020-02-21 18:13:50 +01:00
Łukasz Magiera 57c43183e6 update specs-actors 2020-02-21 17:57:40 +01:00
whyrusleeping 00d7bd1a77 chain/gen tests now pass! 2020-02-20 00:37:10 -08:00
Łukasz Magiera 69ec3c205a Merge remote-tracking branch 'origin/master' into testnet/3 2020-02-19 22:10:14 +01:00
Łukasz Magiera 35d14788d3 stmgr: Fix GetPower 2020-02-19 21:39:10 +01:00
Łukasz Magiera c69c9e62c2 stmgr: Correctly read sectorset 2020-02-19 21:34:21 +01:00
Łukasz Magiera 835e3d803f vm: don't follow replica CIDs in copy 2020-02-19 20:39:00 +01:00
Łukasz Magiera 9c31f61db4 sectorset updates 2020-02-19 20:26:11 +01:00
Łukasz Magiera 3394645f7a chainstore: Update weight function to use new actors 2020-02-19 18:55:59 +01:00
Łukasz Magiera e9019c8bcc Working Genesis Generator 2020-02-18 22:38:08 +01:00
whyrusleeping 6d0eec6395 working towards a working genesis generator 2020-02-17 23:15:30 -08:00
Łukasz Magiera 4ad160ef80 specs-actors: Update cbor-gen 2020-02-17 22:42:15 +01:00
Łukasz Magiera 038582ba44 vm: Fix getActorCode 2020-02-17 22:11:03 +01:00
Jakub Sztandera d26a2bcf6b Merge pull request #1269 from filecoin-project/feat/add-graphsync
Add graphsync
2020-02-17 20:04:56 +01:00
Łukasz Magiera d0c158b019 genesis: Handle CreateMiner return correctly 2020-02-17 19:20:38 +01:00
Łukasz Magiera 140187dc2a vm: Fix Commit 2020-02-17 19:00:20 +01:00
Łukasz Magiera 3e4ebd6c9d actors: fix miner constructor 2020-02-17 18:19:06 +01:00
Jakub Sztandera 8af80169c0 Add graphsync
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-02-17 18:15:30 +01:00
Łukasz Magiera 4ad63d9b63 update specs-actors; update GetRandomness 2020-02-17 09:46:12 +01:00
Łukasz Magiera af8c379ac8 vm: More runtime methods 2020-02-17 09:19:54 +01:00
Łukasz Magiera 9f7bd983b3 vm: implement NewActorAddress 2020-02-17 08:59:53 +01:00
Łukasz Magiera b6354dfb74 vm: Partially fix vm runtime shim 2020-02-16 23:15:12 +01:00
Łukasz Magiera 5ced1ab905 gofmt 2020-02-14 22:38:30 +01:00
Łukasz Magiera a92099258b genesis: Register system actor 2020-02-14 22:38:18 +01:00
Łukasz Magiera d5027bfbb2 Fix amt bug 2020-02-14 21:33:41 +01:00
Łukasz Magiera c544c2b5c5 Set hamt bitwidth 2020-02-14 15:14:39 +01:00
Łukasz Magiera 48c5494cf9 use specs-actors birfields 2020-02-14 01:24:24 +01:00
Łukasz Magiera 74bf9119cc spects-actors: More type propagation 2020-02-13 04:50:45 +01:00
Łukasz Magiera 36aed6f871 Update cbor-gen 2020-02-13 02:37:28 +01:00
Łukasz Magiera e1a593c22e Rename paych -> paychmgr to fix cbor-gen 2020-02-13 01:28:23 +01:00
Łukasz Magiera e5ab64a3ab Fix client market impl, gofmt 2020-02-13 01:15:33 +01:00
Łukasz Magiera 91b2d2c2fe cbor-gen fixes 2020-02-13 01:10:07 +01:00
Łukasz Magiera 4684446315 Merge pull request #1259 from filecoin-project/feat/spec-actors-markets-update
feat(markets): use non-custom go-fil-markets, from master
2020-02-13 00:57:41 +01:00
Łukasz Magiera 0d6cfc879d Use specs-actors ignatures 2020-02-13 00:52:36 +01:00
Łukasz Magiera 5afaca6fa5 paych: Update to specs paych code 2020-02-13 00:52:19 +01:00
hannahhoward 720e29848b feat(markets): use non-custom go-fil-markets, from master 2020-02-12 14:32:26 -08:00
Łukasz Magiera 255f511abd storageminer: Updates to new types 2020-02-12 23:12:11 +01:00
Łukasz Magiera 220bd376b4 seed: Update lotus-seed for new genesis types 2020-02-12 22:41:59 +01:00
Łukasz Magiera d68041c394 Merge pull request #1255 from filecoin-project/feat/new-hello
Use new hello
2020-02-12 20:44:05 +01:00
Jakub Sztandera 8610bcbec3 Use tuple encoding
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-02-12 19:23:15 +01:00
Jakub Sztandera 50702f309f Use new hello protocol
Using map encoder.
Types in LatencyMessage are int64 in spec, butl 1. tupled generator
does not support int64 right now; 2. there is no harm in using uint64 here.

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-02-12 19:08:49 +01:00
Łukasz Magiera 0aaf7b25a9 Propagate spec actor types more 2020-02-12 08:44:20 +01:00
Łukasz Magiera 526cfea568 state: fix actor lookup 2020-02-12 08:22:55 +01:00
Łukasz Magiera 22047d20ef actors: Wire up specs-actors init 2020-02-12 03:13:19 +01:00
Łukasz Magiera ca3eabafef genesis: Cleanup miner creation 2020-02-12 03:13:00 +01:00
Łukasz Magiera 23b662fe7d actors: Remove cborgen for old types 2020-02-12 03:12:39 +01:00
Łukasz Magiera 048759a147 genesis: Correct early state construction 2020-02-12 02:15:02 +01:00
Łukasz Magiera a4f6b739be genesis: Change template types 2020-02-12 01:58:55 +01:00
Łukasz Magiera 63e801e00f genesis: Cleanup the structure 2020-02-11 21:48:03 +01:00
Łukasz Magiera 3343e82307 wip gengen fixing 2020-02-11 04:31:28 +01:00
Łukasz Magiera 4d5c4d89ce stmgr: Update stmgr utils 2020-02-11 03:33:27 +01:00
Łukasz Magiera 91ca4a841a specs-actors: Import miner/power/cron/paych code 2020-02-11 02:43:26 +01:00
Łukasz Magiera 07ae3e49a3 mocksb: Update to the new interface 2020-02-11 02:23:03 +01:00
Łukasz Magiera fa2c6605c2 Fix compilation after dep updates 2020-02-11 02:11:58 +01:00
Łukasz Magiera a593a4f6f4 update ffi 2020-02-11 01:44:39 +01:00
Łukasz Magiera 6dce181314 Update specs-actors 2020-02-10 22:25:22 +01:00
Łukasz Magiera c0ed0dda8e specs-actors: Fis some test compilation errors 2020-02-10 20:16:36 +01:00
Łukasz Magiera 7e70536bf1 specs-actors: Finish type cleanup 2020-02-10 19:21:10 +01:00
Łukasz Magiera c72727b4fd specs-actors: Fix most compilation errors 2020-02-09 07:06:32 +01:00
Łukasz Magiera 41daf5ad28 gofmt 2020-02-08 03:18:37 +01:00
Łukasz Magiera 13435aebdc Spec Actors integration 2020-02-08 03:18:32 +01:00
Łukasz Magiera 3aa521600a Merge pull request #1231 from filecoin-project/feat/update-msig-refs
actors: Drop refs to multisig_actor.go
2020-02-06 21:01:43 +01:00
Łukasz Magiera fc8bf8c15d Fix validation with extracted msig 2020-02-06 21:01:29 +01:00
Łukasz Magiera 3d3c1dbbb4 import key algs in wallet 2020-02-06 20:56:56 +01:00
Łukasz Magiera 1d0d429435 actors: Drop refs to multisig_actor.go 2020-02-06 20:49:21 +01:00
Łukasz Magiera 604c234484 Merge remote-tracking branch 'origin/master' into testnet/3 2020-02-06 20:32:25 +01:00
Łukasz Magiera 72c89ab89b Merge pull request #1223 from filecoin-project/fix/squash-forks
squash forks and use correct amt library everywhere
2020-02-06 20:14:55 +01:00
Łukasz Magiera 53d5efa944 Merge pull request #1227 from filecoin-project/fix/retrieval-market-errors
Update go-fil-markets to solve retrieval bug
2020-02-06 19:59:02 +01:00
hannahhoward d2c5d81e59 fix(deps): update go-fil-markets
update go-fil-markets to latest to solve an issue with retrieval
2020-02-05 18:48:47 -08:00
whyrusleeping 411a69233b merge miner and miner2 files 2020-02-05 17:07:29 -08:00
Łukasz Magiera cbf63aab1e Merge branch 'master' into testnet/3 2020-02-05 21:27:04 +01:00
Whyrusleeping dbb504e3d8 Merge pull request #1225 from filecoin-project/fix/fix-markets-integration
fix(go-fil-markets): fix integration
2020-02-04 20:59:26 -08:00
hannahhoward d42cd6a5e2 fix(deps): mod tidy 2020-02-04 20:10:58 -08:00
hannahhoward 97b645cd55 fix(go-fil-markets): fix integration
remove broken aspects of go-fil-markets integration and update versins
2020-02-04 20:08:08 -08:00
whyrusleeping faf05cafcf squash forks and use correct amt library everywhere 2020-02-04 18:26:42 -08:00
Łukasz Magiera c013ef3b30 Merge pull request #1219 from filecoin-project/feat/auto-shim
Make it all build
2020-02-05 00:01:41 +01:00
whyrusleeping f357edb8a4 mod tidy that code 2020-02-04 14:22:18 -08:00
whyrusleeping 028a113737 Make it all build 2020-02-04 14:19:05 -08:00
Jakub Sztandera 8d1ef188b1 Merge pull request #1211 from filecoin-project/feat/auto-shim
Invoker autoshim
2020-02-04 21:13:26 +01:00
Jakub Sztandera 54076e9a6b Invoker autoshim
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
2020-02-04 07:46:24 +01:00
Łukasz Magiera d9f3b6c121 Merge pull request #1148 from filecoin-project/feat/msig-integration
DO NOT MERGE: Feat/msig integration
2020-02-04 07:19:49 +01:00
Łukasz Magiera d7548ab2f7 Merge pull request #1152 from filecoin-project/feat/update-markets
Update go-fil-markets to spec compliance, add CAR file support
2020-02-04 07:18:44 +01:00
Łukasz Magiera 0e81c1cf7e Merge branch 'testnet/3' into feat/update-markets 2020-02-04 07:17:22 +01:00
whyrusleeping 9cee31193c clean up tests and fix cli commands 2020-02-03 19:37:55 -08:00
whyrusleeping 30a922513b finish the shimming, pull shim code into separate file 2020-02-03 18:52:18 -08:00
whyrusleeping 8c169bb236 add to the shim, get tests passing 2020-02-03 18:52:18 -08:00
whyrusleeping cd976ad79f tests are mostly passing! 2020-02-03 18:52:18 -08:00
whyrusleeping baa3d09577 WIP: one more step before distraction 2020-02-03 18:52:18 -08:00
whyrusleeping c73c5987c7 WIP: integrate multisig actor from specs-actors 2020-02-03 18:52:18 -08:00
whyrusleeping dfe87c9f6f update to latest hamt changes 2020-02-03 18:52:18 -08:00
hannahhoward 00941e4461 fix(sectorblocks): minor cleanups
add error check, slice keys
2020-01-28 14:15:12 -08:00
hannahhoward 503b16f6b1 style(deps): mod tidy 2020-01-28 14:08:13 -08:00
hannahhoward 433f9ff211 fix(markets): update version, pass payment interval params 2020-01-28 14:08:13 -08:00
hannahhoward be26c56362 feat(client): provide more informative retrieval message 2020-01-28 14:08:13 -08:00
hannahhoward 1a2c3adb2f fix(deps): update go-fil-markets 2020-01-28 14:08:13 -08:00
hannahhoward b8077fadaa fix(dealstate): update deal states to match current 2020-01-28 14:08:13 -08:00
hannahhoward 17a4a99f9c test(integration): reduce to fit in sector size
Reduce deal size to fit in sector
2020-01-28 14:08:13 -08:00
hannahhoward 71289b58ff feat(markets): update to support car files
Upgrades lotus version of go-fil-markets to its head, which supports car files and handles tracking
of pieces, reducing the size of sectorBlocks
2020-01-28 14:08:13 -08:00
jsign 3106f512b2 define method retry freq as a constant
Signed-off-by: jsign <jsign.uy@gmail.com>
2020-01-26 21:52:19 -03:00
jsign 54f2e6ea3a extra fixes
Signed-off-by: jsign <jsign.uy@gmail.com>
2020-01-24 22:48:30 -03:00
jsign dbd51ff8e7 fix issue #127
Signed-off-by: jsign <jsign.uy@gmail.com>
2020-01-24 21:15:49 -03:00
480 changed files with 36593 additions and 31876 deletions
+40 -32
View File
@@ -1,11 +1,11 @@
version: 2.1
orbs:
go: gotest/tools@0.0.9
go: gotest/tools@0.0.13
executors:
golang:
docker:
- image: circleci/golang:1.13
- image: circleci/golang:1.14.2
resource_class: 2xlarge
ubuntu:
docker:
@@ -42,13 +42,13 @@ commands:
- restore_cache:
name: Restore parameters cache
keys:
- 'v20-1k-lotus-params'
- 'v25-2k-lotus-params'
paths:
- /var/tmp/filecoin-proof-parameters/
- run: ./lotus fetch-params --proving-params 1024
- run: ./lotus fetch-params 2048
- save_cache:
name: Save parameters cache
key: 'v20-1k-lotus-params'
key: 'v25-2k-lotus-params'
paths:
- /var/tmp/filecoin-proof-parameters/
install_ipfs:
@@ -79,7 +79,6 @@ jobs:
steps:
- install-deps
- prepare
- go/mod-download
- go/mod-tidy-check
build-all:
@@ -87,12 +86,8 @@ jobs:
steps:
- install-deps
- prepare
- go/mod-download
- run: sudo apt-get update
- run: sudo apt-get install npm
- restore_cache:
name: restore go mod cache
key: v1-go-deps-{{ arch }}-{{ checksum "/home/circleci/project/go.mod" }}
- run:
command: make buildall
- store_artifacts:
@@ -107,6 +102,14 @@ jobs:
paths:
- linux
build-debug:
executor: golang
steps:
- install-deps
- prepare
- run:
command: make debug
test: &test
description: |
Run tests with gotestsum.
@@ -122,6 +125,9 @@ jobs:
type: string
default: "./..."
description: Import paths of packages to be tested.
winpost-test:
type: string
default: "0"
test-suite-name:
type: string
default: unit
@@ -144,10 +150,6 @@ jobs:
steps:
- install-deps
- prepare
- go/mod-download
- restore_cache:
name: restore go mod cache
key: v1-go-deps-{{ arch }}-{{ checksum "/home/circleci/project/go.mod" }}
- run:
command: make deps lotus
no_output_timeout: 30m
@@ -159,6 +161,7 @@ jobs:
environment:
GOTESTSUM_JUNITFILE: /tmp/test-reports/<< parameters.test-suite-name >>/junit.xml
GOTESTSUM_FORMAT: << parameters.gotestsum-format >>
LOTUS_TEST_WINDOW_POST: << parameters.winpost-test >>
command: |
mkdir -p /tmp/test-reports/<< parameters.test-suite-name >>
gotestsum -- \
@@ -177,16 +180,11 @@ jobs:
shell: /bin/bash -eo pipefail
command: |
bash <(curl -s https://codecov.io/bash)
- save_cache:
name: save go mod cache
key: v1-go-deps-{{ arch }}-{{ checksum "/home/circleci/project/go.mod" }}
paths:
- "~/go/pkg"
- "~/go/src/github.com"
- "~/go/src/golang.org"
test-short:
<<: *test
test-window-post:
<<: *test
build-macos:
description: build darwin lotus binary
@@ -200,8 +198,8 @@ jobs:
- run:
name: Install go
command: |
curl -O https://dl.google.com/go/go1.13.4.darwin-amd64.pkg && \
sudo installer -pkg go1.13.4.darwin-amd64.pkg -target /
curl -O https://dl.google.com/go/go1.14.2.darwin-amd64.pkg && \
sudo installer -pkg go1.14.2.darwin-amd64.pkg -target /
- run:
name: Install pkg-config
command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config
@@ -213,14 +211,12 @@ jobs:
- run:
name: Install jq
command: |
mkdir $HOME/.bin
curl --location https://github.com/stedolan/jq/releases/download/jq-1.6/jq-osx-amd64 --output $HOME/.bin/jq
chmod +x $HOME/.bin/jq
curl --location https://github.com/stedolan/jq/releases/download/jq-1.6/jq-osx-amd64 --output /usr/local/bin/jq
chmod +x /usr/local/bin/jq
- restore_cache:
name: restore go mod and cargo cache
name: restore cargo cache
key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }}
- install-deps
- go/mod-download
- run:
command: make build
no_output_timeout: 30m
@@ -242,6 +238,14 @@ jobs:
- "~/.rustup"
- "~/.cargo"
gofmt:
executor: golang
steps:
- install-deps
- prepare
- run:
command: "! go fmt ./... 2>&1 | read"
lint: &lint
description: |
Run golangci-lint.
@@ -251,7 +255,7 @@ jobs:
default: golang
golangci-lint-version:
type: string
default: 1.17.1
default: 1.27.0
concurrency:
type: string
default: '2'
@@ -267,7 +271,6 @@ jobs:
steps:
- install-deps
- prepare
- go/mod-download
- run:
command: make deps
no_output_timeout: 30m
@@ -277,7 +280,7 @@ jobs:
- run:
name: Lint
command: |
$HOME/.local/bin/golangci-lint run -v \
$HOME/.local/bin/golangci-lint run -v --timeout 2m \
--concurrency << parameters.concurrency >> << parameters.args >>
lint-changes:
<<: *lint
@@ -312,15 +315,20 @@ workflows:
jobs:
- lint-changes:
args: "--new-from-rev origin/master"
- mod-tidy-check
- gofmt
- test:
codecov-upload: true
- mod-tidy-check
- test-window-post:
go-test-flags: "-run=TestWindowedPost"
winpost-test: "1"
- test-short:
go-test-flags: "--timeout 10m --short"
filters:
tags:
only:
- /^v\d+\.\d+\.\d+$/
- build-debug
- build-all:
requires:
- test-short
+1 -1
View File
@@ -21,7 +21,7 @@ A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Version (run `lotus --version`):**
**Version (run `lotus version`):**
**Additional context**
Add any other context about the problem here.
+34
View File
@@ -0,0 +1,34 @@
---
name: Sealing Issues
about: Create a report for help with sealing (commit) failures.
title: ''
labels: 'sealing'
assignees: ''
---
Please provide all the information requested here to help us troubleshoot "commit failed" issues.
If the information requested is missing, we will probably have to just ask you to provide it anyway,
before we can help debug.
**Describe the problem**
A brief description of the problem you encountered while proving (sealing) a sector.
Including what commands you ran, and a description of your setup, is very helpful.
**Sectors list**
The output of `./lotus-storage-miner sectors list`.
**Sectors status**
The output of `./lotus-storage-miner sectors status --log <sectorId>` for the failed sector(s).
**Lotus storage miner logs**
Please go through the logs of your storage miner, and include screenshots of any error-like messages you find.
**Version**
The output of `./lotus --version`.
+1 -1
View File
@@ -15,7 +15,6 @@
/cmd/lotus-townhall/townhall/node_modules
/cmd/lotus-townhall/townhall/build
extern/filecoin-ffi/rust/target
**/*.h
**/*.a
**/*.pc
/**/*/.DS_STORE
@@ -36,3 +35,4 @@ build/paramfetch.sh
bin/ipget
bin/tmp/*
.idea
scratchpad
+3
View File
@@ -2,3 +2,6 @@
path = extern/filecoin-ffi
url = https://github.com/filecoin-project/filecoin-ffi.git
branch = master
[submodule "extern/serialization-vectors"]
path = extern/serialization-vectors
url = https://github.com/filecoin-project/serialization-vectors
+15 -1
View File
@@ -22,13 +22,27 @@ issues:
- "func name will be used as test\\.Test.* by other packages, and that stutters; consider calling this"
- "Potential file inclusion via variable"
- "should have( a package)? comment"
- "Error return value of `logging.SetLogLevel` is not checked"
exclude-use-default: false
exclude-rules:
- path: lotuspond
linters:
- errcheck
- path: node/modules/lp2p
linters:
- golint
- path: ".*_test.go"
- path: build/params_.*\.go
linters:
- golint
- path: api/apistruct/struct.go
linters:
- golint
- path: .*_test.go
linters:
- gosec
+61 -5
View File
@@ -3,8 +3,10 @@ SHELL=/usr/bin/env bash
all: build
.PHONY: all
unexport GOFLAGS
GOVERSION:=$(shell go version | cut -d' ' -f 3 | cut -d. -f 2)
ifeq ($(shell expr $(GOVERSION) \< 13), 1)
ifeq ($(shell expr $(GOVERSION) \< 14), 1)
$(warning Your Golang version is go 1.$(GOVERSION))
$(error Update Golang to version $(shell grep '^go' go.mod))
endif
@@ -14,12 +16,19 @@ MODULES:=
CLEAN:=
BINS:=
GOFLAGS+=-ldflags=-X="github.com/filecoin-project/lotus/build".CurrentCommit="+git$(subst -,.,$(shell git describe --always --match=NeVeRmAtCh --dirty 2>/dev/null || git rev-parse --short HEAD 2>/dev/null))"
ldflags=-X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.$(subst -,.,$(shell git describe --always --match=NeVeRmAtCh --dirty 2>/dev/null || git rev-parse --short HEAD 2>/dev/null))
ifneq ($(strip $(LDFLAGS)),)
ldflags+=-extldflags=$(LDFLAGS)
endif
GOFLAGS+=-ldflags="$(ldflags)"
## FFI
FFI_PATH:=extern/filecoin-ffi/
FFI_DEPS:=libfilecoin.a filecoin.pc filecoin.h
FFI_DEPS:=.install-filcrypto
FFI_DEPS:=$(addprefix $(FFI_PATH),$(FFI_DEPS))
$(FFI_DEPS): build/.filecoin-install ;
@@ -51,6 +60,9 @@ deps: $(BUILD_DEPS)
debug: GOFLAGS+=-tags=debug
debug: lotus lotus-storage-miner lotus-seal-worker lotus-seed
2k: GOFLAGS+=-tags=2k
2k: lotus lotus-storage-miner lotus-seal-worker lotus-seed
lotus: $(BUILD_DEPS)
rm -f lotus
go build $(GOFLAGS) -o lotus ./cmd/lotus
@@ -91,6 +103,21 @@ install:
install -C ./lotus-storage-miner /usr/local/bin/lotus-storage-miner
install -C ./lotus-seal-worker /usr/local/bin/lotus-seal-worker
install-services: install
mkdir -p /usr/local/lib/systemd/system
mkdir -p /var/log/lotus
install -C -m 0644 ./scripts/lotus-daemon.service /usr/local/lib/systemd/system/lotus-daemon.service
install -C -m 0644 ./scripts/lotus-miner.service /usr/local/lib/systemd/system/lotus-miner.service
systemctl daemon-reload
@echo
@echo "lotus-daemon and lotus-miner services installed. Don't forget to 'systemctl enable lotus-daemon|lotus-miner' for it to be enabled on startup."
clean-services:
rm -f /usr/local/lib/systemd/system/lotus-daemon.service
rm -f /usr/local/lib/systemd/system/lotus-miner.service
rm -f /usr/local/lib/systemd/system/chainwatch.service
systemctl daemon-reload
# TOOLS
lotus-seed: $(BUILD_DEPS)
@@ -107,7 +134,7 @@ benchmarks:
@curl -X POST 'http://benchmark.kittyhawk.wtf/benchmark' -d '@bench.json' -u "${benchmark_http_cred}"
.PHONY: benchmarks
pond: build
pond: 2k
go build -o pond ./lotuspond
(cd lotuspond/front && npm i && CI=false npm run build)
.PHONY: pond
@@ -131,10 +158,16 @@ BINS+=fountain
chainwatch:
rm -f chainwatch
go build -o chainwatch ./cmd/lotus-chainwatch
go run github.com/GeertJohan/go.rice/rice append --exec chainwatch -i ./cmd/lotus-chainwatch -i ./build
.PHONY: chainwatch
BINS+=chainwatch
install-chainwatch-service: chainwatch
install -C ./chainwatch /usr/local/bin/chainwatch
install -C -m 0644 ./scripts/chainwatch.service /usr/local/lib/systemd/system/chainwatch.service
systemctl daemon-reload
@echo
@echo "chainwatch installed. Don't forget to 'systemctl enable chainwatch' for it to be enabled on startup."
bench:
rm -f bench
go build -o bench ./cmd/lotus-bench
@@ -157,10 +190,28 @@ health:
.PHONY: health
BINS+=health
testground:
go build -tags testground -o /dev/null ./cmd/lotus
.PHONY: testground
BINS+=testground
# MISC
buildall: $(BINS)
completions:
./scripts/make-completions.sh lotus
./scripts/make-completions.sh lotus-storage-miner
.PHONY: completions
install-completions:
mkdir -p /usr/share/bash-completion/completions /usr/local/share/zsh/site-functions/
install -C ./scripts/bash-completion/lotus /usr/share/bash-completion/completions/lotus
install -C ./scripts/bash-completion/lotus-storage-miner /usr/share/bash-completion/completions/lotus-storage-miner
install -C ./scripts/zsh-completion/lotus /usr/local/share/zsh/site-functions/_lotus
install -C ./scripts/zsh-completion/lotus-storage-miner /usr/local/share/zsh/site-functions/_lotus-storage-miner
clean:
rm -rf $(CLEAN) $(BINS)
-$(MAKE) -C $(FFI_PATH) clean
@@ -174,5 +225,10 @@ dist-clean:
type-gen:
go run ./gen/main.go
method-gen:
(cd ./lotuspond/front/src/chain && go run ./methodgen.go)
gen: type-gen method-gen
print-%:
@echo $*=$($*)
+13 -4
View File
@@ -4,14 +4,23 @@
Lotus is an implementation of the Filecoin Distributed Storage Network. For more details about Filecoin, check out the [Filecoin Spec](https://github.com/filecoin-project/specs).
## Development
All work is tracked via issues. An attempt at keeping an up-to-date view on remaining work is in the [lotus testnet github project board](https://github.com/filecoin-project/lotus/projects/1).
## Building & Documentation
For instructions on how to build lotus from source, please visit [https://docs.lotu.sh](https://docs.lotu.sh) or read the source [here](https://github.com/filecoin-project/lotus/tree/master/documentation).
## Reporting a Vulnerability
Please send an email to security@filecoin.org. See our [security policy](SECURITY.md) for more details.
## Development
All work is tracked via issues. An attempt at keeping an up-to-date view on remaining work is in the [lotus testnet github project board](https://github.com/filecoin-project/lotus/projects/1).
The main branches under development at the moment are:
* [`master`](https://github.com/filecoin-project/lotus): current testnet.
* [`next`](https://github.com/filecoin-project/lotus/tree/next): working branch with chain-breaking changes.
* [`ntwk-calibration`](https://github.com/filecoin-project/lotus/tree/ntwk-calibration): devnet running one of `next` commits.
## License
Dual-licensed under [MIT](https://github.com/filecoin-project/lotus/blob/master/LICENSE-MIT) + [Apache 2.0](https://github.com/filecoin-project/lotus/blob/master/LICENSE-APACHE)
+29
View File
@@ -0,0 +1,29 @@
# Security Policy
## Reporting a Vulnerability
For *critical* bugs, please send an email to security@filecoin.org.
The bug reporting process differs between bugs that are critical and may crash the network, and others that are unlikely to cause problems if malicious parties know about it. For non-critical bugs, please simply file a GitHub [issue](https://github.com/filecoin-project/lotus/issues/new?template=bug_report.md).
Please try to provide a clear description of any bugs reported, along with how to reproduce the bug if possible. More detailed bug reports (especially those with a PoC included) will help us move forward much faster. Additionally, please avoid reporting bugs that already have open issues. Take a moment to search the issue list of the related GitHub repositories before writing up a new report.
Here are some examples of bugs we would consider 'critical':
* If you can spend from a `multisig` wallet you do not control the keys for.
* If you can cause a miner to be slashed without them actually misbehaving.
* If you can maintain power without submitting windowed posts regularly.
* If you can craft a message that causes lotus nodes to panic.
* If you can cause your miner to win significantly more blocks than it should.
* If you can craft a message that causes a persistent fork in the network.
* If you can cause the total amount of Filecoin in the network to no longer be 2 billion.
This is not an exhaustive list, but should provide some idea of what we consider 'critical'.
## Supported Versions
* TODO: This should be defined and set up by Mainnet launch.
| Version | Supported |
| ------- | ------------------ |
| Testnet | :white_check_mark: |
+18 -7
View File
@@ -4,19 +4,22 @@ import (
"context"
"fmt"
"github.com/filecoin-project/lotus/build"
"github.com/libp2p/go-libp2p-core/network"
"github.com/libp2p/go-libp2p-core/peer"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/lotus/build"
)
type Permission = string
type Common interface {
// Auth
AuthVerify(ctx context.Context, token string) ([]Permission, error)
AuthNew(ctx context.Context, perms []Permission) ([]byte, error)
// network
// MethodGroup: Auth
AuthVerify(ctx context.Context, token string) ([]auth.Permission, error)
AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error)
// MethodGroup: Net
NetConnectedness(context.Context, peer.ID) (network.Connectedness, error)
NetPeers(context.Context) ([]peer.AddrInfo, error)
@@ -24,6 +27,9 @@ type Common interface {
NetAddrsListen(context.Context) (peer.AddrInfo, error)
NetDisconnect(context.Context, peer.ID) error
NetFindPeer(context.Context, peer.ID) (peer.AddrInfo, error)
NetPubsubScores(context.Context) ([]PubsubScore, error)
// MethodGroup: Common
// ID returns peerID of libp2p node backing this API
ID(context.Context) (peer.ID, error)
@@ -33,6 +39,11 @@ type Common interface {
LogList(context.Context) ([]string, error)
LogSetLevel(context.Context, string, string) error
// trigger graceful shutdown
Shutdown(context.Context) error
Closing(context.Context) (<-chan struct{}, error)
}
// Version provides various build-time information
+386 -89
View File
@@ -4,89 +4,212 @@ import (
"context"
"time"
"github.com/filecoin-project/go-address"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-filestore"
"github.com/libp2p/go-libp2p-core/peer"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin/market"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/builtin/paych"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
// FullNode API is a low-level interface to the Filecoin network full node
type FullNode interface {
Common
// chain
// MethodGroup: Chain
// The Chain method group contains methods for interacting with the
// blockchain, but that do not require any form of state computation.
// ChainNotify returns channel with chain head updates
// First message is guaranteed to be of len == 1, and type == 'current'
ChainNotify(context.Context) (<-chan []*store.HeadChange, error)
// ChainNotify returns channel with chain head updates.
// First message is guaranteed to be of len == 1, and type == 'current'.
ChainNotify(context.Context) (<-chan []*HeadChange, error)
// ChainHead returns the current head of the chain.
ChainHead(context.Context) (*types.TipSet, error)
ChainGetRandomness(context.Context, types.TipSetKey, int64) ([]byte, error)
// ChainGetRandomness is used to sample the chain for randomness.
ChainGetRandomness(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error)
// ChainGetBlock returns the block specified by the given CID.
ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error)
// ChainGetTipSet returns the tipset specified by the given TipSetKey.
ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error)
ChainGetBlockMessages(context.Context, cid.Cid) (*BlockMessages, error)
ChainGetParentReceipts(context.Context, cid.Cid) ([]*types.MessageReceipt, error)
ChainGetParentMessages(context.Context, cid.Cid) ([]Message, error)
ChainGetTipSetByHeight(context.Context, uint64, types.TipSetKey) (*types.TipSet, error)
// ChainGetBlockMessages returns messages stored in the specified block.
ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*BlockMessages, error)
// ChainGetParentReceipts returns receipts for messages in parent tipset of
// the specified block.
ChainGetParentReceipts(ctx context.Context, blockCid cid.Cid) ([]*types.MessageReceipt, error)
// ChainGetParentMessages returns messages stored in parent tipset of the
// specified block.
ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]Message, error)
// ChainGetTipSetByHeight looks back for a tipset at the specified epoch.
// If there are no blocks at the specified epoch, a tipset at an earlier epoch
// will be returned.
ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)
// ChainReadObj reads ipld nodes referenced by the specified CID from chain
// blockstore and returns raw bytes.
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
// ChainHasObj checks if a given CID exists in the chain blockstore.
ChainHasObj(context.Context, cid.Cid) (bool, error)
ChainStatObj(context.Context, cid.Cid, cid.Cid) (ObjStat, error)
// ChainSetHead forcefully sets current chain head. Use with caution.
ChainSetHead(context.Context, types.TipSetKey) error
// ChainGetGenesis returns the genesis tipset.
ChainGetGenesis(context.Context) (*types.TipSet, error)
// ChainTipSetWeight computes weight for the specified tipset.
ChainTipSetWeight(context.Context, types.TipSetKey) (types.BigInt, error)
ChainGetNode(ctx context.Context, p string) (interface{}, error)
ChainGetNode(ctx context.Context, p string) (*IpldObject, error)
// ChainGetMessage reads a message referenced by the specified CID from the
// chain blockstore.
ChainGetMessage(context.Context, cid.Cid) (*types.Message, error)
ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*store.HeadChange, error)
// ChainGetPath returns a set of revert/apply operations needed to get from
// one tipset to another, for example:
//```
// to
// ^
// from tAA
// ^ ^
// tBA tAB
// ^---*--^
// ^
// tRR
//```
// Would return `[revert(tBA), apply(tAB), apply(tAA)]`
ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*HeadChange, error)
// ChainExport returns a stream of bytes with CAR dump of chain data.
ChainExport(context.Context, types.TipSetKey) (<-chan []byte, error)
// syncer
// MethodGroup: Sync
// The Sync method group contains methods for interacting with and
// observing the lotus sync service.
// SyncState returns the current status of the lotus sync system.
SyncState(context.Context) (*SyncState, error)
// SyncSubmitBlock can be used to submit a newly created block to the.
// network through this node
SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error
// SyncIncomingBlocks returns a channel streaming incoming, potentially not
// yet synced block headers.
SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error)
// SyncMarkBad marks a blocks as bad, meaning that it won't ever by synced.
// Use with extreme caution.
SyncMarkBad(ctx context.Context, bcid cid.Cid) error
// SyncCheckBad checks if a block was marked as bad, and if it was, returns
// the reason.
SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error)
// messages
// MethodGroup: Mpool
// The Mpool methods are for interacting with the message pool. The message pool
// manages all incoming and outgoing 'messages' going over the network.
// MpoolPending returns pending mempool messages.
MpoolPending(context.Context, types.TipSetKey) ([]*types.SignedMessage, error)
// MpoolPush pushes a signed message to mempool.
MpoolPush(context.Context, *types.SignedMessage) (cid.Cid, error)
MpoolPushMessage(context.Context, *types.Message) (*types.SignedMessage, error) // get nonce, sign, push
// MpoolPushMessage atomically assigns a nonce, signs, and pushes a message
// to mempool.
MpoolPushMessage(context.Context, *types.Message) (*types.SignedMessage, error)
// MpoolGetNonce gets next nonce for the specified sender.
// Note that this method may not be atomic. Use MpoolPushMessage instead.
MpoolGetNonce(context.Context, address.Address) (uint64, error)
MpoolSub(context.Context) (<-chan MpoolUpdate, error)
// FullNodeStruct
// MpoolEstimateGasPrice estimates what gas price should be used for a
// message to have high likelihood of inclusion in `nblocksincl` epochs.
MpoolEstimateGasPrice(ctx context.Context, nblocksincl uint64, sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error)
// miner
// MethodGroup: Miner
MinerCreateBlock(context.Context, address.Address, types.TipSetKey, *types.Ticket, *types.EPostProof, []*types.SignedMessage, uint64, uint64) (*types.BlockMsg, error)
MinerGetBaseInfo(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*MiningBaseInfo, error)
MinerCreateBlock(context.Context, *BlockTemplate) (*types.BlockMsg, error)
// // UX ?
// wallet
// MethodGroup: Wallet
WalletNew(context.Context, string) (address.Address, error)
// WalletNew creates a new address in the wallet with the given sigType.
WalletNew(context.Context, crypto.SigType) (address.Address, error)
// WalletHas indicates whether the given address is in the wallet.
WalletHas(context.Context, address.Address) (bool, error)
// WalletList lists all the addresses in the wallet.
WalletList(context.Context) ([]address.Address, error)
// WalletBalance returns the balance of the given address at the current head of the chain.
WalletBalance(context.Context, address.Address) (types.BigInt, error)
WalletSign(context.Context, address.Address, []byte) (*types.Signature, error)
// WalletSign signs the given bytes using the given address.
WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error)
// WalletSignMessage signs the given message using the given address.
WalletSignMessage(context.Context, address.Address, *types.Message) (*types.SignedMessage, error)
// WalletVerify takes an address, a signature, and some bytes, and indicates whether the signature is valid.
// The address does not have to be in the wallet.
WalletVerify(context.Context, address.Address, []byte, *crypto.Signature) bool
// WalletDefaultAddress returns the address marked as default in the wallet.
WalletDefaultAddress(context.Context) (address.Address, error)
// WalletSetDefault marks the given address as as the default one.
WalletSetDefault(context.Context, address.Address) error
// WalletExport returns the private key of an address in the wallet.
WalletExport(context.Context, address.Address) (*types.KeyInfo, error)
// WalletImport receives a KeyInfo, which includes a private key, and imports it into the wallet.
WalletImport(context.Context, *types.KeyInfo) (address.Address, error)
// WalletDelete deletes an address from the wallet.
WalletDelete(context.Context, address.Address) error
// Other
// ClientImport imports file under the specified path into filestore
ClientImport(ctx context.Context, path string) (cid.Cid, error)
ClientStartDeal(ctx context.Context, data cid.Cid, addr address.Address, miner address.Address, epochPrice types.BigInt, blocksDuration uint64) (*cid.Cid, error)
// MethodGroup: Client
// The Client methods all have to do with interacting with the storage and
// retrieval markets as a client
// ClientImport imports file under the specified path into filestore.
ClientImport(ctx context.Context, ref FileRef) (cid.Cid, error)
// ClientStartDeal proposes a deal with a miner.
ClientStartDeal(ctx context.Context, params *StartDealParams) (*cid.Cid, error)
// ClientGetDealInfo returns the latest information about a given deal.
ClientGetDealInfo(context.Context, cid.Cid) (*DealInfo, error)
// ClientListDeals returns information about the deals made by the local client.
ClientListDeals(ctx context.Context) ([]DealInfo, error)
// ClientHasLocal indicates whether a certain CID is locally stored.
ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error)
// ClientFindData identifies peers that have a certain file, and returns QueryOffers (one per peer).
ClientFindData(ctx context.Context, root cid.Cid) ([]QueryOffer, error)
ClientRetrieve(ctx context.Context, order RetrievalOrder, path string) error
ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*types.SignedStorageAsk, error)
// ClientMinerQueryOffer returns a QueryOffer for the specific miner and file.
ClientMinerQueryOffer(ctx context.Context, root cid.Cid, miner address.Address) (QueryOffer, error)
// ClientRetrieve initiates the retrieval of a file, as specified in the order.
ClientRetrieve(ctx context.Context, order RetrievalOrder, ref *FileRef) error
// ClientQueryAsk returns a signed StorageAsk from the specified miner.
ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.SignedStorageAsk, error)
// ClientCalcCommP calculates the CommP for a specified file, based on the sector size of the provided miner.
ClientCalcCommP(ctx context.Context, inpath string, miner address.Address) (*CommPRet, error)
// ClientGenCar generates a CAR file for the specified file.
ClientGenCar(ctx context.Context, ref FileRef, outpath string) error
// ClientUnimport removes references to the specified file from filestore
//ClientUnimport(path string)
@@ -96,57 +219,149 @@ type FullNode interface {
//ClientListAsks() []Ask
// if tipset is nil, we'll use heaviest
StateCall(context.Context, *types.Message, types.TipSetKey) (*MethodCall, error)
StateReplay(context.Context, types.TipSetKey, cid.Cid) (*ReplayResults, error)
// MethodGroup: State
// The State methods are used to query, inspect, and interact with chain state.
// All methods take a TipSetKey as a parameter. The state looked up is the state at that tipset.
// A nil TipSetKey can be provided as a param, this will cause the heaviest tipset in the chain to be used.
// StateCall runs the given message and returns its result without any persisted changes.
StateCall(context.Context, *types.Message, types.TipSetKey) (*InvocResult, error)
// StateReplay returns the result of executing the indicated message, assuming it was executed in the indicated tipset.
StateReplay(context.Context, types.TipSetKey, cid.Cid) (*InvocResult, error)
// StateGetActor returns the indicated actor's nonce and balance.
StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error)
StateReadState(ctx context.Context, act *types.Actor, tsk types.TipSetKey) (*ActorState, error)
StateListMessages(ctx context.Context, match *types.Message, tsk types.TipSetKey, toht uint64) ([]cid.Cid, error)
// StateReadState returns the indicated actor's state.
StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error)
// StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height.
StateListMessages(ctx context.Context, match *types.Message, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error)
StateMinerSectors(context.Context, address.Address, types.TipSetKey) ([]*ChainSectorInfo, error)
// StateNetworkName returns the name of the network the node is synced to
StateNetworkName(context.Context) (dtypes.NetworkName, error)
// StateMinerSectors returns info about the given miner's sectors. If the filter bitfield is nil, all sectors are included.
// If the filterOut boolean is set to true, any sectors in the filter are excluded.
// If false, only those sectors in the filter are included.
StateMinerSectors(context.Context, address.Address, *abi.BitField, bool, types.TipSetKey) ([]*ChainSectorInfo, error)
// StateMinerProvingSet returns info about those sectors that a given miner is actively proving.
StateMinerProvingSet(context.Context, address.Address, types.TipSetKey) ([]*ChainSectorInfo, error)
StateMinerPower(context.Context, address.Address, types.TipSetKey) (MinerPower, error)
StateMinerWorker(context.Context, address.Address, types.TipSetKey) (address.Address, error)
StateMinerPeerID(ctx context.Context, m address.Address, tsk types.TipSetKey) (peer.ID, error)
StateMinerElectionPeriodStart(ctx context.Context, actor address.Address, tsk types.TipSetKey) (uint64, error)
StateMinerSectorSize(context.Context, address.Address, types.TipSetKey) (uint64, error)
StateMinerFaults(context.Context, address.Address, types.TipSetKey) ([]uint64, error)
// StateMinerProvingDeadline calculates the deadline at some epoch for a proving period
// and returns the deadline-related calculations.
StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*miner.DeadlineInfo, error)
// StateMinerPower returns the power of the indicated miner
StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error)
// StateMinerInfo returns info about the indicated miner
StateMinerInfo(context.Context, address.Address, types.TipSetKey) (MinerInfo, error)
// StateMinerDeadlines returns all the proving deadlines for the given miner
StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) (*miner.Deadlines, error)
// StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner
StateMinerFaults(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error)
// StateAllMinerFaults returns all non-expired Faults that occur within lookback epochs of the given tipset
StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*Fault, error)
// StateMinerRecoveries returns a bitfield indicating the recovering sectors of the given miner
StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error)
// StateMinerInitialPledgeCollateral returns the initial pledge collateral for the specified miner's sector
StateMinerInitialPledgeCollateral(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (types.BigInt, error)
// StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent
StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error)
// StateSectorPreCommitInfo returns the PreCommit info for the specified miner's sector
StateSectorPreCommitInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error)
// StateSectorGetInfo returns the on-chain info for the specified miner's sector
StateSectorGetInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error)
StatePledgeCollateral(context.Context, types.TipSetKey) (types.BigInt, error)
StateWaitMsg(context.Context, cid.Cid) (*MsgWait, error)
// StateSearchMsg searches for a message in the chain, and returns its receipt and the tipset where it was executed
StateSearchMsg(context.Context, cid.Cid) (*MsgLookup, error)
// StateWaitMsg looks back in the chain for a message. If not found, it blocks until the
// message arrives on chain, and gets to the indicated confidence depth.
StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*MsgLookup, error)
// StateListMiners returns the addresses of every miner that has claimed power in the Power Actor
StateListMiners(context.Context, types.TipSetKey) ([]address.Address, error)
// StateListActors returns the addresses of every actor in the state
StateListActors(context.Context, types.TipSetKey) ([]address.Address, error)
StateMarketBalance(context.Context, address.Address, types.TipSetKey) (actors.StorageParticipantBalance, error)
StateMarketParticipants(context.Context, types.TipSetKey) (map[string]actors.StorageParticipantBalance, error)
StateMarketDeals(context.Context, types.TipSetKey) (map[string]actors.OnChainDeal, error)
StateMarketStorageDeal(context.Context, uint64, types.TipSetKey) (*actors.OnChainDeal, error)
// StateMarketBalance looks up the Escrow and Locked balances of the given address in the Storage Market
StateMarketBalance(context.Context, address.Address, types.TipSetKey) (MarketBalance, error)
// StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market
StateMarketParticipants(context.Context, types.TipSetKey) (map[string]MarketBalance, error)
// StateMarketDeals returns information about every deal in the Storage Market
StateMarketDeals(context.Context, types.TipSetKey) (map[string]MarketDeal, error)
// StateMarketStorageDeal returns information about the indicated deal
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error)
// StateLookupID retrieves the ID address of the given address
StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error)
// StateAccountKey returns the public key address of the given ID address
StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error)
// StateChangedActors returns all the actors whose states change between the two given state CIDs
// TODO: Should this take tipset keys instead?
StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error)
// StateGetReceipt returns the message receipt for the given message
StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error)
// StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set
StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (MinerSectors, error)
StateCompute(context.Context, uint64, []*types.Message, types.TipSetKey) (cid.Cid, error)
// StateCompute is a flexible command that applies the given messages on the given tipset.
// The messages are run as though the VM were at the provided height.
StateCompute(context.Context, abi.ChainEpoch, []*types.Message, types.TipSetKey) (*ComputeStateOutput, error)
// MethodGroup: Msig
// The Msig methods are used to interact with multisig wallets on the
// filecoin network
// MsigGetAvailableBalance returns the portion of a multisig's balance that can be withdrawn or spent
MsigGetAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error)
// MsigCreate creates a multisig wallet
// It takes the following params: <required number of senders>, <approving addresses>, <unlock duration>
//<initial balance>, <sender address of the create msg>, <gas price>
MsigCreate(context.Context, int64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error)
// MsigPropose proposes a multisig message
// It takes the following params: <multisig address>, <recipient address>, <value to transfer>,
// <sender address of the propose msg>, <method to call in the proposed message>, <params to include in the proposed message>
MsigPropose(context.Context, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error)
// MsigApprove approves a previously-proposed multisig message
// It takes the following params: <multisig address>, <proposed message ID>, <proposer address>, <recipient address>, <value to transfer>,
// <sender address of the approve msg>, <method to call in the proposed message>, <params to include in the proposed message>
MsigApprove(context.Context, address.Address, uint64, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error)
// MsigCancel cancels a previously-proposed multisig message
// It takes the following params: <multisig address>, <proposed message ID>, <recipient address>, <value to transfer>,
// <sender address of the cancel msg>, <method to call in the proposed message>, <params to include in the proposed message>
MsigCancel(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error)
// MsigSwapPropose proposes swapping 2 signers in the multisig
// It takes the following params: <multisig address>, <sender address of the propose msg>,
// <old signer> <new signer>
MsigSwapPropose(context.Context, address.Address, address.Address, address.Address, address.Address) (cid.Cid, error)
// MsigSwapApprove approves a previously proposed SwapSigner
// It takes the following params: <multisig address>, <sender address of the approve msg>, <proposed message ID>,
// <proposer address>, <old signer> <new signer>
MsigSwapApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, address.Address) (cid.Cid, error)
// MsigSwapCancel cancels a previously proposed SwapSigner message
// It takes the following params: <multisig address>, <sender address of the cancel msg>, <proposed message ID>,
// <old signer> <new signer>
MsigSwapCancel(context.Context, address.Address, address.Address, uint64, address.Address, address.Address) (cid.Cid, error)
MarketEnsureAvailable(context.Context, address.Address, types.BigInt) error
MarketEnsureAvailable(context.Context, address.Address, address.Address, types.BigInt) (cid.Cid, error)
// MarketFreeBalance
// MethodGroup: Paych
// The Paych methods are for interacting with and managing payment channels
PaychGet(ctx context.Context, from, to address.Address, ensureFunds types.BigInt) (*ChannelInfo, error)
PaychList(context.Context) ([]address.Address, error)
PaychStatus(context.Context, address.Address) (*PaychStatus, error)
PaychClose(context.Context, address.Address) (cid.Cid, error)
PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error)
PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []VoucherSpec) (*PaymentInfo, error)
PaychVoucherCheckValid(context.Context, address.Address, *types.SignedVoucher) error
PaychVoucherCheckSpendable(context.Context, address.Address, *types.SignedVoucher, []byte, []byte) (bool, error)
PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*types.SignedVoucher, error)
PaychVoucherAdd(context.Context, address.Address, *types.SignedVoucher, []byte, types.BigInt) (types.BigInt, error)
PaychVoucherList(context.Context, address.Address) ([]*types.SignedVoucher, error)
PaychVoucherSubmit(context.Context, address.Address, *types.SignedVoucher) (cid.Cid, error)
PaychVoucherCheckValid(context.Context, address.Address, *paych.SignedVoucher) error
PaychVoucherCheckSpendable(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error)
PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*paych.SignedVoucher, error)
PaychVoucherAdd(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error)
PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error)
PaychVoucherSubmit(context.Context, address.Address, *paych.SignedVoucher) (cid.Cid, error)
}
type FileRef struct {
Path string
IsCAR bool
}
type MinerSectors struct {
Pset uint64
Sset uint64
Pset uint64
}
type Import struct {
@@ -158,19 +373,24 @@ type Import struct {
type DealInfo struct {
ProposalCid cid.Cid
State DealState
State storagemarket.StorageDealStatus
Message string // more information about deal state, particularly errors
Provider address.Address
PieceRef []byte // cid bytes
PieceCID cid.Cid
Size uint64
PricePerEpoch types.BigInt
Duration uint64
DealID abi.DealID
}
type MsgWait struct {
Receipt types.MessageReceipt
TipSet *types.TipSet
type MsgLookup struct {
Receipt types.MessageReceipt
ReturnDec interface{}
TipSet types.TipSetKey
Height abi.ChainEpoch
}
type BlockMessages struct {
@@ -186,9 +406,8 @@ type Message struct {
}
type ChainSectorInfo struct {
SectorID uint64
CommD []byte
CommR []byte
Info miner.SectorOnChainInfo
ID abi.SectorNumber
}
type ActorState struct {
@@ -217,20 +436,21 @@ type ChannelInfo struct {
type PaymentInfo struct {
Channel address.Address
ChannelMessage *cid.Cid
Vouchers []*types.SignedVoucher
Vouchers []*paych.SignedVoucher
}
type VoucherSpec struct {
Amount types.BigInt
TimeLock uint64
MinClose uint64
Amount types.BigInt
TimeLockMin abi.ChainEpoch
TimeLockMax abi.ChainEpoch
MinSettle abi.ChainEpoch
Extra *types.ModVerifyParams
Extra *paych.ModVerifyParams
}
type MinerPower struct {
MinerPower types.BigInt
TotalPower types.BigInt
MinerPower power.Claim
TotalPower power.Claim
}
type QueryOffer struct {
@@ -238,42 +458,57 @@ type QueryOffer struct {
Root cid.Cid
Size uint64
MinPrice types.BigInt
Miner address.Address
MinerPeerID peer.ID
Size uint64
MinPrice types.BigInt
PaymentInterval uint64
PaymentIntervalIncrease uint64
Miner address.Address
MinerPeerID peer.ID
}
func (o *QueryOffer) Order(client address.Address) RetrievalOrder {
return RetrievalOrder{
Root: o.Root,
Size: o.Size,
Total: o.MinPrice,
Client: client,
Root: o.Root,
Size: o.Size,
Total: o.MinPrice,
PaymentInterval: o.PaymentInterval,
PaymentIntervalIncrease: o.PaymentIntervalIncrease,
Client: client,
Miner: o.Miner,
MinerPeerID: o.MinerPeerID,
}
}
type MarketBalance struct {
Escrow big.Int
Locked big.Int
}
type MarketDeal struct {
Proposal market.DealProposal
State market.DealState
}
type RetrievalOrder struct {
// TODO: make this less unixfs specific
Root cid.Cid
Size uint64
// TODO: support offset
Total types.BigInt
Client address.Address
Miner address.Address
MinerPeerID peer.ID
Total types.BigInt
PaymentInterval uint64
PaymentIntervalIncrease uint64
Client address.Address
Miner address.Address
MinerPeerID peer.ID
}
type ReplayResults struct {
Msg *types.Message
Receipt *types.MessageReceipt
Error string
type InvocResult struct {
Msg *types.Message
MsgRct *types.MessageReceipt
ExecutionTrace types.ExecutionTrace
Error string
Duration time.Duration
}
type MethodCall struct {
@@ -281,12 +516,26 @@ type MethodCall struct {
Error string
}
type StartDealParams struct {
Data *storagemarket.DataRef
Wallet address.Address
Miner address.Address
EpochPrice types.BigInt
MinBlocksDuration uint64
DealStartEpoch abi.ChainEpoch
}
type IpldObject struct {
Cid cid.Cid
Obj interface{}
}
type ActiveSync struct {
Base *types.TipSet
Target *types.TipSet
Stage SyncStateStage
Height uint64
Height abi.ChainEpoch
Start time.Time
End time.Time
@@ -319,3 +568,51 @@ type MpoolUpdate struct {
Type MpoolChange
Message *types.SignedMessage
}
type ComputeStateOutput struct {
Root cid.Cid
Trace []*InvocResult
}
type MiningBaseInfo struct {
MinerPower types.BigInt
NetworkPower types.BigInt
Sectors []abi.SectorInfo
WorkerKey address.Address
SectorSize abi.SectorSize
PrevBeaconEntry types.BeaconEntry
BeaconEntries []types.BeaconEntry
}
type BlockTemplate struct {
Miner address.Address
Parents types.TipSetKey
Ticket *types.Ticket
Eproof *types.ElectionProof
BeaconValues []types.BeaconEntry
Messages []*types.SignedMessage
Epoch abi.ChainEpoch
Timestamp uint64
WinningPoStProof []abi.PoStProof
}
type CommPRet struct {
Root cid.Cid
Size abi.UnpaddedPieceSize
}
type HeadChange struct {
Type string
Val *types.TipSet
}
type MsigProposeResponse int
const (
MsigApprove MsigProposeResponse = iota
MsigCancel
)
type Fault struct {
Miner address.Address
Epoch abi.ChainEpoch
}
+78 -90
View File
@@ -1,112 +1,80 @@
package api
import (
"bytes"
"context"
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-sectorbuilder"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/sector-storage/stores"
"github.com/filecoin-project/sector-storage/storiface"
"github.com/filecoin-project/specs-actors/actors/abi"
)
// alias because cbor-gen doesn't like non-alias types
type SectorState = uint64
const (
UndefinedSectorState SectorState = iota
// happy path
Empty
Packing // sector not in sealStore, and not on chain
Unsealed // sealing / queued
PreCommitting // on chain pre-commit
WaitSeed // waiting for seed
Committing
CommitWait // waiting for message to land on chain
FinalizeSector
Proving
_ // reserved
_
_
// recovery handling
// Reseal
_
_
_
_
_
_
_
// error modes
FailedUnrecoverable
SealFailed
PreCommitFailed
SealCommitFailed
CommitFailed
PackingFailed
_
_
_
Faulty // sector is corrupted or gone for some reason
FaultReported // sector has been declared as a fault on chain
FaultedFinal // fault declared on chain
)
var SectorStates = []string{
UndefinedSectorState: "UndefinedSectorState",
Empty: "Empty",
Packing: "Packing",
Unsealed: "Unsealed",
PreCommitting: "PreCommitting",
WaitSeed: "WaitSeed",
Committing: "Committing",
CommitWait: "CommitWait",
FinalizeSector: "FinalizeSector",
Proving: "Proving",
SealFailed: "SealFailed",
PreCommitFailed: "PreCommitFailed",
SealCommitFailed: "SealCommitFailed",
CommitFailed: "CommitFailed",
PackingFailed: "PackingFailed",
FailedUnrecoverable: "FailedUnrecoverable",
Faulty: "Faulty",
FaultReported: "FaultReported",
FaultedFinal: "FaultedFinal",
}
// StorageMiner is a low-level interface to the Filecoin network storage miner node
type StorageMiner interface {
Common
ActorAddress(context.Context) (address.Address, error)
ActorSectorSize(context.Context, address.Address) (uint64, error)
ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error)
MiningBase(context.Context) (*types.TipSet, error)
// Temp api for testing
PledgeSector(context.Context) error
// Get the status of a given sector by ID
SectorsStatus(context.Context, uint64) (SectorInfo, error)
SectorsStatus(context.Context, abi.SectorNumber) (SectorInfo, error)
// List all staged sectors
SectorsList(context.Context) ([]uint64, error)
SectorsList(context.Context) ([]abi.SectorNumber, error)
SectorsRefs(context.Context) (map[string][]SealedRef, error)
SectorsUpdate(context.Context, uint64, SectorState) error
SectorsUpdate(context.Context, abi.SectorNumber, SectorState) error
SectorRemove(context.Context, abi.SectorNumber) error
WorkerStats(context.Context) (sectorbuilder.WorkerStats, error)
StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error)
StorageLocal(ctx context.Context) (map[stores.ID]string, error)
StorageStat(ctx context.Context, id stores.ID) (stores.FsStat, error)
// WorkerQueue registers a remote worker
WorkerQueue(context.Context, sectorbuilder.WorkerCfg) (<-chan sectorbuilder.WorkerTask, error)
// WorkerConnect tells the node to connect to workers RPC
WorkerConnect(context.Context, string) error
WorkerStats(context.Context) (map[uint64]storiface.WorkerStats, error)
WorkerDone(ctx context.Context, task uint64, res sectorbuilder.SealRes) error
stores.SectorIndex
MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error
MarketListDeals(ctx context.Context) ([]storagemarket.StorageDeal, error)
MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error)
MarketSetAsk(ctx context.Context, price types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error
MarketGetAsk(ctx context.Context) (*storagemarket.SignedStorageAsk, error)
DealsImportData(ctx context.Context, dealPropCid cid.Cid, file string) error
DealsList(ctx context.Context) ([]storagemarket.StorageDeal, error)
DealsConsiderOnlineStorageDeals(context.Context) (bool, error)
DealsSetConsiderOnlineStorageDeals(context.Context, bool) error
DealsConsiderOnlineRetrievalDeals(context.Context) (bool, error)
DealsSetConsiderOnlineRetrievalDeals(context.Context, bool) error
DealsPieceCidBlocklist(context.Context) ([]cid.Cid, error)
DealsSetPieceCidBlocklist(context.Context, []cid.Cid) error
DealsConsiderOfflineStorageDeals(context.Context) (bool, error)
DealsSetConsiderOfflineStorageDeals(context.Context, bool) error
DealsConsiderOfflineRetrievalDeals(context.Context) (bool, error)
DealsSetConsiderOfflineRetrievalDeals(context.Context, bool) error
StorageAddLocal(ctx context.Context, path string) error
}
type SealRes struct {
Err string
GoErr error `json:"-"`
Proof []byte
}
type SectorLog struct {
@@ -119,14 +87,14 @@ type SectorLog struct {
}
type SectorInfo struct {
SectorID uint64
SectorID abi.SectorNumber
State SectorState
CommD []byte
CommR []byte
CommD *cid.Cid
CommR *cid.Cid
Proof []byte
Deals []uint64
Ticket sectorbuilder.SealTicket
Seed sectorbuilder.SealSeed
Deals []abi.DealID
Ticket SealTicket
Seed SealSeed
Retries uint64
LastErr string
@@ -135,11 +103,31 @@ type SectorInfo struct {
}
type SealedRef struct {
SectorID uint64
SectorID abi.SectorNumber
Offset uint64
Size uint64
Size abi.UnpaddedPieceSize
}
type SealedRefs struct {
Refs []SealedRef
}
type SealTicket struct {
Value abi.SealRandomness
Epoch abi.ChainEpoch
}
type SealSeed struct {
Value abi.InteractiveSealRandomness
Epoch abi.ChainEpoch
}
func (st *SealTicket) Equals(ost *SealTicket) bool {
return bytes.Equal(st.Value, ost.Value) && st.Epoch == ost.Epoch
}
func (st *SealSeed) Equals(ost *SealSeed) bool {
return bytes.Equal(st.Value, ost.Value) && st.Epoch == ost.Epoch
}
type SectorState string
+34
View File
@@ -0,0 +1,34 @@
package api
import (
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"testing"
)
func goCmd() string {
var exeSuffix string
if runtime.GOOS == "windows" {
exeSuffix = ".exe"
}
path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix)
if _, err := os.Stat(path); err == nil {
return path
}
return "go"
}
func TestDoesntDependOnFFI(t *testing.T) {
deps, err := exec.Command(goCmd(), "list", "-deps", "github.com/filecoin-project/lotus/api").Output()
if err != nil {
t.Fatal(err)
}
for _, pkg := range strings.Fields(string(deps)) {
if pkg == "github.com/filecoin-project/filecoin-ffi" {
t.Fatal("api depends on filecoin-ffi")
}
}
}
+36
View File
@@ -0,0 +1,36 @@
package api
import (
"context"
"io"
"github.com/ipfs/go-cid"
"github.com/filecoin-project/sector-storage/sealtasks"
"github.com/filecoin-project/sector-storage/stores"
"github.com/filecoin-project/sector-storage/storiface"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-storage/storage"
"github.com/filecoin-project/lotus/build"
)
type WorkerAPI interface {
Version(context.Context) (build.Version, error)
// TODO: Info() (name, ...) ?
TaskTypes(context.Context) (map[sealtasks.TaskType]struct{}, error) // TaskType -> Weight
Paths(context.Context) ([]stores.StoragePath, error)
Info(context.Context) (storiface.WorkerInfo, error)
storage.Sealer
MoveStorage(ctx context.Context, sector abi.SectorID) error
UnsealPiece(context.Context, abi.SectorID, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) error
ReadPiece(context.Context, io.Writer, abi.SectorID, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize) error
Fetch(context.Context, abi.SectorID, stores.SectorFileType, stores.PathType, stores.AcquireMode) error
Closing(context.Context) (<-chan struct{}, error)
}
+6
View File
@@ -18,6 +18,12 @@ type apiBStore struct {
api ChainIO
}
func NewAPIBlockstore(cio ChainIO) blockstore.Blockstore {
return &apiBStore{
api: cio,
}
}
func (a *apiBStore) DeleteBlock(cid.Cid) error {
return xerrors.New("not supported")
}
+15 -82
View File
@@ -1,105 +1,38 @@
package apistruct
import (
"context"
"reflect"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/lotus/api"
)
type permKey int
var permCtxKey permKey
const (
// When changing these, update docs/API.md too
PermRead api.Permission = "read" // default
PermWrite api.Permission = "write"
PermSign api.Permission = "sign" // Use wallet keys for signing
PermAdmin api.Permission = "admin" // Manage permissions
PermRead auth.Permission = "read" // default
PermWrite auth.Permission = "write"
PermSign auth.Permission = "sign" // Use wallet keys for signing
PermAdmin auth.Permission = "admin" // Manage permissions
)
var AllPermissions = []api.Permission{PermRead, PermWrite, PermSign, PermAdmin}
var defaultPerms = []api.Permission{PermRead}
func WithPerm(ctx context.Context, perms []api.Permission) context.Context {
return context.WithValue(ctx, permCtxKey, perms)
}
var AllPermissions = []auth.Permission{PermRead, PermWrite, PermSign, PermAdmin}
var DefaultPerms = []auth.Permission{PermRead}
func PermissionedStorMinerAPI(a api.StorageMiner) api.StorageMiner {
var out StorageMinerStruct
permissionedAny(a, &out.Internal)
permissionedAny(a, &out.CommonStruct.Internal)
auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal)
auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.CommonStruct.Internal)
return &out
}
func PermissionedFullAPI(a api.FullNode) api.FullNode {
var out FullNodeStruct
permissionedAny(a, &out.Internal)
permissionedAny(a, &out.CommonStruct.Internal)
auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal)
auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.CommonStruct.Internal)
return &out
}
func HasPerm(ctx context.Context, perm api.Permission) bool {
callerPerms, ok := ctx.Value(permCtxKey).([]api.Permission)
if !ok {
callerPerms = defaultPerms
}
for _, callerPerm := range callerPerms {
if callerPerm == perm {
return true
}
}
return false
}
func permissionedAny(in interface{}, out interface{}) {
rint := reflect.ValueOf(out).Elem()
ra := reflect.ValueOf(in)
for f := 0; f < rint.NumField(); f++ {
field := rint.Type().Field(f)
requiredPerm := api.Permission(field.Tag.Get("perm"))
if requiredPerm == "" {
panic("missing 'perm' tag on " + field.Name) // ok
}
// Validate perm tag
ok := false
for _, perm := range AllPermissions {
if requiredPerm == perm {
ok = true
break
}
}
if !ok {
panic("unknown 'perm' tag on " + field.Name) // ok
}
fn := ra.MethodByName(field.Name)
rint.Field(f).Set(reflect.MakeFunc(field.Type, func(args []reflect.Value) (results []reflect.Value) {
ctx := args[0].Interface().(context.Context)
if HasPerm(ctx, requiredPerm) {
return fn.Call(args)
}
err := xerrors.Errorf("missing permission to invoke '%s' (need '%s')", field.Name, requiredPerm)
rerr := reflect.ValueOf(&err).Elem()
if field.Type.NumOut() == 2 {
return []reflect.Value{
reflect.Zero(field.Type.Out(0)),
rerr,
}
} else {
return []reflect.Value{rerr}
}
}))
}
func PermissionedWorkerAPI(a api.WorkerAPI) api.WorkerAPI {
var out WorkerStruct
auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal)
return &out
}
+551 -149
View File
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
package apistruct
import "testing"
func TestPermTags(t *testing.T) {
_ = PermissionedFullAPI(&FullNodeStruct{})
_ = PermissionedStorMinerAPI(&StorageMinerStruct{})
_ = PermissionedWorkerAPI(&WorkerStruct{})
}
+372 -61
View File
@@ -1,16 +1,17 @@
// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.
package api
import (
"fmt"
"io"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin/paych"
cbg "github.com/whyrusleeping/cbor-gen"
xerrors "golang.org/x/xerrors"
)
// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.
var _ = xerrors.Errorf
func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
@@ -22,15 +23,17 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
return err
}
scratch := make([]byte, 9)
// t.Channel (address.Address) (struct)
if len("Channel") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Channel\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("Channel")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Channel"))); err != nil {
return err
}
if _, err := w.Write([]byte("Channel")); err != nil {
if _, err := io.WriteString(w, "Channel"); err != nil {
return err
}
@@ -43,10 +46,10 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Value in field \"ChannelMessage\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("ChannelMessage")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ChannelMessage"))); err != nil {
return err
}
if _, err := w.Write([]byte("ChannelMessage")); err != nil {
if _, err := io.WriteString(w, "ChannelMessage"); err != nil {
return err
}
@@ -55,20 +58,20 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
return err
}
} else {
if err := cbg.WriteCid(w, *t.ChannelMessage); err != nil {
if err := cbg.WriteCidBuf(scratch, w, *t.ChannelMessage); err != nil {
return xerrors.Errorf("failed to write cid field t.ChannelMessage: %w", err)
}
}
// t.Vouchers ([]*types.SignedVoucher) (slice)
// t.Vouchers ([]*paych.SignedVoucher) (slice)
if len("Vouchers") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Vouchers\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("Vouchers")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Vouchers"))); err != nil {
return err
}
if _, err := w.Write([]byte("Vouchers")); err != nil {
if _, err := io.WriteString(w, "Vouchers"); err != nil {
return err
}
@@ -76,7 +79,7 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field t.Vouchers was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Vouchers)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Vouchers))); err != nil {
return err
}
for _, v := range t.Vouchers {
@@ -89,8 +92,9 @@ func (t *PaymentInfo) MarshalCBOR(w io.Writer) error {
func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeader(br)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -108,7 +112,7 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error {
for i := uint64(0); i < n; i++ {
{
sval, err := cbg.ReadString(br)
sval, err := cbg.ReadStringBuf(br, scratch)
if err != nil {
return err
}
@@ -123,7 +127,7 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error {
{
if err := t.Channel.UnmarshalCBOR(br); err != nil {
return err
return xerrors.Errorf("unmarshaling t.Channel: %w", err)
}
}
@@ -152,10 +156,10 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error {
}
}
// t.Vouchers ([]*types.SignedVoucher) (slice)
// t.Vouchers ([]*paych.SignedVoucher) (slice)
case "Vouchers":
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -167,12 +171,14 @@ func (t *PaymentInfo) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.Vouchers = make([]*types.SignedVoucher, extra)
t.Vouchers = make([]*paych.SignedVoucher, extra)
}
for i := 0; i < int(extra); i++ {
var v types.SignedVoucher
var v paych.SignedVoucher
if err := v.UnmarshalCBOR(br); err != nil {
return err
}
@@ -196,19 +202,21 @@ func (t *SealedRef) MarshalCBOR(w io.Writer) error {
return err
}
// t.SectorID (uint64) (uint64)
scratch := make([]byte, 9)
// t.SectorID (abi.SectorNumber) (uint64)
if len("SectorID") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"SectorID\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("SectorID")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("SectorID"))); err != nil {
return err
}
if _, err := w.Write([]byte("SectorID")); err != nil {
if _, err := io.WriteString(w, "SectorID"); err != nil {
return err
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.SectorID))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.SectorID)); err != nil {
return err
}
@@ -217,39 +225,41 @@ func (t *SealedRef) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Value in field \"Offset\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("Offset")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Offset"))); err != nil {
return err
}
if _, err := w.Write([]byte("Offset")); err != nil {
if _, err := io.WriteString(w, "Offset"); err != nil {
return err
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.Offset))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Offset)); err != nil {
return err
}
// t.Size (uint64) (uint64)
// t.Size (abi.UnpaddedPieceSize) (uint64)
if len("Size") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Size\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("Size")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Size"))); err != nil {
return err
}
if _, err := w.Write([]byte("Size")); err != nil {
if _, err := io.WriteString(w, "Size"); err != nil {
return err
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.Size))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Size)); err != nil {
return err
}
return nil
}
func (t *SealedRef) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeader(br)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -267,7 +277,7 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) error {
for i := uint64(0); i < n; i++ {
{
sval, err := cbg.ReadString(br)
sval, err := cbg.ReadStringBuf(br, scratch)
if err != nil {
return err
}
@@ -276,39 +286,51 @@ func (t *SealedRef) UnmarshalCBOR(r io.Reader) error {
}
switch name {
// t.SectorID (uint64) (uint64)
// t.SectorID (abi.SectorNumber) (uint64)
case "SectorID":
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
return err
{
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.SectorID = abi.SectorNumber(extra)
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.SectorID = uint64(extra)
// t.Offset (uint64) (uint64)
case "Offset":
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
return err
{
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Offset = uint64(extra)
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Offset = uint64(extra)
// t.Size (uint64) (uint64)
// t.Size (abi.UnpaddedPieceSize) (uint64)
case "Size":
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
return err
{
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Size = abi.UnpaddedPieceSize(extra)
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Size = uint64(extra)
default:
return fmt.Errorf("unknown struct field %d: '%s'", i, name)
@@ -326,15 +348,17 @@ func (t *SealedRefs) MarshalCBOR(w io.Writer) error {
return err
}
scratch := make([]byte, 9)
// t.Refs ([]api.SealedRef) (slice)
if len("Refs") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Refs\" was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len("Refs")))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Refs"))); err != nil {
return err
}
if _, err := w.Write([]byte("Refs")); err != nil {
if _, err := io.WriteString(w, "Refs"); err != nil {
return err
}
@@ -342,7 +366,7 @@ func (t *SealedRefs) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field t.Refs was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Refs)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Refs))); err != nil {
return err
}
for _, v := range t.Refs {
@@ -355,8 +379,9 @@ func (t *SealedRefs) MarshalCBOR(w io.Writer) error {
func (t *SealedRefs) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeader(br)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -374,7 +399,7 @@ func (t *SealedRefs) UnmarshalCBOR(r io.Reader) error {
for i := uint64(0); i < n; i++ {
{
sval, err := cbg.ReadString(br)
sval, err := cbg.ReadStringBuf(br, scratch)
if err != nil {
return err
}
@@ -386,7 +411,7 @@ func (t *SealedRefs) UnmarshalCBOR(r io.Reader) error {
// t.Refs ([]api.SealedRef) (slice)
case "Refs":
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -398,9 +423,11 @@ func (t *SealedRefs) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.Refs = make([]SealedRef, extra)
}
for i := 0; i < int(extra); i++ {
var v SealedRef
@@ -418,3 +445,287 @@ func (t *SealedRefs) UnmarshalCBOR(r io.Reader) error {
return nil
}
func (t *SealTicket) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{162}); err != nil {
return err
}
scratch := make([]byte, 9)
// t.Value (abi.SealRandomness) (slice)
if len("Value") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Value\" was too long")
}
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Value"))); err != nil {
return err
}
if _, err := io.WriteString(w, "Value"); err != nil {
return err
}
if len(t.Value) > cbg.ByteArrayMaxLen {
return xerrors.Errorf("Byte array in field t.Value was too long")
}
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Value))); err != nil {
return err
}
if _, err := w.Write(t.Value); err != nil {
return err
}
// t.Epoch (abi.ChainEpoch) (int64)
if len("Epoch") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Epoch\" was too long")
}
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Epoch"))); err != nil {
return err
}
if _, err := io.WriteString(w, "Epoch"); err != nil {
return err
}
if t.Epoch >= 0 {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil {
return err
}
} else {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil {
return err
}
}
return nil
}
func (t *SealTicket) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajMap {
return fmt.Errorf("cbor input should be of type map")
}
if extra > cbg.MaxLength {
return fmt.Errorf("SealTicket: map struct too large (%d)", extra)
}
var name string
n := extra
for i := uint64(0); i < n; i++ {
{
sval, err := cbg.ReadStringBuf(br, scratch)
if err != nil {
return err
}
name = string(sval)
}
switch name {
// t.Value (abi.SealRandomness) (slice)
case "Value":
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if extra > cbg.ByteArrayMaxLen {
return fmt.Errorf("t.Value: byte array too large (%d)", extra)
}
if maj != cbg.MajByteString {
return fmt.Errorf("expected byte array")
}
t.Value = make([]byte, extra)
if _, err := io.ReadFull(br, t.Value); err != nil {
return err
}
// t.Epoch (abi.ChainEpoch) (int64)
case "Epoch":
{
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
var extraI int64
if err != nil {
return err
}
switch maj {
case cbg.MajUnsignedInt:
extraI = int64(extra)
if extraI < 0 {
return fmt.Errorf("int64 positive overflow")
}
case cbg.MajNegativeInt:
extraI = int64(extra)
if extraI < 0 {
return fmt.Errorf("int64 negative oveflow")
}
extraI = -1 - extraI
default:
return fmt.Errorf("wrong type for int64 field: %d", maj)
}
t.Epoch = abi.ChainEpoch(extraI)
}
default:
return fmt.Errorf("unknown struct field %d: '%s'", i, name)
}
}
return nil
}
func (t *SealSeed) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{162}); err != nil {
return err
}
scratch := make([]byte, 9)
// t.Value (abi.InteractiveSealRandomness) (slice)
if len("Value") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Value\" was too long")
}
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Value"))); err != nil {
return err
}
if _, err := io.WriteString(w, "Value"); err != nil {
return err
}
if len(t.Value) > cbg.ByteArrayMaxLen {
return xerrors.Errorf("Byte array in field t.Value was too long")
}
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Value))); err != nil {
return err
}
if _, err := w.Write(t.Value); err != nil {
return err
}
// t.Epoch (abi.ChainEpoch) (int64)
if len("Epoch") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Epoch\" was too long")
}
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("Epoch"))); err != nil {
return err
}
if _, err := io.WriteString(w, "Epoch"); err != nil {
return err
}
if t.Epoch >= 0 {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Epoch)); err != nil {
return err
}
} else {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.Epoch-1)); err != nil {
return err
}
}
return nil
}
func (t *SealSeed) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajMap {
return fmt.Errorf("cbor input should be of type map")
}
if extra > cbg.MaxLength {
return fmt.Errorf("SealSeed: map struct too large (%d)", extra)
}
var name string
n := extra
for i := uint64(0); i < n; i++ {
{
sval, err := cbg.ReadStringBuf(br, scratch)
if err != nil {
return err
}
name = string(sval)
}
switch name {
// t.Value (abi.InteractiveSealRandomness) (slice)
case "Value":
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if extra > cbg.ByteArrayMaxLen {
return fmt.Errorf("t.Value: byte array too large (%d)", extra)
}
if maj != cbg.MajByteString {
return fmt.Errorf("expected byte array")
}
t.Value = make([]byte, extra)
if _, err := io.ReadFull(br, t.Value); err != nil {
return err
}
// t.Epoch (abi.ChainEpoch) (int64)
case "Epoch":
{
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
var extraI int64
if err != nil {
return err
}
switch maj {
case cbg.MajUnsignedInt:
extraI = int64(extra)
if extraI < 0 {
return fmt.Errorf("int64 positive overflow")
}
case cbg.MajNegativeInt:
extraI = int64(extra)
if extraI < 0 {
return fmt.Errorf("int64 negative oveflow")
}
extraI = -1 - extraI
default:
return fmt.Errorf("wrong type for int64 field: %d", maj)
}
t.Epoch = abi.ChainEpoch(extraI)
}
default:
return fmt.Errorf("unknown struct field %d: '%s'", i, name)
}
}
return nil
}
+21 -4
View File
@@ -1,11 +1,12 @@
package client
import (
"github.com/filecoin-project/lotus/api/apistruct"
"net/http"
"github.com/filecoin-project/go-jsonrpc"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/lib/jsonrpc"
"github.com/filecoin-project/lotus/api/apistruct"
)
// NewCommonRPC creates a new http jsonrpc client.
@@ -14,7 +15,9 @@ func NewCommonRPC(addr string, requestHeader http.Header) (api.Common, jsonrpc.C
closer, err := jsonrpc.NewMergeClient(addr, "Filecoin",
[]interface{}{
&res.Internal,
}, requestHeader)
},
requestHeader,
)
return &res, closer, err
}
@@ -38,7 +41,21 @@ func NewStorageMinerRPC(addr string, requestHeader http.Header) (api.StorageMine
[]interface{}{
&res.CommonStruct.Internal,
&res.Internal,
}, requestHeader)
},
requestHeader,
)
return &res, closer, err
}
func NewWorkerRPC(addr string, requestHeader http.Header) (api.WorkerAPI, jsonrpc.ClientCloser, error) {
var res apistruct.WorkerStruct
closer, err := jsonrpc.NewMergeClient(addr, "Filecoin",
[]interface{}{
&res.Internal,
},
requestHeader,
)
return &res, closer, err
}
+379
View File
@@ -0,0 +1,379 @@
package main
import (
"encoding/json"
"fmt"
"go/ast"
"go/parser"
"go/token"
"reflect"
"sort"
"strings"
"time"
"unicode"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/api/apistruct"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-filestore"
"github.com/libp2p/go-libp2p-core/network"
peer "github.com/libp2p/go-libp2p-peer"
"github.com/multiformats/go-multiaddr"
)
var ExampleValues = map[reflect.Type]interface{}{
reflect.TypeOf(auth.Permission("")): auth.Permission("write"),
reflect.TypeOf(""): "string value",
reflect.TypeOf(uint64(42)): uint64(42),
reflect.TypeOf(byte(7)): byte(7),
reflect.TypeOf([]byte{}): []byte("byte array"),
}
func addExample(v interface{}) {
ExampleValues[reflect.TypeOf(v)] = v
}
func init() {
c, err := cid.Decode("bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4")
if err != nil {
panic(err)
}
ExampleValues[reflect.TypeOf(c)] = c
c2, err := cid.Decode("bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve")
if err != nil {
panic(err)
}
tsk := types.NewTipSetKey(c, c2)
ExampleValues[reflect.TypeOf(tsk)] = tsk
addr, err := address.NewIDAddress(1234)
if err != nil {
panic(err)
}
ExampleValues[reflect.TypeOf(addr)] = addr
pid, err := peer.IDB58Decode("12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf")
if err != nil {
panic(err)
}
addExample(pid)
addExample(bitfield.NewFromSet([]uint64{5}))
addExample(abi.RegisteredSealProof_StackedDrg32GiBV1)
addExample(abi.RegisteredPoStProof_StackedDrgWindow32GiBV1)
addExample(abi.ChainEpoch(10101))
addExample(crypto.SigTypeBLS)
addExample(int64(9))
addExample(12.3)
addExample(123)
addExample(uintptr(0))
addExample(abi.MethodNum(1))
addExample(exitcode.ExitCode(0))
addExample(crypto.DomainSeparationTag_ElectionProofProduction)
addExample(true)
addExample(abi.UnpaddedPieceSize(1024))
addExample(abi.UnpaddedPieceSize(1024).Padded())
addExample(abi.DealID(5432))
addExample(filestore.StatusFileChanged)
addExample(abi.SectorNumber(9))
addExample(abi.SectorSize(32 * 1024 * 1024 * 1024))
addExample(api.MpoolChange(0))
addExample(network.Connected)
addExample(dtypes.NetworkName("lotus"))
addExample(api.SyncStateStage(1))
addExample(build.APIVersion)
addExample(api.PCHInbound)
addExample(time.Minute)
addExample(&types.ExecutionTrace{
Msg: exampleValue(reflect.TypeOf(&types.Message{}), nil).(*types.Message),
MsgRct: exampleValue(reflect.TypeOf(&types.MessageReceipt{}), nil).(*types.MessageReceipt),
})
addExample(map[string]types.Actor{
"t01236": exampleValue(reflect.TypeOf(types.Actor{}), nil).(types.Actor),
})
addExample(map[string]api.MarketDeal{
"t026363": exampleValue(reflect.TypeOf(api.MarketDeal{}), nil).(api.MarketDeal),
})
addExample(map[string]api.MarketBalance{
"t026363": exampleValue(reflect.TypeOf(api.MarketBalance{}), nil).(api.MarketBalance),
})
maddr, err := multiaddr.NewMultiaddr("/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior")
if err != nil {
panic(err)
}
// because reflect.TypeOf(maddr) returns the concrete type...
ExampleValues[reflect.TypeOf(struct{ A multiaddr.Multiaddr }{}).Field(0).Type] = maddr
}
func exampleValue(t, parent reflect.Type) interface{} {
v, ok := ExampleValues[t]
if ok {
return v
}
switch t.Kind() {
case reflect.Slice:
out := reflect.New(t).Elem()
reflect.Append(out, reflect.ValueOf(exampleValue(t.Elem(), t)))
return out.Interface()
case reflect.Chan:
return exampleValue(t.Elem(), nil)
case reflect.Struct:
es := exampleStruct(t, parent)
v := reflect.ValueOf(es).Elem().Interface()
ExampleValues[t] = v
return v
case reflect.Array:
out := reflect.New(t).Elem()
for i := 0; i < t.Len(); i++ {
out.Index(i).Set(reflect.ValueOf(exampleValue(t.Elem(), t)))
}
return out.Interface()
case reflect.Ptr:
if t.Elem().Kind() == reflect.Struct {
es := exampleStruct(t.Elem(), t)
//ExampleValues[t] = es
return es
}
case reflect.Interface:
return struct{}{}
}
panic(fmt.Sprintf("No example value for type: %s", t))
}
func exampleStruct(t, parent reflect.Type) interface{} {
ns := reflect.New(t)
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
if f.Type == parent {
continue
}
if strings.Title(f.Name) == f.Name {
ns.Elem().Field(i).Set(reflect.ValueOf(exampleValue(f.Type, t)))
}
}
return ns.Interface()
}
type Visitor struct {
Methods map[string]ast.Node
}
func (v *Visitor) Visit(node ast.Node) ast.Visitor {
st, ok := node.(*ast.TypeSpec)
if !ok {
return v
}
if st.Name.Name != "FullNode" {
return nil
}
iface := st.Type.(*ast.InterfaceType)
for _, m := range iface.Methods.List {
if len(m.Names) > 0 {
v.Methods[m.Names[0].Name] = m
}
}
return v
}
const noComment = "There are not yet any comments for this method."
func parseApiASTInfo() (map[string]string, map[string]string) { //nolint:golint
fset := token.NewFileSet()
pkgs, err := parser.ParseDir(fset, "./api", nil, parser.AllErrors|parser.ParseComments)
if err != nil {
fmt.Println("parse error: ", err)
}
ap := pkgs["api"]
f := ap.Files["api/api_full.go"]
cmap := ast.NewCommentMap(fset, f, f.Comments)
v := &Visitor{make(map[string]ast.Node)}
ast.Walk(v, pkgs["api"])
groupDocs := make(map[string]string)
out := make(map[string]string)
for mn, node := range v.Methods {
cs := cmap.Filter(node).Comments()
if len(cs) == 0 {
out[mn] = noComment
} else {
for _, c := range cs {
if strings.HasPrefix(c.Text(), "MethodGroup:") {
parts := strings.Split(c.Text(), "\n")
groupName := strings.TrimSpace(parts[0][12:])
comment := strings.Join(parts[1:], "\n")
groupDocs[groupName] = comment
break
}
}
last := cs[len(cs)-1].Text()
if !strings.HasPrefix(last, "MethodGroup:") {
out[mn] = last
} else {
out[mn] = noComment
}
}
}
return out, groupDocs
}
type MethodGroup struct {
GroupName string
Header string
Methods []*Method
}
type Method struct {
Comment string
Name string
InputExample string
ResponseExample string
}
func methodGroupFromName(mn string) string {
i := strings.IndexFunc(mn[1:], func(r rune) bool {
return unicode.IsUpper(r)
})
if i < 0 {
return ""
}
return mn[:i+1]
}
func main() {
comments, groupComments := parseApiASTInfo()
groups := make(map[string]*MethodGroup)
var api struct{ api.FullNode }
t := reflect.TypeOf(api)
for i := 0; i < t.NumMethod(); i++ {
m := t.Method(i)
groupName := methodGroupFromName(m.Name)
g, ok := groups[groupName]
if !ok {
g = new(MethodGroup)
g.Header = groupComments[groupName]
g.GroupName = groupName
groups[groupName] = g
}
var args []interface{}
ft := m.Func.Type()
for j := 2; j < ft.NumIn(); j++ {
inp := ft.In(j)
args = append(args, exampleValue(inp, nil))
}
v, err := json.MarshalIndent(args, "", " ")
if err != nil {
panic(err)
}
outv := exampleValue(ft.Out(0), nil)
ov, err := json.MarshalIndent(outv, "", " ")
if err != nil {
panic(err)
}
g.Methods = append(g.Methods, &Method{
Name: m.Name,
Comment: comments[m.Name],
InputExample: string(v),
ResponseExample: string(ov),
})
}
var groupslice []*MethodGroup
for _, g := range groups {
groupslice = append(groupslice, g)
}
sort.Slice(groupslice, func(i, j int) bool {
return groupslice[i].GroupName < groupslice[j].GroupName
})
fmt.Printf("# Groups\n")
for _, g := range groupslice {
fmt.Printf("* [%s](#%s)\n", g.GroupName, g.GroupName)
for _, method := range g.Methods {
fmt.Printf(" * [%s](#%s)\n", method.Name, method.Name)
}
}
permStruct := reflect.TypeOf(apistruct.FullNodeStruct{}.Internal)
commonPermStruct := reflect.TypeOf(apistruct.CommonStruct{}.Internal)
for _, g := range groupslice {
g := g
fmt.Printf("## %s\n", g.GroupName)
fmt.Printf("%s\n\n", g.Header)
sort.Slice(g.Methods, func(i, j int) bool {
return g.Methods[i].Name < g.Methods[j].Name
})
for _, m := range g.Methods {
fmt.Printf("### %s\n", m.Name)
fmt.Printf("%s\n\n", m.Comment)
meth, ok := permStruct.FieldByName(m.Name)
if !ok {
meth, ok = commonPermStruct.FieldByName(m.Name)
if !ok {
panic("no perms for method: " + m.Name)
}
}
perms := meth.Tag.Get("perm")
fmt.Printf("Perms: %s\n\n", perms)
if strings.Count(m.InputExample, "\n") > 0 {
fmt.Printf("Inputs:\n```json\n%s\n```\n\n", m.InputExample)
} else {
fmt.Printf("Inputs: `%s`\n\n", m.InputExample)
}
if strings.Count(m.ResponseExample, "\n") > 0 {
fmt.Printf("Response:\n```json\n%s\n```\n\n", m.ResponseExample)
} else {
fmt.Printf("Response: `%s`\n\n", m.ResponseExample)
}
}
}
}
+148 -37
View File
@@ -8,15 +8,26 @@ import (
"math/rand"
"os"
"path/filepath"
"sync/atomic"
"testing"
"time"
logging "github.com/ipfs/go-log/v2"
"github.com/ipfs/go-cid"
files "github.com/ipfs/go-ipfs-files"
logging "github.com/ipfs/go-log/v2"
"github.com/ipld/go-car"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
dag "github.com/ipfs/go-merkledag"
dstest "github.com/ipfs/go-merkledag/test"
unixfile "github.com/ipfs/go-unixfs/file"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/impl"
ipld "github.com/ipfs/go-ipld-format"
)
func init() {
@@ -24,11 +35,11 @@ func init() {
build.InsecurePoStValidation = true
}
func TestDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration) {
os.Setenv("BELLMAN_NO_GPU", "1")
func TestDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration, carExport bool) {
_ = os.Setenv("BELLMAN_NO_GPU", "1")
ctx := context.Background()
n, sn := b(t, 1, []int{0})
n, sn := b(t, 1, oneMiner)
client := n[0].FullNode.(*impl.FullNodeAPI)
miner := sn[0]
@@ -42,8 +53,67 @@ func TestDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration) {
}
time.Sleep(time.Second)
data := make([]byte, 1000)
rand.New(rand.NewSource(5)).Read(data)
mine := int64(1)
done := make(chan struct{})
go func() {
defer close(done)
for atomic.LoadInt64(&mine) == 1 {
time.Sleep(blocktime)
if err := sn[0].MineOne(ctx, func(bool, error) {}); err != nil {
t.Error(err)
}
}
}()
makeDeal(t, ctx, 6, client, miner, carExport)
atomic.AddInt64(&mine, -1)
fmt.Println("shutting down mining")
<-done
}
func TestDoubleDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration) {
_ = os.Setenv("BELLMAN_NO_GPU", "1")
ctx := context.Background()
n, sn := b(t, 1, oneMiner)
client := n[0].FullNode.(*impl.FullNodeAPI)
miner := sn[0]
addrinfo, err := client.NetAddrsListen(ctx)
if err != nil {
t.Fatal(err)
}
if err := miner.NetConnect(ctx, addrinfo); err != nil {
t.Fatal(err)
}
time.Sleep(time.Second)
mine := int64(1)
done := make(chan struct{})
go func() {
defer close(done)
for atomic.LoadInt64(&mine) == 1 {
time.Sleep(blocktime)
if err := sn[0].MineOne(ctx, func(bool, error) {}); err != nil {
t.Error(err)
}
}
}()
makeDeal(t, ctx, 6, client, miner, false)
makeDeal(t, ctx, 7, client, miner, false)
atomic.AddInt64(&mine, -1)
fmt.Println("shutting down mining")
<-done
}
func makeDeal(t *testing.T, ctx context.Context, rseed int, client *impl.FullNodeAPI, miner TestStorageNode, carExport bool) {
data := make([]byte, 1600)
rand.New(rand.NewSource(int64(rseed))).Read(data)
r := bytes.NewReader(data)
fcid, err := client.ClientImportLocal(ctx, r)
@@ -51,36 +121,43 @@ func TestDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration) {
t.Fatal(err)
}
fmt.Println("FILE CID: ", fcid)
deal := startDeal(t, ctx, miner, client, fcid)
// TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this
time.Sleep(time.Second)
waitDealSealed(t, ctx, client, deal)
// Retrieval
testRetrieval(t, ctx, err, client, fcid, carExport, data)
}
func startDeal(t *testing.T, ctx context.Context, miner TestStorageNode, client *impl.FullNodeAPI, fcid cid.Cid) *cid.Cid {
maddr, err := miner.ActorAddress(ctx)
if err != nil {
t.Fatal(err)
}
fmt.Println("FILE CID: ", fcid)
mine := true
done := make(chan struct{})
go func() {
defer close(done)
for mine {
time.Sleep(blocktime)
if err := sn[0].MineOne(ctx); err != nil {
t.Error(err)
}
}
}()
addr, err := client.WalletDefaultAddress(ctx)
if err != nil {
t.Fatal(err)
}
deal, err := client.ClientStartDeal(ctx, fcid, addr, maddr, types.NewInt(40000000), 100)
deal, err := client.ClientStartDeal(ctx, &api.StartDealParams{
Data: &storagemarket.DataRef{Root: fcid},
Wallet: addr,
Miner: maddr,
EpochPrice: types.NewInt(1000000),
MinBlocksDuration: 100,
})
if err != nil {
t.Fatal(err)
t.Fatalf("%+v", err)
}
return deal
}
// TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this
time.Sleep(time.Second)
func waitDealSealed(t *testing.T, ctx context.Context, client *impl.FullNodeAPI, deal *cid.Cid) {
loop:
for {
di, err := client.ClientGetDealInfo(ctx, *deal)
@@ -88,22 +165,22 @@ loop:
t.Fatal(err)
}
switch di.State {
case api.DealRejected:
case storagemarket.StorageDealProposalRejected:
t.Fatal("deal rejected")
case api.DealFailed:
case storagemarket.StorageDealFailing:
t.Fatal("deal failed")
case api.DealError:
t.Fatal("deal errored")
case api.DealComplete:
case storagemarket.StorageDealError:
t.Fatal("deal errored", di.Message)
case storagemarket.StorageDealActive:
fmt.Println("COMPLETE", di)
break loop
}
fmt.Println("Deal state: ", api.DealStates[di.State])
fmt.Println("Deal state: ", storagemarket.DealStates[di.State])
time.Sleep(time.Second / 2)
}
}
// Retrieval
func testRetrieval(t *testing.T, ctx context.Context, err error, client *impl.FullNodeAPI, fcid cid.Cid, carExport bool, data []byte) {
offers, err := client.ClientFindData(ctx, fcid)
if err != nil {
t.Fatal(err)
@@ -117,14 +194,18 @@ loop:
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(rpath)
defer os.RemoveAll(rpath) //nolint:errcheck
caddr, err := client.WalletDefaultAddress(ctx)
if err != nil {
t.Fatal(err)
}
err = client.ClientRetrieve(ctx, offers[0].Order(caddr), filepath.Join(rpath, "ret"))
ref := &api.FileRef{
Path: filepath.Join(rpath, "ret"),
IsCAR: carExport,
}
err = client.ClientRetrieve(ctx, offers[0].Order(caddr), ref)
if err != nil {
t.Fatalf("%+v", err)
}
@@ -134,11 +215,41 @@ loop:
t.Fatal(err)
}
if carExport {
rdata = extractCarData(t, ctx, rdata, rpath)
}
if !bytes.Equal(rdata, data) {
t.Fatal("wrong data retrieved")
}
}
mine = false
fmt.Println("shutting down mining")
<-done
func extractCarData(t *testing.T, ctx context.Context, rdata []byte, rpath string) []byte {
bserv := dstest.Bserv()
ch, err := car.LoadCar(bserv.Blockstore(), bytes.NewReader(rdata))
if err != nil {
t.Fatal(err)
}
b, err := bserv.GetBlock(ctx, ch.Roots[0])
if err != nil {
t.Fatal(err)
}
nd, err := ipld.Decode(b)
if err != nil {
t.Fatal(err)
}
dserv := dag.NewDAGService(bserv)
fil, err := unixfile.NewUnixfsFile(ctx, dserv, nd)
if err != nil {
t.Fatal(err)
}
outPath := filepath.Join(rpath, "retLoadedCAR")
if err := files.WriteTo(fil, outPath); err != nil {
t.Fatal(err)
}
rdata, err = ioutil.ReadFile(outPath)
if err != nil {
t.Fatal(err)
}
return rdata
}
+173 -4
View File
@@ -1,31 +1,200 @@
package test
import (
"bytes"
"context"
"fmt"
"math/rand"
"os"
"sync/atomic"
"testing"
"time"
logging "github.com/ipfs/go-log/v2"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/node/impl"
)
var log = logging.Logger("apitest")
func (ts *testSuite) testMining(t *testing.T) {
ctx := context.Background()
apis, sn := ts.makeNodes(t, 1, []int{0})
apis, sn := ts.makeNodes(t, 1, oneMiner)
api := apis[0]
h1, err := api.ChainHead(ctx)
require.NoError(t, err)
require.Equal(t, uint64(0), h1.Height())
require.Equal(t, abi.ChainEpoch(0), h1.Height())
newHeads, err := api.ChainNotify(ctx)
require.NoError(t, err)
<-newHeads
err = sn[0].MineOne(ctx)
err = sn[0].MineOne(ctx, func(bool, error) {})
require.NoError(t, err)
<-newHeads
h2, err := api.ChainHead(ctx)
require.NoError(t, err)
require.Equal(t, uint64(1), h2.Height())
require.Equal(t, abi.ChainEpoch(1), h2.Height())
}
func (ts *testSuite) testMiningReal(t *testing.T) {
build.InsecurePoStValidation = false
defer func() {
build.InsecurePoStValidation = true
}()
ctx := context.Background()
apis, sn := ts.makeNodes(t, 1, oneMiner)
api := apis[0]
h1, err := api.ChainHead(ctx)
require.NoError(t, err)
require.Equal(t, abi.ChainEpoch(0), h1.Height())
newHeads, err := api.ChainNotify(ctx)
require.NoError(t, err)
<-newHeads
err = sn[0].MineOne(ctx, func(bool, error) {})
require.NoError(t, err)
<-newHeads
h2, err := api.ChainHead(ctx)
require.NoError(t, err)
require.Equal(t, abi.ChainEpoch(1), h2.Height())
err = sn[0].MineOne(ctx, func(bool, error) {})
require.NoError(t, err)
<-newHeads
h2, err = api.ChainHead(ctx)
require.NoError(t, err)
require.Equal(t, abi.ChainEpoch(2), h2.Height())
}
func TestDealMining(t *testing.T, b APIBuilder, blocktime time.Duration, carExport bool) {
_ = os.Setenv("BELLMAN_NO_GPU", "1")
// test making a deal with a fresh miner, and see if it starts to mine
ctx := context.Background()
n, sn := b(t, 1, []StorageMiner{
{Full: 0, Preseal: PresealGenesis},
{Full: 0, Preseal: 0}, // TODO: Add support for storage miners on non-first full node
})
client := n[0].FullNode.(*impl.FullNodeAPI)
provider := sn[1]
genesisMiner := sn[0]
addrinfo, err := client.NetAddrsListen(ctx)
if err != nil {
t.Fatal(err)
}
if err := provider.NetConnect(ctx, addrinfo); err != nil {
t.Fatal(err)
}
if err := genesisMiner.NetConnect(ctx, addrinfo); err != nil {
t.Fatal(err)
}
time.Sleep(time.Second)
data := make([]byte, 600)
rand.New(rand.NewSource(5)).Read(data)
r := bytes.NewReader(data)
fcid, err := client.ClientImportLocal(ctx, r)
if err != nil {
t.Fatal(err)
}
fmt.Println("FILE CID: ", fcid)
var mine int32 = 1
done := make(chan struct{})
minedTwo := make(chan struct{})
go func() {
doneMinedTwo := false
defer close(done)
prevExpect := 0
for atomic.LoadInt32(&mine) != 0 {
wait := make(chan int, 2)
mdone := func(mined bool, err error) {
go func() {
n := 0
if mined {
n = 1
}
wait <- n
}()
}
if err := sn[0].MineOne(ctx, mdone); err != nil {
t.Error(err)
}
if err := sn[1].MineOne(ctx, mdone); err != nil {
t.Error(err)
}
expect := <-wait
expect += <-wait
time.Sleep(blocktime)
for {
n := 0
for i, node := range sn {
mb, err := node.MiningBase(ctx)
if err != nil {
t.Error(err)
return
}
if len(mb.Cids()) != expect {
log.Warnf("node %d mining base not complete (%d, want %d)", i, len(mb.Cids()), expect)
continue
}
n++
}
if n == len(sn) {
break
}
time.Sleep(blocktime)
}
if prevExpect == 2 && expect == 2 && !doneMinedTwo {
close(minedTwo)
doneMinedTwo = true
}
prevExpect = expect
}
}()
deal := startDeal(t, ctx, provider, client, fcid)
// TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this
time.Sleep(time.Second)
waitDealSealed(t, ctx, client, deal)
<-minedTwo
atomic.StoreInt32(&mine, 0)
fmt.Println("shutting down mining")
<-done
}
+21 -9
View File
@@ -4,9 +4,11 @@ import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/stretchr/testify/assert"
)
type TestNode struct {
@@ -16,7 +18,16 @@ type TestNode struct {
type TestStorageNode struct {
api.StorageMiner
MineOne func(context.Context) error
MineOne func(context.Context, func(bool, error)) error
}
var PresealGenesis = -1
const GenesisPreseals = 2
type StorageMiner struct {
Full int
Preseal int
}
// APIBuilder is a function which is invoked in test suite to provide
@@ -24,7 +35,7 @@ type TestStorageNode struct {
//
// storage array defines storage nodes, numbers in the array specify full node
// index the storage node 'belongs' to
type APIBuilder func(t *testing.T, nFull int, storage []int) ([]TestNode, []TestStorageNode)
type APIBuilder func(t *testing.T, nFull int, storage []StorageMiner) ([]TestNode, []TestStorageNode)
type testSuite struct {
makeNodes APIBuilder
}
@@ -39,25 +50,26 @@ func TestApis(t *testing.T, b APIBuilder) {
t.Run("id", ts.testID)
t.Run("testConnectTwo", ts.testConnectTwo)
t.Run("testMining", ts.testMining)
t.Run("testMiningReal", ts.testMiningReal)
}
var oneMiner = []StorageMiner{{Full: 0, Preseal: PresealGenesis}}
func (ts *testSuite) testVersion(t *testing.T) {
ctx := context.Background()
apis, _ := ts.makeNodes(t, 1, []int{0})
apis, _ := ts.makeNodes(t, 1, oneMiner)
api := apis[0]
v, err := api.Version(ctx)
if err != nil {
t.Fatal(err)
}
if v.Version != build.BuildVersion {
t.Error("Version didn't work properly")
}
require.Equal(t, v.Version, build.BuildVersion)
}
func (ts *testSuite) testID(t *testing.T) {
ctx := context.Background()
apis, _ := ts.makeNodes(t, 1, []int{0})
apis, _ := ts.makeNodes(t, 1, oneMiner)
api := apis[0]
id, err := api.ID(ctx)
@@ -69,7 +81,7 @@ func (ts *testSuite) testID(t *testing.T) {
func (ts *testSuite) testConnectTwo(t *testing.T) {
ctx := context.Background()
apis, _ := ts.makeNodes(t, 2, []int{0})
apis, _ := ts.makeNodes(t, 2, oneMiner)
p, err := apis[0].NetPeers(ctx)
if err != nil {
+169
View File
@@ -0,0 +1,169 @@
package test
import (
"context"
"fmt"
"github.com/filecoin-project/lotus/api"
"os"
"strings"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/specs-actors/actors/abi"
miner2 "github.com/filecoin-project/specs-actors/actors/builtin/miner"
sealing "github.com/filecoin-project/storage-fsm"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/impl"
)
func TestPledgeSector(t *testing.T, b APIBuilder, blocktime time.Duration, nSectors int) {
os.Setenv("BELLMAN_NO_GPU", "1")
ctx := context.Background()
n, sn := b(t, 1, oneMiner)
client := n[0].FullNode.(*impl.FullNodeAPI)
miner := sn[0]
addrinfo, err := client.NetAddrsListen(ctx)
if err != nil {
t.Fatal(err)
}
if err := miner.NetConnect(ctx, addrinfo); err != nil {
t.Fatal(err)
}
time.Sleep(time.Second)
mine := true
done := make(chan struct{})
go func() {
defer close(done)
for mine {
time.Sleep(blocktime)
if err := sn[0].MineOne(ctx, func(bool, error) {}); err != nil {
t.Error(err)
}
}
}()
pledgeSectors(t, ctx, miner, nSectors)
mine = false
<-done
}
func pledgeSectors(t *testing.T, ctx context.Context, miner TestStorageNode, n int) {
for i := 0; i < n; i++ {
err := miner.PledgeSector(ctx)
require.NoError(t, err)
}
for {
s, err := miner.SectorsList(ctx) // Note - the test builder doesn't import genesis sectors into FSM
require.NoError(t, err)
fmt.Printf("Sectors: %d\n", len(s))
if len(s) >= n {
break
}
time.Sleep(100 * time.Millisecond)
}
fmt.Printf("All sectors is fsm\n")
s, err := miner.SectorsList(ctx)
require.NoError(t, err)
toCheck := map[abi.SectorNumber]struct{}{}
for _, number := range s {
toCheck[number] = struct{}{}
}
for len(toCheck) > 0 {
for n := range toCheck {
st, err := miner.SectorsStatus(ctx, n)
require.NoError(t, err)
if st.State == api.SectorState(sealing.Proving) {
delete(toCheck, n)
}
if strings.Contains(string(st.State), "Fail") {
t.Fatal("sector in a failed state", st.State)
}
}
time.Sleep(100 * time.Millisecond)
fmt.Printf("WaitSeal: %d\n", len(s))
}
}
func TestWindowPost(t *testing.T, b APIBuilder, blocktime time.Duration, nSectors int) {
os.Setenv("BELLMAN_NO_GPU", "1")
ctx := context.Background()
n, sn := b(t, 1, oneMiner)
client := n[0].FullNode.(*impl.FullNodeAPI)
miner := sn[0]
addrinfo, err := client.NetAddrsListen(ctx)
if err != nil {
t.Fatal(err)
}
if err := miner.NetConnect(ctx, addrinfo); err != nil {
t.Fatal(err)
}
time.Sleep(time.Second)
mine := true
done := make(chan struct{})
go func() {
defer close(done)
for mine {
time.Sleep(blocktime)
if err := sn[0].MineOne(ctx, func(bool, error) {}); err != nil {
t.Error(err)
}
}
}()
pledgeSectors(t, ctx, miner, nSectors)
maddr, err := miner.ActorAddress(ctx)
require.NoError(t, err)
di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK)
require.NoError(t, err)
fmt.Printf("Running one proving periods\n")
for {
head, err := client.ChainHead(ctx)
require.NoError(t, err)
if head.Height() > di.PeriodStart+(miner2.WPoStProvingPeriod)+2 {
break
}
if head.Height()%100 == 0 {
fmt.Printf("@%d\n", head.Height())
}
time.Sleep(blocktime)
}
p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK)
require.NoError(t, err)
ssz, err := miner.ActorSectorSize(ctx, maddr)
require.NoError(t, err)
require.Equal(t, p.MinerPower, p.TotalPower)
require.Equal(t, p.MinerPower.RawBytePower, types.NewInt(uint64(ssz)*uint64(nSectors+GenesisPreseals)))
// TODO: Inject faults here
mine = false
<-done
}
+48 -30
View File
@@ -2,41 +2,16 @@ package api
import (
"encoding/json"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/libp2p/go-libp2p-core/peer"
ma "github.com/multiformats/go-multiaddr"
)
type DealState = uint64
const (
DealUnknown = DealState(iota)
DealRejected // Provider didn't like the proposal
DealAccepted // Proposal accepted, data moved
DealStaged // Data put into the sector
DealSealing // Data in process of being sealed
DealFailed
DealComplete
// Internal
DealError // deal failed with an unexpected error
DealNoUpdate = DealUnknown
)
var DealStates = []string{
"DealUnknown",
"DealRejected",
"DealAccepted",
"DealStaged",
"DealSealing",
"DealFailed",
"DealComplete",
"DealError",
}
// TODO: check if this exists anywhere else
type MultiaddrSlice []ma.Multiaddr
func (m *MultiaddrSlice) UnmarshalJSON(raw []byte) (err error) {
@@ -57,3 +32,46 @@ func (m *MultiaddrSlice) UnmarshalJSON(raw []byte) (err error) {
}
var _ json.Unmarshaler = new(MultiaddrSlice)
type ObjStat struct {
Size uint64
Links uint64
}
type PubsubScore struct {
ID peer.ID
Score float64
}
type MinerInfo struct {
Owner address.Address // Must be an ID-address.
Worker address.Address // Must be an ID-address.
NewWorker address.Address // Must be an ID-address.
WorkerChangeEpoch abi.ChainEpoch
PeerId peer.ID
Multiaddrs []abi.Multiaddrs
SealProofType abi.RegisteredSealProof
SectorSize abi.SectorSize
WindowPoStPartitionSectors uint64
}
func NewApiMinerInfo(info miner.MinerInfo) MinerInfo {
mi := MinerInfo{
Owner: info.Owner,
Worker: info.Worker,
NewWorker: address.Undef,
WorkerChangeEpoch: -1,
PeerId: peer.ID(info.PeerId),
Multiaddrs: info.Multiaddrs,
SealProofType: info.SealProofType,
SectorSize: info.SectorSize,
WindowPoStPartitionSectors: info.WindowPoStPartitionSectors,
}
if info.PendingWorkerKey != nil {
mi.NewWorker = info.PendingWorkerKey.NewWorker
mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt
}
return mi
}
+4 -4
View File
@@ -4,12 +4,12 @@ import (
"context"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/crypto"
)
type SignFunc = func(context.Context, []byte) (*types.Signature, error)
type SignFunc = func(context.Context, []byte) (*crypto.Signature, error)
type Signer func(context.Context, address.Address, []byte) (*types.Signature, error)
type Signer func(context.Context, address.Address, []byte) (*crypto.Signature, error)
type Signable interface {
Sign(context.Context, SignFunc) error
@@ -17,7 +17,7 @@ type Signable interface {
func SignWith(ctx context.Context, signer Signer, addr address.Address, signable ...Signable) error {
for _, s := range signable {
err := s.Sign(ctx, func(ctx context.Context, b []byte) (*types.Signature, error) {
err := s.Sign(ctx, func(ctx context.Context, b []byte) (*crypto.Signature, error) {
return signer(ctx, addr, b)
})
if err != nil {
-177
View File
@@ -1,177 +0,0 @@
#!/bin/sh
GOCC=${GOCC=go}
die() {
echo "$@" >&2
exit 1
}
have_binary() {
type "$1" > /dev/null 2> /dev/null
}
check_writable() {
printf "" > "$1" && rm "$1"
}
try_download() {
url="$1"
output="$2"
command="$3"
util_name="$(set -- $command; echo "$1")"
if ! have_binary "$util_name"; then
return 1
fi
printf '==> Using %s to download "%s" to "%s"\n' "$util_name" "$url" "$output"
if eval "$command"; then
echo "==> Download complete!"
return
else
echo "error: couldn't download with $util_name ($?)"
return 1
fi
}
download() {
dl_url="$1"
dl_output="$2"
test "$#" -eq "2" || die "download requires exactly two arguments, was given $@"
if ! check_writable "$dl_output"; then
die "download error: cannot write to $dl_output"
fi
try_download "$dl_url" "$dl_output" "wget '$dl_url' -O '$dl_output'" && return
try_download "$dl_url" "$dl_output" "curl --silent --fail --output '$dl_output' '$dl_url'" && return
try_download "$dl_url" "$dl_output" "fetch '$dl_url' -o '$dl_output'" && return
try_download "$dl_url" "$dl_output" "http '$dl_url' > '$dl_output'" && return
try_download "$dl_url" "$dl_output" "ftp -o '$dl_output' '$dl_url'" && return
die "Unable to download $dl_url. exiting."
}
unarchive() {
ua_archivetype="$1"
ua_infile="$2"
ua_outfile="$3"
ua_distname="$4"
ua_binpostfix=""
ua_os=$(uname -o)
if [ "$ua_os" = "Msys" ] || [ "$ua_os" = "Cygwin" ] ; then
ua_binpostfix=".exe"
fi
ua_outfile="$ua_outfile$ua_binpostfix"
if ! check_writable "$ua_outfile"; then
die "unarchive error: cannot write to $ua_outfile"
fi
case "$ua_archivetype" in
tar.gz)
if have_binary tar; then
echo "==> using 'tar' to extract binary from archive"
< "$ua_infile" tar -Ozxf - "$ua_distname/$ua_distname$ua_binpostfix" > "$ua_outfile" \
|| die "tar has failed"
else
die "no binary on system for extracting tar files"
fi
;;
zip)
if have_binary unzip; then
echo "==> using 'unzip' to extract binary from archive"
unzip -p "$ua_infile" "$ua_distname/$ua_distname$ua_binpostfix" > "$ua_outfile" \
|| die "unzip has failed"
else
die "no installed method for extracting .zip archives"
fi
;;
*)
die "unrecognized archive type '$ua_archivetype'"
esac
chmod +x "$ua_outfile" || die "chmod has failed"
}
get_go_vars() {
if [ ! -z "$GOOS" ] && [ ! -z "$GOARCH" ]; then
printf "%s-%s" "$GOOS" "$GOARCH"
elif have_binary go; then
printf "%s-%s" "$($GOCC env GOOS)" "$($GOCC env GOARCH)"
else
die "no way of determining system GOOS and GOARCH\nPlease manually set GOOS and GOARCH then retry."
fi
}
mkurl() {
m_root="$1"
m_name="$2"
m_vers="$3"
m_archive="$4"
m_govars=$(get_go_vars) || die "could not get go env vars"
echo "https://ipfs.io$m_root/$m_name/$m_vers/${m_name}_${m_vers}_$m_govars.$m_archive"
}
distroot="$1"
distname="$2"
outpath="$3"
version="$4"
if [ -z "$distroot" ] || [ -z "$distname" ] || [ -z "$outpath" ] || [ -z "$version" ]; then
die "usage: dist_get <distroot> <distname> <outpath> <version>"
fi
case $version in
v*)
# correct input
;;
*)
echo "invalid version '$version'" >&2
die "versions must begin with 'v', for example: v0.4.0"
;;
esac
# TODO: don't depend on the go tool being installed to detect this
goenv=$(get_go_vars) || die "could not get go env vars"
case $goenv in
linux-*)
archive="tar.gz"
;;
darwin-*)
archive="tar.gz"
;;
windows-*)
archive="zip"
;;
freebsd-*)
archive="tar.gz"
;;
openbsd-*)
archive="tar.gz"
;;
*)
echo "unrecognized system environment: $goenv" >&2
die "currently only linux, darwin, windows and freebsd are supported by this script"
esac
mkdir -p bin/tmp
url=$(mkurl "$distroot" "$distname" "$version" "$archive")
tmpfi="bin/tmp/$distname.$archive"
download "$url" "$tmpfi"
if [ $? -ne 0 ]; then
die "failed to download $url to $tmpfi"
fi
unarchive "$archive" "$tmpfi" "$outpath" "$distname"
if [ $? -ne 0 ]; then
die "failed to extract archive $tmpfi"
fi
+13
View File
@@ -13,6 +13,10 @@ import (
)
func BuiltinBootstrap() ([]peer.AddrInfo, error) {
if DisableBuiltinAssets {
return nil, nil
}
var out []peer.AddrInfo
b := rice.MustFindBox("bootstrap")
@@ -34,3 +38,12 @@ func BuiltinBootstrap() ([]peer.AddrInfo, error) {
})
return out, err
}
func DrandBootstrap() ([]peer.AddrInfo, error) {
addrs := []string{
"/dnsaddr/pl-eu.testnet.drand.sh/",
"/dnsaddr/pl-us.testnet.drand.sh/",
"/dnsaddr/pl-sin.testnet.drand.sh/",
}
return addrutil.ParseAddresses(context.TODO(), addrs)
}
+12 -6
View File
@@ -1,6 +1,12 @@
/dns4/lotus-bootstrap-0.sin.fil-test.net/tcp/1347/p2p/12D3KooWLZs8BWtEzRTYET4yR4jzDtPamaA1YsyPQJq6cf2RfxBD
/dns4/lotus-bootstrap-1.sin.fil-test.net/tcp/1347/p2p/12D3KooWGvrgjWw4Yqo4AFWqYp4g37FpUvUCQBkNWudZVSwR9tY1
/dns4/lotus-bootstrap-0.fra.fil-test.net/tcp/1347/p2p/12D3KooWSfNcrD1cs5Cj5eSHbK6nHCqJLffAuPqvRMBRgvUdqQhX
/dns4/lotus-bootstrap-1.fra.fil-test.net/tcp/1347/p2p/12D3KooWNkXyVPspUnrHUiSC3VJPMcXvHuNdy3BTCLTPPnDgwwTT
/dns4/lotus-bootstrap-0.dfw.fil-test.net/tcp/1347/p2p/12D3KooWSgJWJZK8LTRtCWzPa5FQheCFJjHpficVYgEQWeimcqCu
/dns4/lotus-bootstrap-1.dfw.fil-test.net/tcp/1347/p2p/12D3KooWFPaC4dyGpbNXCpVHjZucdJnDwmv4ng9tponPx5GrzJkT
/dns4/bootstrap-0-sin.fil-test.net/tcp/1347/p2p/12D3KooWPdUquftaQvoQEtEdsRBAhwD6jopbF2oweVTzR59VbHEd
/ip4/86.109.15.57/tcp/1347/p2p/12D3KooWPdUquftaQvoQEtEdsRBAhwD6jopbF2oweVTzR59VbHEd
/dns4/bootstrap-0-dfw.fil-test.net/tcp/1347/p2p/12D3KooWQSCkHCzosEyrh8FgYfLejKgEPM5VB6qWzZE3yDAuXn8d
/ip4/139.178.84.45/tcp/1347/p2p/12D3KooWQSCkHCzosEyrh8FgYfLejKgEPM5VB6qWzZE3yDAuXn8d
/dns4/bootstrap-0-fra.fil-test.net/tcp/1347/p2p/12D3KooWEXN2eQmoyqnNjde9PBAQfQLHN67jcEdWU6JougWrgXJK
/ip4/136.144.49.17/tcp/1347/p2p/12D3KooWEXN2eQmoyqnNjde9PBAQfQLHN67jcEdWU6JougWrgXJK
/dns4/bootstrap-1-sin.fil-test.net/tcp/1347/p2p/12D3KooWLmJkZd33mJhjg5RrpJ6NFep9SNLXWc4uVngV4TXKwzYw
/ip4/86.109.15.123/tcp/1347/p2p/12D3KooWLmJkZd33mJhjg5RrpJ6NFep9SNLXWc4uVngV4TXKwzYw
/dns4/bootstrap-1-dfw.fil-test.net/tcp/1347/p2p/12D3KooWGXLHjiz6pTRu7x2pkgTVCoxcCiVxcNLpMnWcJ3JiNEy5
/ip4/139.178.86.3/tcp/1347/p2p/12D3KooWGXLHjiz6pTRu7x2pkgTVCoxcCiVxcNLpMnWcJ3JiNEy5
/dns4/bootstrap-1-fra.fil-test.net/tcp/1347/p2p/12D3KooW9szZmKttS9A1FafH3Zc2pxKwwmvCWCGKkRP4KmbhhC4R
/ip4/136.144.49.131/tcp/1347/p2p/12D3KooW9szZmKttS9A1FafH3Zc2pxKwwmvCWCGKkRP4KmbhhC4R
+15
View File
@@ -0,0 +1,15 @@
package build
// DisableBuiltinAssets disables the resolution of go.rice boxes that store
// built-in assets, such as proof parameters, bootstrap peers, genesis blocks,
// etc.
//
// When this value is set to true, it is expected that the user will
// provide any such configurations through the Lotus API itself.
//
// This is useful when you're using Lotus as a library, such as to orchestrate
// test scenarios, or for other purposes where you don't need to use the
// defaults shipped with the binary.
//
// For this flag to be effective, it must be enabled _before_ instantiating Lotus.
var DisableBuiltinAssets = false
-8
View File
@@ -1,9 +1 @@
package build
const ForkBlizzardHeight = 6288
const ForkFrigidHeight = 7950
const ForkBootyBayHeight = 11000
const ForkMissingSnowballs = 34000
Binary file not shown.
+1 -1
View File
@@ -2,6 +2,6 @@ package build
import rice "github.com/GeertJohan/go.rice"
func ParametersJson() []byte {
func ParametersJSON() []byte {
return rice.MustFindBox("proof-params").MustBytes("parameters.json")
}
+34
View File
@@ -0,0 +1,34 @@
// +build debug 2k
package build
import (
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
)
func init() {
power.ConsensusMinerMinPower = big.NewInt(2048)
miner.SupportedProofTypes = map[abi.RegisteredSealProof]struct{}{
abi.RegisteredSealProof_StackedDrg2KiBV1: {},
}
verifreg.MinVerifiedDealSize = big.NewInt(256)
BuildType |= Build2k
}
const BlockDelaySecs = uint64(2)
const PropagationDelaySecs = uint64(3)
// SlashablePowerDelay is the number of epochs after ElectionPeriodStart, after
// which the miner is slashed
//
// Epochs
const SlashablePowerDelay = 20
// Epochs
const InteractivePoRepConfidence = 6
+2 -27
View File
@@ -4,32 +4,7 @@ package build
func init() {
InsecurePoStValidation = true
BuildType |= BuildDebug
}
var SectorSizes = []uint64{1024}
// Seconds
const BlockDelay = 6
const PropagationDelay = 3
// FallbackPoStDelay is the number of epochs the miner needs to wait after
// ElectionPeriodStart before starting fallback post computation
//
// Epochs
const FallbackPoStDelay = 10
// SlashablePowerDelay is the number of epochs after ElectionPeriodStart, after
// which the miner is slashed
//
// Epochs
const SlashablePowerDelay = 20
// Epochs
const InteractivePoRepDelay = 2
// Epochs
const InteractivePoRepConfidence = 6
// Bytes
var MinimumMinerPower uint64 = 2 << 10 // 2KiB
// NOTE: Also includes settings from params_2k
-110
View File
@@ -1,110 +0,0 @@
package build
import (
"math/big"
)
// Core network constants
// /////
// Storage
const UnixfsChunkSize uint64 = 1 << 20
const UnixfsLinksPerLevel = 1024
func SupportedSectorSize(ssize uint64) bool {
for _, ss := range SectorSizes {
if ssize == ss {
return true
}
}
return false
}
const SectorChallengeRatioDiv = 25
// /////
// Payments
// Epochs
const PaymentChannelClosingDelay = 6 * 60 * 60 / BlockDelay // six hours
// /////
// Consensus / Network
// Seconds
const AllowableClockDrift = 1
// Epochs
const ForkLengthThreshold = Finality
// Blocks (e)
const BlocksPerEpoch = 5
// Epochs
const Finality = 500
// constants for Weight calculation
// The ratio of weight contributed by short-term vs long-term factors in a given round
const WRatioNum = int64(1)
const WRatioDen = 2
// /////
// Proofs
// Epochs
const SealRandomnessLookback = Finality
// Epochs
const SealRandomnessLookbackLimit = SealRandomnessLookback + 2000
// Maximum lookback that randomness can be sourced from for a seal proof submission
const MaxSealLookback = SealRandomnessLookbackLimit + 2000
// /////
// Mining
// Epochs
const EcRandomnessLookback = 300
const PowerCollateralProportion = 5
const PerCapitaCollateralProportion = 1
const CollateralPrecision = 1000
// /////
// Devnet settings
const TotalFilecoin = 2_000_000_000
const MiningRewardTotal = 1_400_000_000
const InitialRewardStr = "153856861913558700202"
var InitialReward *big.Int
const FilecoinPrecision = 1_000_000_000_000_000_000
// TODO: Move other important consts here
func init() {
InitialReward = new(big.Int)
var ok bool
InitialReward, ok = InitialReward.
SetString(InitialRewardStr, 10)
if !ok {
panic("could not parse InitialRewardStr")
}
}
// Sync
const BadBlockCacheSize = 1 << 15
// assuming 4000 messages per round, this lets us not lose any messages across a
// 10 block reorg.
const BlsSignatureCacheSize = 40000
// ///////
// Limits
const BlockMessageLimit = 512
const MinerMaxSectors = 1 << 48
+38
View File
@@ -0,0 +1,38 @@
package build
import (
"sort"
"github.com/libp2p/go-libp2p-core/protocol"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
func DefaultSectorSize() abi.SectorSize {
szs := make([]abi.SectorSize, 0, len(miner.SupportedProofTypes))
for spt := range miner.SupportedProofTypes {
ss, err := spt.SectorSize()
if err != nil {
panic(err)
}
szs = append(szs, ss)
}
sort.Slice(szs, func(i, j int) bool {
return szs[i] < szs[j]
})
return szs[0]
}
// Core network constants
func BlocksTopic(netName dtypes.NetworkName) string { return "/fil/blocks/" + string(netName) }
func MessagesTopic(netName dtypes.NetworkName) string { return "/fil/msgs/" + string(netName) }
func DhtProtocolName(netName dtypes.NetworkName) protocol.ID {
return protocol.ID("/fil/kad/" + string(netName))
}
+103
View File
@@ -0,0 +1,103 @@
// +build !testground
package build
import (
"math/big"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
// /////
// Storage
const UnixfsChunkSize uint64 = 1 << 20
const UnixfsLinksPerLevel = 1024
// /////
// Consensus / Network
const AllowableClockDriftSecs = uint64(1)
// Epochs
const ForkLengthThreshold = Finality
// Blocks (e)
var BlocksPerEpoch = uint64(builtin.ExpectedLeadersPerEpoch)
// Epochs
const Finality = miner.ChainFinalityish
const MessageConfidence = uint64(5)
// constants for Weight calculation
// The ratio of weight contributed by short-term vs long-term factors in a given round
const WRatioNum = int64(1)
const WRatioDen = uint64(2)
// /////
// Proofs
// Epochs
const SealRandomnessLookback = Finality
// Epochs
const SealRandomnessLookbackLimit = SealRandomnessLookback + 2000 // TODO: Get from spec specs-actors
// Maximum lookback that randomness can be sourced from for a seal proof submission
const MaxSealLookback = SealRandomnessLookbackLimit + 2000 // TODO: Get from specs-actors
// /////
// Mining
// Epochs
const TicketRandomnessLookback = abi.ChainEpoch(1)
const WinningPoStSectorSetLookback = abi.ChainEpoch(10)
// /////
// Devnet settings
const TotalFilecoin = uint64(2_000_000_000)
const MiningRewardTotal = uint64(1_400_000_000)
const FilecoinPrecision = uint64(1_000_000_000_000_000_000)
var InitialRewardBalance *big.Int
// TODO: Move other important consts here
func init() {
InitialRewardBalance = big.NewInt(int64(MiningRewardTotal))
InitialRewardBalance = InitialRewardBalance.Mul(InitialRewardBalance, big.NewInt(int64(FilecoinPrecision)))
}
// Sync
const BadBlockCacheSize = 1 << 15
// assuming 4000 messages per round, this lets us not lose any messages across a
// 10 block reorg.
const BlsSignatureCacheSize = 40000
// Size of signature verification cache
// 32k keeps the cache around 10MB in size, max
const VerifSigCacheSize = 32000
// ///////
// Limits
// TODO: If this is gonna stay, it should move to specs-actors
const BlockMessageLimit = 512
const BlockGasLimit = 100_000_000_000
var DrandConfig = dtypes.DrandConfig{
Servers: []string{
"https://pl-eu.testnet.drand.sh",
"https://pl-us.testnet.drand.sh",
"https://pl-sin.testnet.drand.sh",
},
ChainInfoJSON: `{"public_key":"922a2e93828ff83345bae533f5172669a26c02dc76d6bf59c80892e12ab1455c229211886f35bb56af6d5bea981024df","period":25,"genesis_time":1590445175,"hash":"138a324aa6540f93d0dad002aa89454b1bec2b6e948682cde6bd4db40f4b7c9b"}`,
}
+73
View File
@@ -0,0 +1,73 @@
// +build testground
// This file makes hardcoded parameters (const) configurable as vars.
//
// Its purpose is to unlock various degrees of flexibility and parametrization
// when writing Testground plans for Lotus.
//
package build
import (
"math/big"
"github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
)
var (
UnixfsChunkSize = uint64(1 << 20)
UnixfsLinksPerLevel = 1024
BlocksPerEpoch = uint64(builtin.ExpectedLeadersPerEpoch)
BlockMessageLimit = 512
BlockGasLimit = int64(100_000_000_000)
BlockDelaySecs = uint64(builtin.EpochDurationSeconds)
PropagationDelaySecs = uint64(6)
AllowableClockDriftSecs = uint64(1)
Finality = miner.ChainFinalityish
ForkLengthThreshold = Finality
SlashablePowerDelay = 20
InteractivePoRepConfidence = 6
MessageConfidence uint64 = 5
WRatioNum = int64(1)
WRatioDen = uint64(2)
BadBlockCacheSize = 1 << 15
BlsSignatureCacheSize = 40000
VerifSigCacheSize = 32000
SealRandomnessLookback = Finality
SealRandomnessLookbackLimit = SealRandomnessLookback + 2000
MaxSealLookback = SealRandomnessLookbackLimit + 2000
TicketRandomnessLookback = abi.ChainEpoch(1)
WinningPoStSectorSetLookback = abi.ChainEpoch(10)
TotalFilecoin uint64 = 2_000_000_000
MiningRewardTotal uint64 = 1_400_000_000
FilecoinPrecision uint64 = 1_000_000_000_000_000_000
InitialRewardBalance = func() *big.Int {
v := big.NewInt(int64(MiningRewardTotal))
v = v.Mul(v, big.NewInt(int64(FilecoinPrecision)))
return v
}()
DrandConfig = dtypes.DrandConfig{
Servers: []string{
"https://pl-eu.testnet.drand.sh",
"https://pl-us.testnet.drand.sh",
"https://pl-sin.testnet.drand.sh",
},
ChainInfoJSON: `{"public_key":"922a2e93828ff83345bae533f5172669a26c02dc76d6bf59c80892e12ab1455c229211886f35bb56af6d5bea981024df","period":25,"genesis_time":1590445175,"hash":"138a324aa6540f93d0dad002aa89454b1bec2b6e948682cde6bd4db40f4b7c9b"}`,
}
)
+18 -26
View File
@@ -1,33 +1,25 @@
// +build !debug
// +build !2k
// +build !testground
package build
var SectorSizes = []uint64{
32 << 30,
import (
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
)
func init() {
power.ConsensusMinerMinPower = big.NewInt(1024 << 30)
miner.SupportedProofTypes = map[abi.RegisteredSealProof]struct{}{
abi.RegisteredSealProof_StackedDrg32GiBV1: {},
abi.RegisteredSealProof_StackedDrg64GiBV1: {},
}
}
// Seconds
const BlockDelay = 45
const BlockDelaySecs = uint64(builtin.EpochDurationSeconds)
const PropagationDelay = 6
// FallbackPoStDelay is the number of epochs the miner needs to wait after
// ElectionPeriodStart before starting fallback post computation
//
// Epochs
const FallbackPoStDelay = 30
// SlashablePowerDelay is the number of epochs after ElectionPeriodStart, after
// which the miner is slashed
//
// Epochs
const SlashablePowerDelay = 200
// Epochs
const InteractivePoRepDelay = 8
// Epochs
const InteractivePoRepConfidence = 6
// Bytes
var MinimumMinerPower uint64 = 512 << 30 // 512GB
const PropagationDelaySecs = uint64(6)
+137 -88
View File
@@ -1,103 +1,152 @@
{
"v20-proof-of-spacetime-election-5f585aca354eb68e411c8582ed0efd800792430e4e76d73468c4fc03f1a8d6d2.params": {
"cid": "QmX7tYeNPWae2fjZ3Am6GB9dmHvLqvoz8dKo3PR98VYxH9",
"digest": "39a9edec3355516674f0d12b926be493",
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": {
"cid": "QmeDRyxek34F1H6xJY6AkFdWvPsy5F6dKTrebV3ZtWT4ky",
"digest": "f5827f2d8801c62c831e0f972f6dc8bb",
"sector_size": 2048
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.vk": {
"cid": "QmUw1ZmG4BBbX19MsbH3zAEGKUc42iFJc5ZAyomDHeJTsA",
"digest": "398fecdb4b2de445125852bc3c080b35",
"sector_size": 2048
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0cfb4f178bbb71cf2ecfcd42accce558b27199ab4fb59cb78f2483fe21ef36d9.params": {
"cid": "QmUeNKp9YZpiAFm81RV5KuxH1FDGJx2DuwcbU2XNSZLLSv",
"digest": "2b6d2972ac9e862e8134d98fb695b0c5",
"sector_size": 536870912
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0cfb4f178bbb71cf2ecfcd42accce558b27199ab4fb59cb78f2483fe21ef36d9.vk": {
"cid": "QmQaQmTXX995Akd66ggtJY5bNx6Gkxk8P34JTdMMq8393G",
"digest": "3688c9eb256b7b17f411dad78d5ef74a",
"sector_size": 536870912
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-3ea05428c9d11689f23529cde32fd30aabd50f7d2c93657c1d3650bca3e8ea9e.params": {
"cid": "QmfEYTMSkwGJTumQx26iKXGNKiYh3mmAC4SkdybZpJCj5p",
"digest": "09bff16aed893349d94485cfae366a9c",
"sector_size": 2048
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-3ea05428c9d11689f23529cde32fd30aabd50f7d2c93657c1d3650bca3e8ea9e.vk": {
"cid": "QmP4ThPieSUJyRanjibWpT5R5cCMzMAU4j8Y7kBn7CSW1Q",
"digest": "142f2f7e8f1b1779290315cabfd2c803",
"sector_size": 2048
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-50c7368dea9593ed0989e70974d28024efa9d156d585b7eea1be22b2e753f331.params": {
"cid": "QmcAixrHsz29DgvtZiMc2kQjvPRvWxYUp36QYmRDZbmREm",
"digest": "8f987f64d434365562180b96ec12e299",
"sector_size": 8388608
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-50c7368dea9593ed0989e70974d28024efa9d156d585b7eea1be22b2e753f331.vk": {
"cid": "QmT4iFnbL6r4txS5PXsiV7NTzbhCxHy54PvdkJJGV2VFXb",
"digest": "94b6c24ac01924f4feeecedd16b5d77d",
"sector_size": 8388608
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-5294475db5237a2e83c3e52fd6c2b03859a1831d45ed08c4f35dbf9a803165a9.params": {
"cid": "QmbjFst6SFCK1KsTQrfwPdxf3VTNa1raed574tEZZ9PoyQ",
"digest": "2c245fe8179839dd6c6cdea207c67ae8",
"sector_size": 8388608
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-5294475db5237a2e83c3e52fd6c2b03859a1831d45ed08c4f35dbf9a803165a9.vk": {
"cid": "QmQJKmvZN1a5cQ1Nw6CDyXs3nuRPzvyU5NvCFMUL2BfcZC",
"digest": "56ae47bfda53bb8d22981ed8d8d27d72",
"sector_size": 8388608
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-7d739b8cf60f1b0709eeebee7730e297683552e4b69cab6984ec0285663c5781.params": {
"cid": "QmQCABxeTpdvXTyjDyk7nPBxkQzCh7MXfGztWnSXEPKMLW",
"digest": "7e6b2eb5ecbb11ac651ad66ebbb2075a",
"sector_size": 536870912
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-7d739b8cf60f1b0709eeebee7730e297683552e4b69cab6984ec0285663c5781.vk": {
"cid": "QmPBweyugh5Sx4umk8ULhgEGbjY8xmWLfU6M7EMpc8Mad6",
"digest": "94a8d9e25a9ab9674d339833664eba25",
"sector_size": 536870912
},
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-0377ded656c6f524f1618760bffe4e0a1c51d5a70c4509eedae8a27555733edc.params": {
"cid": "QmY5yax1E9KymBnCeHksE9Zi8NieZbmwcpoDGoabkeeb9h",
"digest": "c909ea9e3fe25ab9b391a64593afdbba",
"sector_size": 34359738368
},
"v20-proof-of-spacetime-election-5f585aca354eb68e411c8582ed0efd800792430e4e76d73468c4fc03f1a8d6d2.vk": {
"cid": "QmbNGx7pNbGiEr8ykoHxVXHW2LNSmGdsxKtj1onZCyguCX",
"digest": "0227ae7df4f2affe529ebafbbc7540ee",
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-0377ded656c6f524f1618760bffe4e0a1c51d5a70c4509eedae8a27555733edc.vk": {
"cid": "QmXnPo4yH5mwMguwrvqgRfduSttbmPrXtbBfbwU21wQWHt",
"digest": "caf900461e988bbf86dbcaca087b7864",
"sector_size": 34359738368
},
"v20-proof-of-spacetime-election-a4e18190d4b4657ba1b4d08a341871b2a6f398e327cb9951b28ab141fbdbf49d.params": {
"cid": "QmRGZsNp4mp1cZshcXqt3VMuWscAEsiMa2iepF4CsWWoiv",
"digest": "991041a354b12c280542741f58c7f2ca",
"sector_size": 1024
},
"v20-proof-of-spacetime-election-a4e18190d4b4657ba1b4d08a341871b2a6f398e327cb9951b28ab141fbdbf49d.vk": {
"cid": "QmWpmrhCGVcfqLyqp5oGAnhPmCE5hGTPaauHi25mpQwRSU",
"digest": "91fac550e1f9bccab213830bb0c85bd6",
"sector_size": 1024
},
"v20-proof-of-spacetime-election-a9eb6d90b896a282ec2d3a875c6143e3fcff778f0da1460709e051833651559b.params": {
"cid": "QmenSZXh1EsSyHiSRvA6wb8yaPhYBTjrKehJw96Px5HnN4",
"digest": "6322eacd2773163ddd51f9ca7d645fc4",
"sector_size": 1073741824
},
"v20-proof-of-spacetime-election-a9eb6d90b896a282ec2d3a875c6143e3fcff778f0da1460709e051833651559b.vk": {
"cid": "QmPvZoMKofw6eDhDg5ESJA2QAZP8HvM6qMQk7fw4pq9bQf",
"digest": "0df62745fceac922e3e70847cfc70b52",
"sector_size": 1073741824
},
"v20-proof-of-spacetime-election-bf872523641b1de33553db2a177df13e412d7b3b0103e6696ae0a1cf5d525259.params": {
"cid": "QmVibFqzkZoL8cwQmzj8njPokCQGCCx4pBcUH77bzgJgV9",
"digest": "de9d71e672f286706a1673bd57abdaac",
"sector_size": 16777216
},
"v20-proof-of-spacetime-election-bf872523641b1de33553db2a177df13e412d7b3b0103e6696ae0a1cf5d525259.vk": {
"cid": "QmZa5FX27XyiEXQQLQpHqtMJKLzrcY8wMuj3pxzmSimSyu",
"digest": "7f796d3a0f13499181e44b5eee0cc744",
"sector_size": 16777216
},
"v20-proof-of-spacetime-election-ffc3fb192364238b60977839d14e3154d4a98313e30d46694a12af54b6874975.params": {
"cid": "Qmbt2SWWAmMcYoY3DAiRDXA8fAuqdqRLWucJMSxYmzBCmN",
"digest": "151ae0ae183fc141e8c2bebc28e5cc10",
"sector_size": 268435456
},
"v20-proof-of-spacetime-election-ffc3fb192364238b60977839d14e3154d4a98313e30d46694a12af54b6874975.vk": {
"cid": "QmUxvPu4xdVmjMFihUKoYyEdXBqxsXkvmxRweU7KouWHji",
"digest": "95eb89588e9d1832aca044c3a13178af",
"sector_size": 268435456
},
"v20-stacked-proof-of-replication-117839dacd1ef31e5968a6fd13bcd6fa86638d85c40c9241a1d07c2a954eb89b.params": {
"cid": "QmQZe8eLo2xXbhSDxtyYZNqEjqjdcWGdADywECRvNEZQdX",
"digest": "fcd50e2e08a8560a6bb3418e883567ed",
"sector_size": 268435456
},
"v20-stacked-proof-of-replication-117839dacd1ef31e5968a6fd13bcd6fa86638d85c40c9241a1d07c2a954eb89b.vk": {
"cid": "Qme1hn6QT1covfoUFGDZkqoE1pMTax9FNW3nWWmTNqFe7y",
"digest": "872e244d86499fd659082e3bcf3f13e7",
"sector_size": 268435456
},
"v20-stacked-proof-of-replication-b46f3a1051afbb67f70aae7082da95def62eee943662f3e1bf69837fb08aaae4.params": {
"cid": "QmSfrPDC9jwY4MKrjzhCqDBBAG44wSDM8oE5NuDwWSh2xN",
"digest": "0a338b941c5f17946340de5fc95cab30",
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-559e581f022bb4e4ec6e719e563bf0e026ad6de42e56c18714a2c692b1b88d7e.params": {
"cid": "QmZtzzPWwmZEgR7MSMvXRbt9KVK8k4XZ5RLWHybHJW9SdE",
"digest": "a2844f0703f186d143a06146a04577d8",
"sector_size": 34359738368
},
"v20-stacked-proof-of-replication-b46f3a1051afbb67f70aae7082da95def62eee943662f3e1bf69837fb08aaae4.vk": {
"cid": "QmTDGynCmnbaZNBP3Bv3F3duC3ecKRubCKeMUiQQZYbGpF",
"digest": "c752e070a6b7aa8b79aa661a6b600b55",
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-559e581f022bb4e4ec6e719e563bf0e026ad6de42e56c18714a2c692b1b88d7e.vk": {
"cid": "QmWxEA7EdQCUJTzjNpxg5XTF45D2uVyYnN1QRUb5TRYU8M",
"digest": "2306247a1e616dbe07f01b88196c2044",
"sector_size": 34359738368
},
"v20-stacked-proof-of-replication-e71093863cadc71de61f38311ee45816633973bbf34849316b147f8d2e66f199.params": {
"cid": "QmXjSSnMUnc7EjQBYtTHhvLU3kXJTbUyhVhJRSTRehh186",
"digest": "efa407fd09202dffd15799a8518e73d3",
"sector_size": 1024
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-2627e4006b67f99cef990c0a47d5426cb7ab0a0ad58fc1061547bf2d28b09def.params": {
"cid": "QmP676KwuvyF9Y64uJnXvLtvD1xcuWQ6wD23RzYtQ6dd4f",
"digest": "215b1c667a4f46a1d0178338df568615",
"sector_size": 68719476736
},
"v20-stacked-proof-of-replication-e71093863cadc71de61f38311ee45816633973bbf34849316b147f8d2e66f199.vk": {
"cid": "QmYHW3zhQouDP4okFbXSsRMcZ8bokKGvzxqbv7ZrunPMiG",
"digest": "b2f09a0ccb62da28c890d5b881c8dcd2",
"sector_size": 1024
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-2627e4006b67f99cef990c0a47d5426cb7ab0a0ad58fc1061547bf2d28b09def.vk": {
"cid": "QmPvPwbJtcSGyqB1rQJhSF5yvFbX9ZBSsHVej5F8JUyHUJ",
"digest": "0c9c423b28b1455fcbc329a1045fd4dd",
"sector_size": 68719476736
},
"v20-stacked-proof-of-replication-e99a585174b6a45b254ba4780d72c89ad808c305c6d11711009ade4f39dba8e9.params": {
"cid": "QmUhyfNeLb32LfSkjsUwTFYLXQGMj6JQ8daff4DdVMt79q",
"digest": "b53c1916a63839ec345aa2224e9198b7",
"sector_size": 1073741824
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-b62098629d07946e9028127e70295ed996fe3ed25b0f9f88eb610a0ab4385a3c.params": {
"cid": "QmUxPQfvckzm1t6MFRdDZ1fDK5UJzAjK7pTZ97cwyachdr",
"digest": "965132f51ae445b0e6d32692b7561995",
"sector_size": 68719476736
},
"v20-stacked-proof-of-replication-e99a585174b6a45b254ba4780d72c89ad808c305c6d11711009ade4f39dba8e9.vk": {
"cid": "QmWReGfbuoozNErbskmFvqV4q36BY6F2WWb4cVFc3zoYkA",
"digest": "20d58a3fae7343481f8298a2dd493dd7",
"sector_size": 1073741824
"v27-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-b62098629d07946e9028127e70295ed996fe3ed25b0f9f88eb610a0ab4385a3c.vk": {
"cid": "QmTxq2EBnQWb5R8tS4MHdchj4vNfLYGoSXxwJFvs5xgW4K",
"digest": "fc8c3d26e0e56373ad96cb41520d55a6",
"sector_size": 68719476736
},
"v20-stacked-proof-of-replication-f571ee2386f4c65a68e802747f2d78691006fc81a67971c4d9641403fffece16.params": {
"cid": "QmSAHu14Pe8iav6BYCt9XkpHJ73XM7tcpY4d9JK9BST9HU",
"digest": "7698426202c7e07b26ef056d31485b3a",
"sector_size": 16777216
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-032d3138d22506ec0082ed72b2dcba18df18477904e35bafee82b3793b06832f.params": {
"cid": "QmRjgZHERgqGoRagR788Kh6ybi26csVYa8mqbqhmZm57Jx",
"digest": "cfc7b0897d1eee48c586f7beb89e67f7",
"sector_size": 2048
},
"v20-stacked-proof-of-replication-f571ee2386f4c65a68e802747f2d78691006fc81a67971c4d9641403fffece16.vk": {
"cid": "QmaKtFLShnhMGVn7P9UsHjkgqtqRFSwCStqqykBN7u8dax",
"digest": "834408e5c3fce6ec5d1bf64e64cee94e",
"sector_size": 16777216
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-032d3138d22506ec0082ed72b2dcba18df18477904e35bafee82b3793b06832f.vk": {
"cid": "QmNjvnvFP7KgovHUddULoB19fBHT81iz7NcUbzEHZUUPsm",
"digest": "fb59bd061c987eac7068008c44de346b",
"sector_size": 2048
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.params": {
"cid": "QmTpRPBA4dt8fgGpcVzi4L1KA1U2eBHCE8WVmS2GUygMvT",
"digest": "36d465915b0afbf96bd08e7915e00952",
"sector_size": 536870912
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.vk": {
"cid": "QmRzDyVfQCLsxspoVsed5bcQRsG6KiktngJfcNBL3TJPZe",
"digest": "99d16df0eb6a7e227a4f4570c4f6b6f1",
"sector_size": 536870912
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-ecd683648512ab1765faa2a5f14bab48f676e633467f0aa8aad4b55dcb0652bb.params": {
"cid": "QmV8ZjTSGzDUWmFvsq9NSyPBR7eDDUcvCPNgj2yE7HMAFu",
"digest": "34f3ddf1d1c9f41c0cd73b91e8b4bc27",
"sector_size": 8388608
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-ecd683648512ab1765faa2a5f14bab48f676e633467f0aa8aad4b55dcb0652bb.vk": {
"cid": "QmTa3VbjTiqJWU6r4WKayaQrUaaBsrpp5UDqYvPDd2C5hs",
"digest": "ec62d59651daa5631d3d1e9c782dd940",
"sector_size": 8388608
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-0-sha256_hasher-82a357d2f2ca81dc61bb45f4a762807aedee1b0a53fd6c4e77b46a01bfef7820.params": {
"cid": "Qmf8ngfArxrv9tFWDqBcNegdBMymvuakwyHKd1pbW3pbsb",
"digest": "a16d6f4c6424fb280236739f84b24f97",
"sector_size": 34359738368
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-0-sha256_hasher-82a357d2f2ca81dc61bb45f4a762807aedee1b0a53fd6c4e77b46a01bfef7820.vk": {
"cid": "QmfQgVFerArJ6Jupwyc9tKjLD9n1J9ajLHBdpY465tRM7M",
"digest": "7a139d82b8a02e35279d657e197f5c1f",
"sector_size": 34359738368
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-2-sha256_hasher-96f1b4a04c5c51e4759bbf224bbc2ef5a42c7100f16ec0637123f16a845ddfb2.params": {
"cid": "QmfDha8271nXJn14Aq3qQeghjMBWbs6HNSGa6VuzCVk4TW",
"digest": "5d3cd3f107a3bea8a96d1189efd2965c",
"sector_size": 68719476736
},
"v27-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-2-sha256_hasher-96f1b4a04c5c51e4759bbf224bbc2ef5a42c7100f16ec0637123f16a845ddfb2.vk": {
"cid": "QmRVtTtiFzHJTHurYzaCvetGAchux9cktixT4aGHthN6Zt",
"digest": "62c366405404e60f171e661492740b1c",
"sector_size": 68719476736
}
}
}
+26 -3
View File
@@ -3,11 +3,33 @@ package build
import "fmt"
var CurrentCommit string
var BuildType int
const (
BuildDefault = 0
Build2k = 0x1
BuildDebug = 0x3
)
func buildType() string {
switch BuildType {
case BuildDefault:
return ""
case BuildDebug:
return "+debug"
case Build2k:
return "+2k"
default:
return "+huh?"
}
}
// BuildVersion is the local build version, set by build system
const BuildVersion = "0.2.8"
const BuildVersion = "0.4.1"
var UserVersion = BuildVersion + CurrentCommit
func UserVersion() string {
return BuildVersion + buildType() + CurrentCommit
}
type Version uint32
@@ -31,8 +53,9 @@ func (ve Version) EqMajorMinor(v2 Version) bool {
}
// APIVersion is a semver version of the rpc api exposed
var APIVersion Version = newVer(0, 1, 6)
var APIVersion Version = newVer(0, 6, 0)
//nolint:varcheck,deadcode
const (
majorMask = 0xff0000
minorMask = 0xffff00
-48
View File
@@ -1,48 +0,0 @@
package actors
import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
)
type CronActor struct{}
type callTuple struct {
addr address.Address
method uint64
}
var CronActors = []callTuple{
{StoragePowerAddress, SPAMethods.CheckProofSubmissions},
}
type CronActorState struct{}
type cAMethods struct {
EpochTick uint64
}
var CAMethods = cAMethods{2}
func (ca CronActor) Exports() []interface{} {
return []interface{}{
1: nil,
2: ca.EpochTick,
}
}
func (ca CronActor) EpochTick(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
if vmctx.Message().From != CronAddress {
return nil, aerrors.New(1, "EpochTick is only callable as a part of tipset state computation")
}
for _, call := range CronActors {
_, err := vmctx.Send(call.addr, call.method, types.NewInt(0), nil)
if err != nil {
return nil, err // todo: this very bad?
}
}
return nil, nil
}
-239
View File
@@ -1,239 +0,0 @@
package actors
import (
"bytes"
"context"
"encoding/binary"
"fmt"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-hamt-ipld"
cbor "github.com/ipfs/go-ipld-cbor"
logging "github.com/ipfs/go-log/v2"
mh "github.com/multiformats/go-multihash"
)
var log = logging.Logger("actors")
var EmptyCBOR cid.Cid
const (
GasCreateActor = 100
)
var BuiltInActors map[cid.Cid]bool
func init() {
n, err := cbor.WrapObject(map[string]string{}, mh.SHA2_256, -1)
if err != nil {
panic(err) // ok
}
EmptyCBOR = n.Cid()
}
type InitActor struct{}
type InitActorState struct {
AddressMap cid.Cid
NextID uint64
}
type iAMethods struct {
Exec uint64
}
var IAMethods = iAMethods{2}
func (ia InitActor) Exports() []interface{} {
return []interface{}{
1: nil,
2: ia.Exec,
}
}
type ExecParams struct {
Code cid.Cid
Params []byte
}
func CreateExecParams(act cid.Cid, obj cbg.CBORMarshaler) ([]byte, aerrors.ActorError) {
encparams, err := SerializeParams(obj)
if err != nil {
return nil, aerrors.Wrap(err, "creating ExecParams")
}
return SerializeParams(&ExecParams{
Code: act,
Params: encparams,
})
}
func (ia InitActor) Exec(act *types.Actor, vmctx types.VMContext, p *ExecParams) ([]byte, aerrors.ActorError) {
beginState := vmctx.Storage().GetHead()
var self InitActorState
if err := vmctx.Storage().Get(beginState, &self); err != nil {
return nil, err
}
if err := vmctx.ChargeGas(GasCreateActor); err != nil {
return nil, aerrors.Wrap(err, "run out of gas")
}
// Make sure that only the actors defined in the spec can be launched.
if !IsBuiltinActor(p.Code) {
return nil, aerrors.New(1,
"cannot launch actor instance that is not a builtin actor")
}
// Ensure that singletons can be only launched once.
// TODO: do we want to enforce this? If so how should actors be marked as such?
if IsSingletonActor(p.Code) {
return nil, aerrors.New(1, "cannot launch another actor of this type")
}
// This generates a unique address for this actor that is stable across message
// reordering
creator := vmctx.Message().From
nonce := vmctx.Message().Nonce
addr, err := ComputeActorAddress(creator, nonce)
if err != nil {
return nil, err
}
// Set up the actor itself
actor := types.Actor{
Code: p.Code,
Balance: types.NewInt(0),
Head: EmptyCBOR,
Nonce: 0,
}
// The call to the actors constructor will set up the initial state
// from the given parameters, setting `actor.Head` to a new value when successful.
// TODO: can constructors fail?
//actor.Constructor(p.Params)
// Store the mapping of address to actor ID.
idAddr, nerr := self.AddActor(vmctx.Ipld(), addr)
if nerr != nil {
return nil, aerrors.Escalate(err, "adding new actor mapping")
}
// NOTE: This is a privileged call that only the init actor is allowed to make
// FIXME: Had to comment this because state is not in interface
state, err := vmctx.StateTree()
if err != nil {
return nil, err
}
if err := state.SetActor(idAddr, &actor); err != nil {
if xerrors.Is(err, types.ErrActorNotFound) {
return nil, aerrors.Absorb(err, 1, "SetActor, actor not found")
}
return nil, aerrors.Escalate(err, "inserting new actor into state tree")
}
// '1' is reserved for constructor methods
_, err = vmctx.Send(idAddr, 1, vmctx.Message().Value, p.Params)
if err != nil {
return nil, err
}
c, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(beginState, c); err != nil {
return nil, err
}
return idAddr.Bytes(), nil
}
func IsBuiltinActor(code cid.Cid) bool {
return BuiltInActors[code]
}
func IsSingletonActor(code cid.Cid) bool {
return code == StoragePowerCodeCid || code == StorageMarketCodeCid || code == InitCodeCid || code == CronCodeCid
}
func (ias *InitActorState) AddActor(cst *hamt.CborIpldStore, addr address.Address) (address.Address, error) {
nid := ias.NextID
amap, err := hamt.LoadNode(context.TODO(), cst, ias.AddressMap)
if err != nil {
return address.Undef, err
}
if err := amap.Set(context.TODO(), string(addr.Bytes()), nid); err != nil {
return address.Undef, err
}
if err := amap.Flush(context.TODO()); err != nil {
return address.Undef, err
}
ncid, err := cst.Put(context.TODO(), amap)
if err != nil {
return address.Undef, err
}
ias.AddressMap = ncid
ias.NextID++
return NewIDAddress(nid)
}
func (ias *InitActorState) Lookup(cst *hamt.CborIpldStore, addr address.Address) (address.Address, error) {
amap, err := hamt.LoadNode(context.TODO(), cst, ias.AddressMap)
if err != nil {
return address.Undef, xerrors.Errorf("ias lookup failed loading hamt node: %w", err)
}
var val interface{}
err = amap.Find(context.TODO(), string(addr.Bytes()), &val)
if err != nil {
return address.Undef, xerrors.Errorf("ias lookup failed to do find: %w", err)
}
ival, ok := val.(uint64)
if !ok {
return address.Undef, fmt.Errorf("invalid value in init actor state, expected uint64, got %T", val)
}
return address.NewIDAddress(ival)
}
type AccountActorState struct {
Address address.Address
}
func ComputeActorAddress(creator address.Address, nonce uint64) (address.Address, ActorError) {
buf := new(bytes.Buffer)
_, err := buf.Write(creator.Bytes())
if err != nil {
return address.Undef, aerrors.Escalate(err, "could not write address")
}
err = binary.Write(buf, binary.BigEndian, nonce)
if err != nil {
return address.Undef, aerrors.Escalate(err, "could not write nonce")
}
addr, err := address.NewActorAddress(buf.Bytes())
if err != nil {
return address.Undef, aerrors.Escalate(err, "could not create address")
}
return addr, nil
}
File diff suppressed because it is too large Load Diff
-903
View File
@@ -1,903 +0,0 @@
package actors
import (
"bytes"
"context"
"fmt"
amt2 "github.com/filecoin-project/go-amt-ipld/v2"
"github.com/filecoin-project/go-sectorbuilder"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
)
type StorageMinerActor2 struct{}
func (sma StorageMinerActor2) Exports() []interface{} {
return []interface{}{
1: sma.StorageMinerConstructor,
2: sma.PreCommitSector,
3: sma.ProveCommitSector,
4: sma.SubmitFallbackPoSt,
//5: sma.SlashStorageFault,
//6: sma.GetCurrentProvingSet,
//7: sma.ArbitrateDeal,
//8: sma.DePledge,
9: sma.GetOwner,
10: sma.GetWorkerAddr,
11: withUpdates(
update{0, sma.GetPower},
update{build.ForkMissingSnowballs, sma.GetPower2},
), // FORK
12: sma.GetPeerID,
13: sma.GetSectorSize,
14: sma.UpdatePeerID,
//15: sma.ChangeWorker,
16: sma.IsSlashed,
17: sma.CheckMiner,
18: sma.DeclareFaults,
19: sma.SlashConsensusFault,
20: sma.SubmitElectionPoSt,
}
}
func (sma StorageMinerActor2) StorageMinerConstructor(act *types.Actor, vmctx types.VMContext, params *StorageMinerConstructorParams) ([]byte, ActorError) {
minerInfo := &MinerInfo{
Owner: params.Owner,
Worker: params.Worker,
PeerID: params.PeerID,
SectorSize: params.SectorSize,
}
minfocid, err := vmctx.Storage().Put(minerInfo)
if err != nil {
return nil, err
}
var self StorageMinerActorState
sectors := amt2.NewAMT(types.WrapStorage(vmctx.Storage()))
scid, serr := sectors.Flush()
if serr != nil {
return nil, aerrors.HandleExternalError(serr, "initializing AMT")
}
self.Sectors = scid
self.ProvingSet = scid
self.Info = minfocid
storage := vmctx.Storage()
c, err := storage.Put(&self)
if err != nil {
return nil, err
}
if err := storage.Commit(EmptyCBOR, c); err != nil {
return nil, err
}
return nil, nil
}
func (sma StorageMinerActor2) PreCommitSector(act *types.Actor, vmctx types.VMContext, params *SectorPreCommitInfo) ([]byte, ActorError) {
ctx := vmctx.Context()
oldstate, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
if params.SealEpoch >= vmctx.BlockHeight()+build.SealRandomnessLookback {
return nil, aerrors.Newf(1, "sector commitment must be based off past randomness (%d >= %d)", params.SealEpoch, vmctx.BlockHeight()+build.SealRandomnessLookback)
}
if vmctx.BlockHeight()-params.SealEpoch+build.SealRandomnessLookback > build.SealRandomnessLookbackLimit {
return nil, aerrors.Newf(2, "sector commitment must be recent enough (was %d)", vmctx.BlockHeight()-params.SealEpoch+build.SealRandomnessLookback)
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
if vmctx.Message().From != mi.Worker {
return nil, aerrors.New(1, "not authorized to precommit sector for miner")
}
// make sure the miner isnt trying to submit a pre-existing sector
unique, err := SectorIsUnique(ctx, vmctx.Storage(), self.Sectors, params.SectorNumber)
if err != nil {
return nil, err
}
if !unique {
return nil, aerrors.New(3, "sector already committed!")
}
// Power of the miner after adding this sector
futurePower := types.BigAdd(self.Power, types.NewInt(mi.SectorSize))
collateralRequired := CollateralForPower(futurePower)
// TODO: grab from market?
if act.Balance.LessThan(collateralRequired) {
return nil, aerrors.New(4, "not enough collateral")
}
self.PreCommittedSectors[uintToStringKey(params.SectorNumber)] = &PreCommittedSector{
Info: *params,
ReceivedEpoch: vmctx.BlockHeight(),
}
if len(self.PreCommittedSectors) > 4096 {
return nil, aerrors.New(5, "too many precommitted sectors")
}
nstate, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, nstate); err != nil {
return nil, err
}
return nil, nil
}
func (sma StorageMinerActor2) ProveCommitSector(act *types.Actor, vmctx types.VMContext, params *SectorProveCommitInfo) ([]byte, ActorError) {
ctx := vmctx.Context()
oldstate, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
if vmctx.Message().From != mi.Worker {
return nil, aerrors.New(1, "not authorized to submit sector proof for miner")
}
us, ok := self.PreCommittedSectors[uintToStringKey(params.SectorID)]
if !ok {
return nil, aerrors.New(1, "no pre-commitment found for sector")
}
if us.ReceivedEpoch+build.InteractivePoRepDelay >= vmctx.BlockHeight() {
return nil, aerrors.New(2, "too early for proof submission")
}
delete(self.PreCommittedSectors, uintToStringKey(params.SectorID))
// TODO: ensure normalization to ID address
maddr := vmctx.Message().To
if vmctx.BlockHeight()-us.Info.SealEpoch > build.MaxSealLookback {
return nil, aerrors.Newf(5, "source randomness for sector SealEpoch too far in past (epoch %d)", us.Info.SealEpoch)
}
if vmctx.BlockHeight()-us.ReceivedEpoch > build.MaxSealLookback {
return nil, aerrors.Newf(6, "source randomness for sector ReceivedEpoch too far in past (epoch %d)", us.ReceivedEpoch)
}
ticket, err := vmctx.GetRandomness(us.Info.SealEpoch - build.SealRandomnessLookback)
if err != nil {
return nil, aerrors.Wrap(err, "failed to get ticket randomness")
}
seed, err := vmctx.GetRandomness(us.ReceivedEpoch + build.InteractivePoRepDelay)
if err != nil {
return nil, aerrors.Wrap(err, "failed to get randomness for prove sector commitment")
}
enc, err := SerializeParams(&ComputeDataCommitmentParams{
DealIDs: params.DealIDs,
SectorSize: mi.SectorSize,
})
if err != nil {
return nil, aerrors.Wrap(err, "failed to serialize ComputeDataCommitmentParams")
}
commD, err := vmctx.Send(StorageMarketAddress, SMAMethods.ComputeDataCommitment, types.NewInt(0), enc)
if err != nil {
return nil, aerrors.Wrapf(err, "failed to compute data commitment (sector %d, deals: %v)", params.SectorID, params.DealIDs)
}
if ok, err := vmctx.Sys().ValidatePoRep(ctx, maddr, mi.SectorSize, commD, us.Info.CommR, ticket, params.Proof, seed, params.SectorID); err != nil {
return nil, err
} else if !ok {
return nil, aerrors.Newf(2, "porep proof was invalid (t:%x; s:%x(%d); p:%s)", ticket, seed, us.ReceivedEpoch+build.InteractivePoRepDelay, truncateHexPrint(params.Proof))
}
// Note: There must exist a unique index in the miner's sector set for each
// sector ID. The `faults`, `recovered`, and `done` parameters of the
// SubmitPoSt method express indices into this sector set.
nssroot, err := AddToSectorSet2(ctx, types.WrapStorage(vmctx.Storage()), self.Sectors, params.SectorID, us.Info.CommR, commD)
if err != nil {
return nil, err
}
self.Sectors = nssroot
// if miner is not mining, start their proving period now
// Note: As written here, every miners first PoSt will only be over one sector.
// We could set up a 'grace period' for starting mining that would allow miners
// to submit several sectors for their first proving period. Alternatively, we
// could simply make the 'PreCommitSector' call take multiple sectors at a time.
//
// Note: Proving period is a function of sector size; small sectors take less
// time to prove than large sectors do. Sector size is selected when pledging.
pss, lerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet)
if lerr != nil {
return nil, aerrors.HandleExternalError(lerr, "could not load proving set node")
}
if pss.Count == 0 && !self.Active {
self.ProvingSet = self.Sectors
// TODO: probably want to wait until the miner is above a certain
// threshold before starting this
self.ElectionPeriodStart = vmctx.BlockHeight()
}
nstate, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, nstate); err != nil {
return nil, err
}
activateParams, err := SerializeParams(&ActivateStorageDealsParams{
Deals: params.DealIDs,
})
if err != nil {
return nil, err
}
_, err = vmctx.Send(StorageMarketAddress, SMAMethods.ActivateStorageDeals, types.NewInt(0), activateParams)
return nil, aerrors.Wrapf(err, "calling ActivateStorageDeals failed")
}
func (sma StorageMinerActor2) SubmitFallbackPoSt(act *types.Actor, vmctx types.VMContext, params *SubmitFallbackPoStParams) ([]byte, ActorError) {
oldstate, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
if vmctx.Message().From != mi.Worker {
return nil, aerrors.New(1, "not authorized to submit post for miner")
}
/*
// TODO: handle fees
msgVal := vmctx.Message().Value
if msgVal.LessThan(feesRequired) {
return nil, aerrors.New(2, "not enough funds to pay post submission fees")
}
if msgVal.GreaterThan(feesRequired) {
_, err := vmctx.Send(vmctx.Message().From, 0,
types.BigSub(msgVal, feesRequired), nil)
if err != nil {
return nil, aerrors.Wrap(err, "could not refund excess fees")
}
}
*/
var seed [sectorbuilder.CommLen]byte
{
randHeight := self.ElectionPeriodStart + build.FallbackPoStDelay
if vmctx.BlockHeight() <= randHeight {
// TODO: spec, retcode
return nil, aerrors.Newf(1, "submit fallback PoSt called too early (%d < %d)", vmctx.BlockHeight(), randHeight)
}
rand, err := vmctx.GetRandomness(randHeight)
if err != nil {
return nil, aerrors.Wrap(err, "could not get randomness for PoST")
}
if len(rand) < len(seed) {
return nil, aerrors.Escalate(fmt.Errorf("randomness too small (%d < %d)",
len(rand), len(seed)), "improper randomness")
}
copy(seed[:], rand)
}
pss, lerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet)
if lerr != nil {
return nil, aerrors.HandleExternalError(lerr, "could not load proving set node")
}
ss, lerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
if lerr != nil {
return nil, aerrors.HandleExternalError(lerr, "could not load proving set node")
}
faults, nerr := self.FaultSet.AllMap(2 * ss.Count)
if nerr != nil {
return nil, aerrors.Absorb(err, 5, "RLE+ invalid")
}
activeFaults := uint64(0)
var sectorInfos []types.PublicSectorInfo
if err := pss.ForEach(func(id uint64, v *cbg.Deferred) error {
if faults[id] {
activeFaults++
return nil
}
var comms [][]byte
if err := cbor.DecodeInto(v.Raw, &comms); err != nil {
return xerrors.New("could not decode comms")
}
si := types.PublicSectorInfo{
SectorID: id,
}
commR := comms[0]
if len(commR) != len(si.CommR) {
return xerrors.Errorf("commR length is wrong: %d", len(commR))
}
copy(si.CommR[:], commR)
sectorInfos = append(sectorInfos, si)
return nil
}); err != nil {
return nil, aerrors.Absorb(err, 3, "could not decode sectorset")
}
proverID := vmctx.Message().To // TODO: normalize to ID address
var candidates []types.Candidate
for _, t := range params.Candidates {
var partial [32]byte
copy(partial[:], t.Partial)
candidates = append(candidates, types.Candidate{
PartialTicket: partial,
SectorID: t.SectorID,
SectorChallengeIndex: t.ChallengeIndex,
})
}
if ok, lerr := vmctx.Sys().VerifyFallbackPost(vmctx.Context(), mi.SectorSize,
sectorInfos, seed[:], params.Proof, candidates, proverID, activeFaults); !ok || lerr != nil {
if lerr != nil {
// TODO: study PoST errors
return nil, aerrors.Absorb(lerr, 4, "PoST error")
}
if !ok {
return nil, aerrors.New(4, "PoST invalid")
}
}
// Post submission is successful!
if err := onSuccessfulPoSt2(self, vmctx, activeFaults); err != nil {
return nil, err
}
c, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, c); err != nil {
return nil, err
}
return nil, nil
}
func (sma StorageMinerActor2) GetPower(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
return self.Power.Bytes(), nil
}
func (sma StorageMinerActor2) GetPower2(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
if self.SlashedAt != 0 {
return types.NewInt(0).Bytes(), nil
}
return self.Power.Bytes(), nil
}
func SectorIsUnique2(ctx context.Context, s types.Storage, sroot cid.Cid, sid uint64) (bool, ActorError) {
found, _, _, err := GetFromSectorSet2(ctx, s, sroot, sid)
if err != nil {
return false, err
}
return !found, nil
}
func AddToSectorSet2(ctx context.Context, blks amt2.Blocks, ss cid.Cid, sectorID uint64, commR, commD []byte) (cid.Cid, ActorError) {
if sectorID >= build.MinerMaxSectors {
return cid.Undef, aerrors.Newf(25, "sector ID out of range: %d", sectorID)
}
ssr, err := amt2.LoadAMT(blks, ss)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "could not load sector set node")
}
// TODO: Spec says to use SealCommitment, and construct commD from deals each time,
// but that would make SubmitPoSt way, way more expensive
if err := ssr.Set(sectorID, [][]byte{commR, commD}); err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to set commitment in sector set")
}
ncid, err := ssr.Flush()
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to flush sector set")
}
return ncid, nil
}
func GetFromSectorSet2(ctx context.Context, s types.Storage, ss cid.Cid, sectorID uint64) (bool, []byte, []byte, ActorError) {
if sectorID >= build.MinerMaxSectors {
return false, nil, nil, aerrors.Newf(25, "sector ID out of range: %d", sectorID)
}
ssr, err := amt2.LoadAMT(types.WrapStorage(s), ss)
if err != nil {
return false, nil, nil, aerrors.HandleExternalError(err, "could not load sector set node")
}
var comms [][]byte
err = ssr.Get(sectorID, &comms)
if err != nil {
if _, ok := err.(*amt2.ErrNotFound); ok {
return false, nil, nil, nil
}
return false, nil, nil, aerrors.HandleExternalError(err, "failed to find sector in sector set")
}
if len(comms) != 2 {
return false, nil, nil, aerrors.Newf(20, "sector set entry should only have 2 elements")
}
return true, comms[0], comms[1], nil
}
func RemoveFromSectorSet2(ctx context.Context, s types.Storage, ss cid.Cid, ids []uint64) (cid.Cid, aerrors.ActorError) {
ssr, err := amt2.LoadAMT(types.WrapStorage(s), ss)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "could not load sector set node")
}
for _, id := range ids {
if err := ssr.Delete(id); err != nil {
log.Warnf("failed to delete sector %d from set: %s", id, err)
}
}
ncid, err := ssr.Flush()
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to flush sector set")
}
return ncid, nil
}
func (sma StorageMinerActor2) GetWorkerAddr(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
return mi.Worker.Bytes(), nil
}
func (sma StorageMinerActor2) GetOwner(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
return mi.Owner.Bytes(), nil
}
func (sma StorageMinerActor2) GetPeerID(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
return []byte(mi.PeerID), nil
}
func (sma StorageMinerActor2) UpdatePeerID(act *types.Actor, vmctx types.VMContext, params *UpdatePeerIDParams) ([]byte, ActorError) {
oldstate, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
if vmctx.Message().From != mi.Worker {
return nil, aerrors.New(2, "only the mine worker may update the peer ID")
}
mi.PeerID = params.PeerID
mic, err := vmctx.Storage().Put(mi)
if err != nil {
return nil, err
}
self.Info = mic
c, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, c); err != nil {
return nil, err
}
return nil, nil
}
func (sma StorageMinerActor2) GetSectorSize(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
mi, err := loadMinerInfo(vmctx, self)
if err != nil {
return nil, err
}
return types.NewInt(mi.SectorSize).Bytes(), nil
}
func (sma StorageMinerActor2) IsSlashed(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
_, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
return cbg.EncodeBool(self.SlashedAt != 0), nil
}
// TODO: better name
func (sma StorageMinerActor2) CheckMiner(act *types.Actor, vmctx types.VMContext, params *CheckMinerParams) ([]byte, ActorError) {
if vmctx.Message().From != StoragePowerAddress {
return nil, aerrors.New(2, "only the storage power actor can check miner")
}
oldstate, self, err := loadState(vmctx)
if err != nil {
return nil, err
}
if !isLate(vmctx.BlockHeight(), self) {
// Everything's fine
return nil, nil
}
if self.SlashedAt != 0 {
// Don't slash more than necessary
return nil, nil
}
if params.NetworkPower.Equals(self.Power) {
// Don't break the network when there's only one miner left
log.Warnf("can't slash miner %s for missed PoSt, no power would be left in the network", vmctx.Message().To)
return nil, nil
}
// Slash for being late
self.SlashedAt = vmctx.BlockHeight()
oldPower := self.Power
if vmctx.BlockHeight() > build.ForkMissingSnowballs {
self.Power = types.NewInt(0)
}
nstate, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, nstate); err != nil {
return nil, err
}
var out bytes.Buffer
if err := oldPower.MarshalCBOR(&out); err != nil {
return nil, aerrors.HandleExternalError(err, "marshaling return value")
}
return out.Bytes(), nil
}
func (sma StorageMinerActor2) DeclareFaults(act *types.Actor, vmctx types.VMContext, params *DeclareFaultsParams) ([]byte, ActorError) {
oldstate, self, aerr := loadState(vmctx)
if aerr != nil {
return nil, aerr
}
mi, aerr := loadMinerInfo(vmctx, self)
if aerr != nil {
return nil, aerr
}
if vmctx.Message().From != mi.Worker {
return nil, aerrors.New(1, "not authorized to declare faults for miner")
}
nfaults, err := types.MergeBitFields(params.Faults, self.FaultSet)
if err != nil {
return nil, aerrors.Absorb(err, 1, "failed to merge bitfields")
}
ss, nerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
if nerr != nil {
return nil, aerrors.HandleExternalError(nerr, "failed to load sector set")
}
cf, nerr := nfaults.Count()
if nerr != nil {
return nil, aerrors.Absorb(nerr, 2, "could not decode RLE+")
}
if cf > 2*ss.Count {
return nil, aerrors.Newf(3, "too many declared faults: %d > %d", cf, 2*ss.Count)
}
self.FaultSet = nfaults
self.LastFaultSubmission = vmctx.BlockHeight()
nstate, aerr := vmctx.Storage().Put(self)
if aerr != nil {
return nil, aerr
}
if err := vmctx.Storage().Commit(oldstate, nstate); err != nil {
return nil, err
}
return nil, nil
}
func (sma StorageMinerActor2) SlashConsensusFault(act *types.Actor, vmctx types.VMContext, params *MinerSlashConsensusFault) ([]byte, ActorError) {
if vmctx.Message().From != StoragePowerAddress {
return nil, aerrors.New(1, "SlashConsensusFault may only be called by the storage market actor")
}
slashedCollateral := params.SlashedCollateral
if slashedCollateral.LessThan(act.Balance) {
slashedCollateral = act.Balance
}
// Some of the slashed collateral should be paid to the slasher
// GROWTH_RATE determines how fast the slasher share of slashed collateral will increase as block elapses
// current GROWTH_RATE results in SLASHER_SHARE reaches 1 after 30 blocks
// TODO: define arithmetic precision and rounding for this operation
blockElapsed := vmctx.BlockHeight() - params.AtHeight
slasherShare := slasherShare(params.SlashedCollateral, blockElapsed)
burnPortion := types.BigSub(slashedCollateral, slasherShare)
_, err := vmctx.Send(vmctx.Message().From, 0, slasherShare, nil)
if err != nil {
return nil, aerrors.Wrap(err, "failed to pay slasher")
}
_, err = vmctx.Send(BurntFundsAddress, 0, burnPortion, nil)
if err != nil {
return nil, aerrors.Wrap(err, "failed to burn funds")
}
if vmctx.BlockHeight() > build.ForkMissingSnowballs {
oldstate, self, err := loadState(vmctx)
if err != nil {
return nil, aerrors.Wrap(err, "failed to load state for slashing")
}
self.Power = types.NewInt(0)
ncid, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, ncid); err != nil {
return nil, err
}
}
// TODO: this still allows the miner to commit sectors and submit posts,
// their users could potentially be unaffected, but the miner will never be
// able to mine a block again
// One potential issue: the miner will have to pay back the slashed
// collateral to continue submitting PoSts, which includes pledge
// collateral that they no longer really 'need'
return nil, nil
}
func (sma StorageMinerActor2) SubmitElectionPoSt(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, aerrors.ActorError) {
if vmctx.Message().From != NetworkAddress {
return nil, aerrors.Newf(1, "submit election post can only be called by the storage power actor")
}
oldstate, self, aerr := loadState(vmctx)
if aerr != nil {
return nil, aerr
}
if self.SlashedAt != 0 {
return nil, aerrors.New(1, "slashed miners can't perform election PoSt")
}
pss, nerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet)
if nerr != nil {
return nil, aerrors.HandleExternalError(nerr, "failed to load proving set")
}
ss, nerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
if nerr != nil {
return nil, aerrors.HandleExternalError(nerr, "failed to load proving set")
}
faults, nerr := self.FaultSet.AllMap(2 * ss.Count)
if nerr != nil {
return nil, aerrors.Absorb(nerr, 1, "invalid bitfield (fatal?)")
}
activeFaults := uint64(0)
for f := range faults {
if f > amt2.MaxIndex {
continue
}
var comms [][]byte
err := pss.Get(f, &comms)
if err != nil {
var notfound *amt2.ErrNotFound
if !xerrors.As(err, &notfound) {
return nil, aerrors.HandleExternalError(err, "failed to find sector in sector set")
}
continue
}
activeFaults++
}
if err := onSuccessfulPoSt2(self, vmctx, activeFaults); err != nil { // TODO
return nil, err
}
ncid, err := vmctx.Storage().Put(self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(oldstate, ncid); err != nil {
return nil, err
}
return nil, nil
}
func onSuccessfulPoSt2(self *StorageMinerActorState, vmctx types.VMContext, activeFaults uint64) aerrors.ActorError {
// FORK
if vmctx.BlockHeight() < build.ForkBootyBayHeight {
return onSuccessfulPoSt(self, vmctx, activeFaults)
}
var mi MinerInfo
if err := vmctx.Storage().Get(self.Info, &mi); err != nil {
return err
}
pss, nerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet)
if nerr != nil {
return aerrors.HandleExternalError(nerr, "failed to load proving set")
}
ss, nerr := amt2.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
if nerr != nil {
return aerrors.HandleExternalError(nerr, "failed to load sector set")
}
faults, nerr := self.FaultSet.All(2 * ss.Count)
if nerr != nil {
return aerrors.Absorb(nerr, 1, "invalid bitfield (fatal?)")
}
self.FaultSet = types.NewBitField()
oldPower := self.Power
newPower := types.BigMul(types.NewInt(pss.Count-activeFaults), types.NewInt(mi.SectorSize))
// If below the minimum size requirement, miners have zero power
if newPower.LessThan(types.NewInt(build.MinimumMinerPower)) {
newPower = types.NewInt(0)
}
self.Power = newPower
delta := types.BigSub(self.Power, oldPower)
if self.SlashedAt != 0 {
self.SlashedAt = 0
delta = self.Power
}
prevSlashingDeadline := self.ElectionPeriodStart + build.SlashablePowerDelay
if !self.Active && newPower.GreaterThan(types.NewInt(0)) {
self.Active = true
prevSlashingDeadline = 0
}
if !(oldPower.IsZero() && newPower.IsZero()) {
enc, err := SerializeParams(&UpdateStorageParams{
Delta: delta,
NextSlashDeadline: vmctx.BlockHeight() + build.SlashablePowerDelay,
PreviousSlashDeadline: prevSlashingDeadline,
})
if err != nil {
return err
}
_, err = vmctx.Send(StoragePowerAddress, SPAMethods.UpdateStorage, types.NewInt(0), enc)
if err != nil {
return aerrors.Wrap(err, "updating storage failed")
}
self.ElectionPeriodStart = vmctx.BlockHeight()
}
var ncid cid.Cid
var err aerrors.ActorError
ncid, err = RemoveFromSectorSet2(vmctx.Context(), vmctx.Storage(), self.Sectors, faults)
if err != nil {
return err
}
self.Sectors = ncid
self.ProvingSet = ncid
return nil
}
-281
View File
@@ -1,281 +0,0 @@
package actors_test
import (
"bytes"
"context"
"math"
"math/rand"
"testing"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-sectorbuilder"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/lib/rlepluslazy"
hamt "github.com/ipfs/go-hamt-ipld"
blockstore "github.com/ipfs/go-ipfs-blockstore"
"github.com/stretchr/testify/assert"
cbg "github.com/whyrusleeping/cbor-gen"
)
func TestMinerCommitSectors(t *testing.T) {
var worker, client address.Address
var minerAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&worker, 1000000),
HarnessAddr(&client, 1000000),
HarnessActor(&minerAddr, &worker, actors.StorageMinerCodeCid,
func() cbg.CBORMarshaler {
return &actors.StorageMinerConstructorParams{
Owner: worker,
Worker: worker,
SectorSize: 1024,
PeerID: "fakepeerid",
}
}),
}
h := NewHarness(t, opts...)
h.vm.Syscalls.ValidatePoRep = func(ctx context.Context, maddr address.Address, ssize uint64, commD, commR, ticket, proof, seed []byte, sectorID uint64) (bool, aerrors.ActorError) {
// all proofs are valid
return true, nil
}
ret, _ := h.SendFunds(t, worker, minerAddr, types.NewInt(100000))
ApplyOK(t, ret)
ret, _ = h.InvokeWithValue(t, client, actors.StorageMarketAddress, actors.SMAMethods.AddBalance, types.NewInt(2000), nil)
ApplyOK(t, ret)
addSectorToMiner(h, t, minerAddr, worker, client, 1)
assertSectorIDs(h, t, minerAddr, []uint64{1})
}
type badRuns struct {
done bool
}
func (br *badRuns) HasNext() bool {
return !br.done
}
func (br *badRuns) NextRun() (rlepluslazy.Run, error) {
br.done = true
return rlepluslazy.Run{true, math.MaxInt64}, nil
}
var _ rlepluslazy.RunIterator = (*badRuns)(nil)
func TestMinerSubmitBadFault(t *testing.T) {
oldSS, oldMin := build.SectorSizes, build.MinimumMinerPower
build.SectorSizes, build.MinimumMinerPower = []uint64{1024}, 1024
defer func() {
build.SectorSizes, build.MinimumMinerPower = oldSS, oldMin
}()
var worker, client address.Address
var minerAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&worker, 1000000),
HarnessAddr(&client, 1000000),
HarnessAddMiner(&minerAddr, &worker),
}
h := NewHarness(t, opts...)
h.vm.Syscalls.ValidatePoRep = func(ctx context.Context, maddr address.Address, ssize uint64, commD, commR, ticket, proof, seed []byte, sectorID uint64) (bool, aerrors.ActorError) {
// all proofs are valid
return true, nil
}
ret, _ := h.SendFunds(t, worker, minerAddr, types.NewInt(100000))
ApplyOK(t, ret)
ret, _ = h.InvokeWithValue(t, client, actors.StorageMarketAddress, actors.SMAMethods.AddBalance, types.NewInt(2000), nil)
ApplyOK(t, ret)
addSectorToMiner(h, t, minerAddr, worker, client, 1)
assertSectorIDs(h, t, minerAddr, []uint64{1})
bf := types.NewBitField()
bf.Set(6)
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.DeclareFaults, &actors.DeclareFaultsParams{bf})
ApplyOK(t, ret)
ret, _ = h.Invoke(t, actors.NetworkAddress, minerAddr, actors.MAMethods.SubmitElectionPoSt, nil)
ApplyOK(t, ret)
assertSectorIDs(h, t, minerAddr, []uint64{1})
st, err := getMinerState(context.TODO(), h.vm.StateTree(), h.bs, minerAddr)
assert.NoError(t, err)
expectedPower := st.Power
if types.BigCmp(expectedPower, types.NewInt(1024)) != 0 {
t.Errorf("Expected power of 1024, got %s", expectedPower)
}
badnum := uint64(0)
badnum--
bf = types.NewBitField()
bf.Set(badnum)
bf.Set(badnum - 1)
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.DeclareFaults, &actors.DeclareFaultsParams{bf})
ApplyOK(t, ret)
ret, _ = h.Invoke(t, actors.NetworkAddress, minerAddr, actors.MAMethods.SubmitElectionPoSt, nil)
ApplyOK(t, ret)
assertSectorIDs(h, t, minerAddr, []uint64{1})
st, err = getMinerState(context.TODO(), h.vm.StateTree(), h.bs, minerAddr)
assert.NoError(t, err)
currentPower := st.Power
if types.BigCmp(expectedPower, currentPower) != 0 {
t.Errorf("power changed and shouldn't have: %s != %s", expectedPower, currentPower)
}
bf.Set(badnum - 2)
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.DeclareFaults, &actors.DeclareFaultsParams{bf})
if ret.ExitCode != 3 {
t.Errorf("expected exit code 3, got %d: %+v", ret.ExitCode, ret.ActorErr)
}
assertSectorIDs(h, t, minerAddr, []uint64{1})
rle, err := rlepluslazy.EncodeRuns(&badRuns{}, []byte{})
assert.NoError(t, err)
bf, err = types.NewBitFieldFromBytes(rle)
assert.NoError(t, err)
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.DeclareFaults, &actors.DeclareFaultsParams{bf})
if ret.ExitCode != 3 {
t.Errorf("expected exit code 3, got %d: %+v", ret.ExitCode, ret.ActorErr)
}
assertSectorIDs(h, t, minerAddr, []uint64{1})
bf = types.NewBitField()
bf.Set(1)
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.DeclareFaults, &actors.DeclareFaultsParams{bf})
ApplyOK(t, ret)
ret, _ = h.Invoke(t, actors.NetworkAddress, minerAddr, actors.MAMethods.SubmitElectionPoSt, nil)
ApplyOK(t, ret)
assertSectorIDs(h, t, minerAddr, []uint64{})
}
func addSectorToMiner(h *Harness, t *testing.T, minerAddr, worker, client address.Address, sid uint64) {
t.Helper()
s := sectorbuilder.UserBytesForSectorSize(1024)
deal := h.makeFakeDeal(t, minerAddr, worker, client, s)
ret, _ := h.Invoke(t, worker, actors.StorageMarketAddress, actors.SMAMethods.PublishStorageDeals,
&actors.PublishStorageDealsParams{
Deals: []actors.StorageDealProposal{*deal},
})
ApplyOK(t, ret)
var dealIds actors.PublishStorageDealResponse
if err := dealIds.UnmarshalCBOR(bytes.NewReader(ret.Return)); err != nil {
t.Fatal(err)
}
dealid := dealIds.DealIDs[0]
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.PreCommitSector,
&actors.SectorPreCommitInfo{
SectorNumber: sid,
CommR: []byte("cats"),
SealEpoch: 10,
DealIDs: []uint64{dealid},
})
ApplyOK(t, ret)
h.BlockHeight += 100
ret, _ = h.Invoke(t, worker, minerAddr, actors.MAMethods.ProveCommitSector,
&actors.SectorProveCommitInfo{
Proof: []byte("prooofy"),
SectorID: sid,
DealIDs: []uint64{dealid}, // TODO: weird that i have to pass this again
})
ApplyOK(t, ret)
}
func assertSectorIDs(h *Harness, t *testing.T, maddr address.Address, ids []uint64) {
t.Helper()
sectors, err := getMinerSectorSet(context.TODO(), h.vm.StateTree(), h.bs, maddr)
if err != nil {
t.Fatal(err)
}
if len(sectors) != len(ids) {
t.Fatal("miner has wrong number of sectors in their sector set")
}
all := make(map[uint64]bool)
for _, s := range sectors {
all[s.SectorID] = true
}
for _, id := range ids {
if !all[id] {
t.Fatal("expected to find sector ID: ", id)
}
}
}
func getMinerState(ctx context.Context, st types.StateTree, bs blockstore.Blockstore, maddr address.Address) (*actors.StorageMinerActorState, error) {
mact, err := st.GetActor(maddr)
if err != nil {
return nil, err
}
cst := hamt.CSTFromBstore(bs)
var mstate actors.StorageMinerActorState
if err := cst.Get(ctx, mact.Head, &mstate); err != nil {
return nil, err
}
return &mstate, nil
}
func getMinerSectorSet(ctx context.Context, st types.StateTree, bs blockstore.Blockstore, maddr address.Address) ([]*api.ChainSectorInfo, error) {
mstate, err := getMinerState(ctx, st, bs, maddr)
if err != nil {
return nil, err
}
return stmgr.LoadSectorsFromSet(ctx, bs, mstate.Sectors)
}
func (h *Harness) makeFakeDeal(t *testing.T, miner, worker, client address.Address, size uint64) *actors.StorageDealProposal {
data := make([]byte, size)
rand.Read(data)
commP, err := sectorbuilder.GeneratePieceCommitment(bytes.NewReader(data), size)
if err != nil {
t.Fatal(err)
}
prop := actors.StorageDealProposal{
PieceRef: commP[:],
PieceSize: size,
Client: client,
Provider: miner,
ProposalExpiration: 10000,
Duration: 150,
StoragePricePerEpoch: types.NewInt(1),
StorageCollateral: types.NewInt(0),
}
if err := api.SignWith(context.TODO(), h.w.Sign, client, &prop); err != nil {
t.Fatal(err)
}
return &prop
}
-431
View File
@@ -1,431 +0,0 @@
package actors
import (
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
cbg "github.com/whyrusleeping/cbor-gen"
)
type MultiSigActor struct{}
type MultiSigActorState struct {
Signers []address.Address
Required uint64
NextTxID uint64
InitialBalance types.BigInt
StartingBlock uint64
UnlockDuration uint64
//TODO: make this map/sharray/whatever
Transactions []MTransaction
}
func (msas MultiSigActorState) canSpend(act *types.Actor, amnt types.BigInt, height uint64) bool {
if msas.UnlockDuration == 0 {
return true
}
offset := height - msas.StartingBlock
if offset > msas.UnlockDuration {
return true
}
minBalance := types.BigDiv(msas.InitialBalance, types.NewInt(msas.UnlockDuration))
minBalance = types.BigMul(minBalance, types.NewInt(offset))
return !minBalance.LessThan(types.BigSub(act.Balance, amnt))
}
func (msas MultiSigActorState) isSigner(addr address.Address) bool {
for _, s := range msas.Signers {
if s == addr {
return true
}
}
return false
}
func (msas MultiSigActorState) getTransaction(txid uint64) (*MTransaction, ActorError) {
if txid >= uint64(len(msas.Transactions)) {
return nil, aerrors.Newf(1, "could not get transaction (numbers of tx %d,want to get txid %d)", len(msas.Transactions), txid)
}
return &msas.Transactions[txid], nil
}
type MTransaction struct {
Created uint64 // NOT USED ??
TxID uint64
To address.Address
Value types.BigInt
Method uint64
Params []byte
Approved []address.Address
Complete bool
Canceled bool
RetCode uint64
}
func (tx MTransaction) Active() ActorError {
if tx.Complete {
return aerrors.New(2, "transaction already completed")
}
if tx.Canceled {
return aerrors.New(3, "transaction canceled")
}
return nil
}
type musigMethods struct {
MultiSigConstructor uint64
Propose uint64
Approve uint64
Cancel uint64
ClearCompleted uint64
AddSigner uint64
RemoveSigner uint64
SwapSigner uint64
ChangeRequirement uint64
}
var MultiSigMethods = musigMethods{1, 2, 3, 4, 5, 6, 7, 8, 9}
func (msa MultiSigActor) Exports() []interface{} {
return []interface{}{
1: msa.MultiSigConstructor,
2: msa.Propose,
3: msa.Approve,
4: msa.Cancel,
//5: msa.ClearCompleted,
6: msa.AddSigner,
7: msa.RemoveSigner,
8: msa.SwapSigner,
9: msa.ChangeRequirement,
}
}
type MultiSigConstructorParams struct {
Signers []address.Address
Required uint64
UnlockDuration uint64
}
func (MultiSigActor) MultiSigConstructor(act *types.Actor, vmctx types.VMContext,
params *MultiSigConstructorParams) ([]byte, ActorError) {
self := &MultiSigActorState{
Signers: params.Signers,
Required: params.Required,
}
if params.UnlockDuration != 0 {
self.InitialBalance = vmctx.Message().Value
self.UnlockDuration = params.UnlockDuration
self.StartingBlock = vmctx.BlockHeight()
}
head, err := vmctx.Storage().Put(self)
if err != nil {
return nil, aerrors.Wrap(err, "could not put new head")
}
err = vmctx.Storage().Commit(EmptyCBOR, head)
if err != nil {
return nil, aerrors.Wrap(err, "could not commit new head")
}
return nil, nil
}
type MultiSigProposeParams struct {
To address.Address
Value types.BigInt
Method uint64
Params []byte
}
func (MultiSigActor) load(vmctx types.VMContext) (cid.Cid, *MultiSigActorState, ActorError) {
var self MultiSigActorState
head := vmctx.Storage().GetHead()
err := vmctx.Storage().Get(head, &self)
if err != nil {
return cid.Undef, nil, aerrors.Wrap(err, "could not get self")
}
return head, &self, nil
}
func (msa MultiSigActor) loadAndVerify(vmctx types.VMContext) (cid.Cid, *MultiSigActorState, ActorError) {
head, self, err := msa.load(vmctx)
if err != nil {
return cid.Undef, nil, err
}
if !self.isSigner(vmctx.Message().From) {
return cid.Undef, nil, aerrors.New(1, "not authorized")
}
return head, self, nil
}
func (MultiSigActor) save(vmctx types.VMContext, oldHead cid.Cid, self *MultiSigActorState) ActorError {
newHead, err := vmctx.Storage().Put(self)
if err != nil {
return aerrors.Wrap(err, "could not put new head")
}
err = vmctx.Storage().Commit(oldHead, newHead)
if err != nil {
return aerrors.Wrap(err, "could not commit new head")
}
return nil
}
func (msa MultiSigActor) Propose(act *types.Actor, vmctx types.VMContext,
params *MultiSigProposeParams) ([]byte, ActorError) {
head, self, err := msa.loadAndVerify(vmctx)
if err != nil {
return nil, err
}
txid := self.NextTxID
self.NextTxID++
{
tx := MTransaction{
TxID: txid,
To: params.To,
Value: params.Value,
Method: params.Method,
Params: params.Params,
Approved: []address.Address{vmctx.Message().From},
}
self.Transactions = append(self.Transactions, tx)
}
tx, err := self.getTransaction(txid)
if err != nil {
return nil, err
}
if self.Required == 1 {
if !self.canSpend(act, tx.Value, vmctx.BlockHeight()) {
return nil, aerrors.New(100, "transaction amount exceeds available")
}
_, err := vmctx.Send(tx.To, tx.Method, tx.Value, tx.Params)
if aerrors.IsFatal(err) {
return nil, err
}
tx.RetCode = uint64(aerrors.RetCode(err))
tx.Complete = true
}
err = msa.save(vmctx, head, self)
if err != nil {
return nil, aerrors.Wrap(err, "saving state")
}
// REVIEW: On one hand, I like being very explicit about how we're doing the serialization
// on the other, maybe we shouldnt do direct calls to underlying serialization libs?
return cbg.CborEncodeMajorType(cbg.MajUnsignedInt, tx.TxID), nil
}
type MultiSigTxID struct {
TxID uint64
}
func (msa MultiSigActor) Approve(act *types.Actor, vmctx types.VMContext,
params *MultiSigTxID) ([]byte, ActorError) {
head, self, err := msa.loadAndVerify(vmctx)
if err != nil {
return nil, err
}
tx, err := self.getTransaction(params.TxID)
if err != nil {
return nil, err
}
if err := tx.Active(); err != nil {
return nil, aerrors.Wrap(err, "could not approve")
}
for _, signer := range tx.Approved {
if signer == vmctx.Message().From {
return nil, aerrors.New(4, "already signed this message")
}
}
tx.Approved = append(tx.Approved, vmctx.Message().From)
if uint64(len(tx.Approved)) >= self.Required {
if !self.canSpend(act, tx.Value, vmctx.BlockHeight()) {
return nil, aerrors.New(100, "transaction amount exceeds available")
}
_, err := vmctx.Send(tx.To, tx.Method, tx.Value, tx.Params)
if aerrors.IsFatal(err) {
return nil, err
}
tx.RetCode = uint64(aerrors.RetCode(err))
tx.Complete = true
}
return nil, msa.save(vmctx, head, self)
}
func (msa MultiSigActor) Cancel(act *types.Actor, vmctx types.VMContext,
params *MultiSigTxID) ([]byte, ActorError) {
head, self, err := msa.loadAndVerify(vmctx)
if err != nil {
return nil, err
}
tx, err := self.getTransaction(params.TxID)
if err != nil {
return nil, err
}
if err := tx.Active(); err != nil {
return nil, aerrors.Wrap(err, "could not cancel")
}
proposer := tx.Approved[0]
if proposer != vmctx.Message().From && self.isSigner(proposer) {
return nil, aerrors.New(4, "cannot cancel another signers transaction")
}
tx.Canceled = true
return nil, msa.save(vmctx, head, self)
}
type MultiSigAddSignerParam struct {
Signer address.Address
Increase bool
}
func (msa MultiSigActor) AddSigner(act *types.Actor, vmctx types.VMContext,
params *MultiSigAddSignerParam) ([]byte, ActorError) {
head, self, err := msa.load(vmctx)
if err != nil {
return nil, err
}
msg := vmctx.Message()
if msg.From != msg.To {
return nil, aerrors.New(4, "add signer must be called by wallet itself")
}
if self.isSigner(params.Signer) {
return nil, aerrors.New(5, "new address is already a signer")
}
self.Signers = append(self.Signers, params.Signer)
if params.Increase {
self.Required = self.Required + 1
}
return nil, msa.save(vmctx, head, self)
}
type MultiSigRemoveSignerParam struct {
Signer address.Address
Decrease bool
}
func (msa MultiSigActor) RemoveSigner(act *types.Actor, vmctx types.VMContext,
params *MultiSigRemoveSignerParam) ([]byte, ActorError) {
head, self, err := msa.load(vmctx)
if err != nil {
return nil, err
}
msg := vmctx.Message()
if msg.From != msg.To {
return nil, aerrors.New(4, "remove signer must be called by wallet itself")
}
if !self.isSigner(params.Signer) {
return nil, aerrors.New(5, "given address was not a signer")
}
newSigners := make([]address.Address, 0, len(self.Signers)-1)
for _, s := range self.Signers {
if s != params.Signer {
newSigners = append(newSigners, s)
}
}
if params.Decrease || uint64(len(self.Signers)-1) < self.Required {
self.Required = self.Required - 1
}
self.Signers = newSigners
return nil, msa.save(vmctx, head, self)
}
type MultiSigSwapSignerParams struct {
From address.Address
To address.Address
}
func (msa MultiSigActor) SwapSigner(act *types.Actor, vmctx types.VMContext,
params *MultiSigSwapSignerParams) ([]byte, ActorError) {
head, self, err := msa.load(vmctx)
if err != nil {
return nil, err
}
msg := vmctx.Message()
if msg.From != msg.To {
return nil, aerrors.New(4, "swap signer must be called by wallet itself")
}
if !self.isSigner(params.From) {
return nil, aerrors.New(5, "given old address was not a signer")
}
if self.isSigner(params.To) {
return nil, aerrors.New(6, "given new address was already a signer")
}
newSigners := make([]address.Address, 0, len(self.Signers))
for _, s := range self.Signers {
if s != params.From {
newSigners = append(newSigners, s)
}
}
newSigners = append(newSigners, params.To)
self.Signers = newSigners
return nil, msa.save(vmctx, head, self)
}
type MultiSigChangeReqParams struct {
Req uint64
}
func (msa MultiSigActor) ChangeRequirement(act *types.Actor, vmctx types.VMContext,
params *MultiSigChangeReqParams) ([]byte, ActorError) {
head, self, err := msa.load(vmctx)
if err != nil {
return nil, err
}
msg := vmctx.Message()
if msg.From != msg.To {
return nil, aerrors.New(4, "change requirement must be called by wallet itself")
}
if params.Req < 1 {
return nil, aerrors.New(5, "requirement must be at least 1")
}
if params.Req > uint64(len(self.Signers)) {
return nil, aerrors.New(6, "requirement must be at most the numbers of signers")
}
self.Required = params.Req
return nil, msa.save(vmctx, head, self)
}
-97
View File
@@ -1,97 +0,0 @@
package actors_test
import (
"testing"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/stretchr/testify/assert"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
)
func TestMultiSigCreate(t *testing.T) {
var creatorAddr, sig1Addr, sig2Addr, outsideAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&creatorAddr, 100000),
HarnessAddr(&sig1Addr, 100000),
HarnessAddr(&sig2Addr, 100000),
HarnessAddr(&outsideAddr, 100000),
}
h := NewHarness(t, opts...)
ret, _ := h.CreateActor(t, creatorAddr, actors.MultisigCodeCid,
&actors.MultiSigConstructorParams{
Signers: []address.Address{creatorAddr, sig1Addr, sig2Addr},
Required: 2,
})
ApplyOK(t, ret)
}
func ApplyOK(t testing.TB, ret *vm.ApplyRet) {
t.Helper()
if ret.ExitCode != 0 {
t.Fatalf("exit code should be 0, got %d, actorErr: %+v", ret.ExitCode, ret.ActorErr)
}
if ret.ActorErr != nil {
t.Fatalf("somehow got an error with exit == 0: %s", ret.ActorErr)
}
}
func TestMultiSigOps(t *testing.T) {
var creatorAddr, sig1Addr, sig2Addr, outsideAddr address.Address
var multSigAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&creatorAddr, 100000),
HarnessAddr(&sig1Addr, 100000),
HarnessAddr(&sig2Addr, 100000),
HarnessAddr(&outsideAddr, 100000),
HarnessActor(&multSigAddr, &creatorAddr, actors.MultisigCodeCid,
func() cbg.CBORMarshaler {
return &actors.MultiSigConstructorParams{
Signers: []address.Address{creatorAddr, sig1Addr, sig2Addr},
Required: 2,
}
}),
}
h := NewHarness(t, opts...)
{
const chargeVal = 2000
// Send funds into the multisig
ret, _ := h.SendFunds(t, creatorAddr, multSigAddr, types.NewInt(chargeVal))
ApplyOK(t, ret)
h.AssertBalanceChange(t, creatorAddr, -chargeVal)
h.AssertBalanceChange(t, multSigAddr, chargeVal)
}
{
// Transfer funds outside of multsig
const sendVal = 1000
ret, _ := h.Invoke(t, creatorAddr, multSigAddr, actors.MultiSigMethods.Propose,
&actors.MultiSigProposeParams{
To: outsideAddr,
Value: types.NewInt(sendVal),
})
ApplyOK(t, ret)
var txIDParam actors.MultiSigTxID
err := cbor.DecodeInto(ret.Return, &txIDParam.TxID)
assert.NoError(t, err, "decoding txid")
ret, _ = h.Invoke(t, outsideAddr, multSigAddr, actors.MultiSigMethods.Approve,
&txIDParam)
assert.Equal(t, uint8(1), ret.ExitCode, "outsideAddr should not approve")
h.AssertBalanceChange(t, multSigAddr, 0)
ret2, _ := h.Invoke(t, sig1Addr, multSigAddr, actors.MultiSigMethods.Approve,
&txIDParam)
ApplyOK(t, ret2)
h.AssertBalanceChange(t, outsideAddr, sendVal)
h.AssertBalanceChange(t, multSigAddr, -sendVal)
}
}
-302
View File
@@ -1,302 +0,0 @@
package actors
import (
"bytes"
"fmt"
"github.com/ipfs/go-cid"
"github.com/minio/blake2b-simd"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
)
type PaymentChannelActor struct{}
type PaymentInfo struct {
PayChActor address.Address
Payer address.Address
ChannelMessage *cid.Cid
Vouchers []*types.SignedVoucher
}
type LaneState struct {
Closed bool
Redeemed types.BigInt
Nonce uint64
}
type PaymentChannelActorState struct {
From address.Address
To address.Address
ToSend types.BigInt
ClosingAt uint64
MinCloseHeight uint64
// TODO: needs to be map[uint64]*laneState
// waiting on refmt#35 to be fixed
LaneStates map[string]*LaneState
}
func (pca PaymentChannelActor) Exports() []interface{} {
return []interface{}{
1: pca.Constructor,
2: pca.UpdateChannelState,
3: pca.Close,
4: pca.Collect,
5: pca.GetOwner,
6: pca.GetToSend,
}
}
type pcaMethods struct {
Constructor uint64
UpdateChannelState uint64
Close uint64
Collect uint64
GetOwner uint64
GetToSend uint64
}
var PCAMethods = pcaMethods{1, 2, 3, 4, 5, 6}
type PCAConstructorParams struct {
To address.Address
}
func (pca PaymentChannelActor) Constructor(act *types.Actor, vmctx types.VMContext, params *PCAConstructorParams) ([]byte, ActorError) {
var self PaymentChannelActorState
self.From = vmctx.Origin()
self.To = params.To
self.LaneStates = make(map[string]*LaneState)
storage := vmctx.Storage()
c, err := storage.Put(&self)
if err != nil {
return nil, err
}
if err := storage.Commit(EmptyCBOR, c); err != nil {
return nil, err
}
return nil, nil
}
type PCAUpdateChannelStateParams struct {
Sv types.SignedVoucher
Secret []byte
Proof []byte
}
func hash(b []byte) []byte {
s := blake2b.Sum256(b)
return s[:]
}
type PaymentVerifyParams struct {
Extra []byte
Proof []byte
}
func (pca PaymentChannelActor) UpdateChannelState(act *types.Actor, vmctx types.VMContext, params *PCAUpdateChannelStateParams) ([]byte, ActorError) {
var self PaymentChannelActorState
oldstate := vmctx.Storage().GetHead()
storage := vmctx.Storage()
if err := storage.Get(oldstate, &self); err != nil {
return nil, err
}
sv := params.Sv
vb, nerr := sv.SigningBytes()
if nerr != nil {
return nil, aerrors.Absorb(nerr, 1, "failed to serialize signedvoucher")
}
if err := vmctx.VerifySignature(sv.Signature, self.From, vb); err != nil {
return nil, err
}
if vmctx.BlockHeight() < sv.TimeLock {
return nil, aerrors.New(2, "cannot use this voucher yet!")
}
if len(sv.SecretPreimage) > 0 {
if !bytes.Equal(hash(params.Secret), sv.SecretPreimage) {
return nil, aerrors.New(3, "incorrect secret!")
}
}
if sv.Extra != nil {
encoded, err := SerializeParams(&PaymentVerifyParams{sv.Extra.Data, params.Proof})
if err != nil {
return nil, err
}
_, err = vmctx.Send(sv.Extra.Actor, sv.Extra.Method, types.NewInt(0), encoded)
if err != nil {
return nil, aerrors.Newf(4, "spend voucher verification failed: %s", err)
}
}
ls, ok := self.LaneStates[fmt.Sprint(sv.Lane)]
if !ok {
ls = new(LaneState)
ls.Redeemed = types.NewInt(0) // TODO: kinda annoying that this doesnt default to a usable value
self.LaneStates[fmt.Sprint(sv.Lane)] = ls
}
if ls.Closed {
return nil, aerrors.New(5, "cannot redeem a voucher on a closed lane")
}
if ls.Nonce > sv.Nonce {
return nil, aerrors.New(6, "voucher has an outdated nonce, cannot redeem")
}
mergeValue := types.NewInt(0)
for _, merge := range sv.Merges {
if merge.Lane == sv.Lane {
return nil, aerrors.New(7, "voucher cannot merge its own lane")
}
ols := self.LaneStates[fmt.Sprint(merge.Lane)]
if ols.Nonce >= merge.Nonce {
return nil, aerrors.New(8, "merge in voucher has outdated nonce, cannot redeem")
}
mergeValue = types.BigAdd(mergeValue, ols.Redeemed)
ols.Nonce = merge.Nonce
}
ls.Nonce = sv.Nonce
balanceDelta := types.BigSub(sv.Amount, types.BigAdd(mergeValue, ls.Redeemed))
ls.Redeemed = sv.Amount
newSendBalance := types.BigAdd(self.ToSend, balanceDelta)
if newSendBalance.LessThan(types.NewInt(0)) {
// TODO: is this impossible?
return nil, aerrors.New(9, "voucher would leave channel balance negative")
}
if newSendBalance.GreaterThan(act.Balance) {
return nil, aerrors.New(10, "not enough funds in channel to cover voucher")
}
log.Info("vals: ", newSendBalance, sv.Amount, balanceDelta, mergeValue, ls.Redeemed)
self.ToSend = newSendBalance
if sv.MinCloseHeight != 0 {
if self.ClosingAt != 0 && self.ClosingAt < sv.MinCloseHeight {
self.ClosingAt = sv.MinCloseHeight
}
if self.MinCloseHeight < sv.MinCloseHeight {
self.MinCloseHeight = sv.MinCloseHeight
}
}
ncid, err := storage.Put(&self)
if err != nil {
return nil, err
}
if err := storage.Commit(oldstate, ncid); err != nil {
return nil, err
}
return nil, nil
}
func (pca PaymentChannelActor) Close(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, aerrors.ActorError) {
var self PaymentChannelActorState
storage := vmctx.Storage()
oldstate := storage.GetHead()
if err := storage.Get(oldstate, &self); err != nil {
return nil, err
}
if vmctx.Message().From != self.From && vmctx.Message().From != self.To {
return nil, aerrors.New(1, "not authorized to close channel")
}
if self.ClosingAt != 0 {
return nil, aerrors.New(2, "channel already closing")
}
self.ClosingAt = vmctx.BlockHeight() + build.PaymentChannelClosingDelay
if self.ClosingAt < self.MinCloseHeight {
self.ClosingAt = self.MinCloseHeight
}
ncid, err := storage.Put(&self)
if err != nil {
return nil, err
}
if err := storage.Commit(oldstate, ncid); err != nil {
return nil, err
}
return nil, nil
}
func (pca PaymentChannelActor) Collect(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, aerrors.ActorError) {
var self PaymentChannelActorState
storage := vmctx.Storage()
oldstate := storage.GetHead()
if err := storage.Get(oldstate, &self); err != nil {
return nil, err
}
if self.ClosingAt == 0 {
return nil, aerrors.New(1, "payment channel not closing or closed")
}
if vmctx.BlockHeight() < self.ClosingAt {
return nil, aerrors.New(2, "payment channel not closed yet")
}
_, err := vmctx.Send(self.From, 0, types.BigSub(act.Balance, self.ToSend), nil)
if err != nil {
return nil, err
}
_, err = vmctx.Send(self.To, 0, self.ToSend, nil)
if err != nil {
return nil, err
}
self.ToSend = types.NewInt(0)
ncid, err := storage.Put(&self)
if err != nil {
return nil, err
}
if err := storage.Commit(oldstate, ncid); err != nil {
return nil, err
}
return nil, nil
}
func (pca PaymentChannelActor) GetOwner(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, aerrors.ActorError) {
var self PaymentChannelActorState
storage := vmctx.Storage()
if err := storage.Get(storage.GetHead(), &self); err != nil {
return nil, err
}
return self.From.Bytes(), nil
}
func (pca PaymentChannelActor) GetToSend(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, aerrors.ActorError) {
var self PaymentChannelActorState
storage := vmctx.Storage()
if err := storage.Get(storage.GetHead(), &self); err != nil {
return nil, err
}
return self.ToSend.Bytes(), nil
}
-93
View File
@@ -1,93 +0,0 @@
package actors_test
import (
"context"
"testing"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet"
)
func TestPaychCreate(t *testing.T) {
var creatorAddr, targetAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&creatorAddr, 100000),
HarnessAddr(&targetAddr, 100000),
}
h := NewHarness(t, opts...)
ret, _ := h.CreateActor(t, creatorAddr, actors.PaymentChannelCodeCid,
&actors.PCAConstructorParams{
To: targetAddr,
})
ApplyOK(t, ret)
}
func signVoucher(t *testing.T, w *wallet.Wallet, addr address.Address, sv *types.SignedVoucher) {
vb, err := sv.SigningBytes()
if err != nil {
t.Fatal(err)
}
sig, err := w.Sign(context.TODO(), addr, vb)
if err != nil {
t.Fatal(err)
}
sv.Signature = sig
}
func TestPaychUpdate(t *testing.T) {
var creatorAddr, targetAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&creatorAddr, 100000),
HarnessAddr(&targetAddr, 100000),
}
h := NewHarness(t, opts...)
ret, _ := h.CreateActor(t, creatorAddr, actors.PaymentChannelCodeCid,
&actors.PCAConstructorParams{
To: targetAddr,
})
ApplyOK(t, ret)
pch, err := address.NewFromBytes(ret.Return)
if err != nil {
t.Fatal(err)
}
ret, _ = h.SendFunds(t, creatorAddr, pch, types.NewInt(5000))
ApplyOK(t, ret)
sv := &types.SignedVoucher{
Amount: types.NewInt(100),
Nonce: 1,
}
signVoucher(t, h.w, creatorAddr, sv)
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.UpdateChannelState, &actors.PCAUpdateChannelStateParams{
Sv: *sv,
})
ApplyOK(t, ret)
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.GetToSend, nil)
ApplyOK(t, ret)
bi := types.BigFromBytes(ret.Return)
if bi.String() != "100" {
t.Fatal("toSend amount was wrong: ", bi.String())
}
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.Close, nil)
ApplyOK(t, ret)
// now we have to 'wait' for the chain to advance.
h.BlockHeight = 1000
ret, _ = h.Invoke(t, targetAddr, pch, actors.PCAMethods.Collect, nil)
ApplyOK(t, ret)
h.AssertBalanceChange(t, targetAddr, 100)
h.AssertBalanceChange(t, creatorAddr, -100)
}
-677
View File
@@ -1,677 +0,0 @@
package actors
import (
"bytes"
"context"
"sort"
"go.opencensus.io/trace"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-amt-ipld"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-hamt-ipld"
"github.com/filecoin-project/go-address"
cborutil "github.com/filecoin-project/go-cbor-util"
"github.com/filecoin-project/go-sectorbuilder"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/lib/sigs"
)
type StorageMarketActor struct{}
type smaMethods struct {
Constructor uint64
WithdrawBalance uint64
AddBalance uint64
CheckLockedBalance uint64
PublishStorageDeals uint64
HandleCronAction uint64
SettleExpiredDeals uint64
ProcessStorageDealsPayment uint64
SlashStorageDealCollateral uint64
GetLastExpirationFromDealIDs uint64
ActivateStorageDeals uint64
ComputeDataCommitment uint64
}
var SMAMethods = smaMethods{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
func (sma StorageMarketActor) Exports() []interface{} {
return []interface{}{
2: sma.WithdrawBalance,
3: sma.AddBalance,
// 4: sma.CheckLockedBalance,
5: sma.PublishStorageDeals,
// 6: sma.HandleCronAction,
// 7: sma.SettleExpiredDeals,
// 8: sma.ProcessStorageDealsPayment,
// 9: sma.SlashStorageDealCollateral,
// 10: sma.GetLastExpirationFromDealIDs,
11: sma.ActivateStorageDeals, // TODO: move under PublishStorageDeals after specs team approves
12: sma.ComputeDataCommitment,
}
}
type StorageParticipantBalance struct {
Locked types.BigInt
Available types.BigInt
}
type StorageMarketState struct {
Balances cid.Cid // hamt<addr, StorageParticipantBalance>
Deals cid.Cid // amt<StorageDeal>
NextDealID uint64 // TODO: spec
}
// TODO: Drop in favour of car storage
type SerializationMode = uint64
const (
SerializationUnixFSv0 = iota
// IPLD / car
)
type StorageDealProposal struct {
PieceRef []byte // cid bytes // TODO: spec says to use cid.Cid, probably not a good idea
PieceSize uint64
Client address.Address
Provider address.Address
ProposalExpiration uint64
Duration uint64 // TODO: spec
StoragePricePerEpoch types.BigInt
StorageCollateral types.BigInt
ProposerSignature *types.Signature
}
func (sdp *StorageDealProposal) TotalStoragePrice() types.BigInt {
return types.BigMul(sdp.StoragePricePerEpoch, types.NewInt(sdp.Duration))
}
type SignFunc = func(context.Context, []byte) (*types.Signature, error)
func (sdp *StorageDealProposal) Sign(ctx context.Context, sign SignFunc) error {
if sdp.ProposerSignature != nil {
return xerrors.New("signature already present in StorageDealProposal")
}
var buf bytes.Buffer
if err := sdp.MarshalCBOR(&buf); err != nil {
return err
}
sig, err := sign(ctx, buf.Bytes())
if err != nil {
return err
}
sdp.ProposerSignature = sig
return nil
}
func (sdp *StorageDealProposal) Cid() (cid.Cid, error) {
nd, err := cborutil.AsIpld(sdp)
if err != nil {
return cid.Undef, err
}
return nd.Cid(), nil
}
func (sdp *StorageDealProposal) Verify(worker address.Address) error {
if sdp.Client != worker || worker == address.Undef {
unsigned := *sdp
unsigned.ProposerSignature = nil
var buf bytes.Buffer
if err := unsigned.MarshalCBOR(&buf); err != nil {
return err
}
if err := sigs.Verify(sdp.ProposerSignature, sdp.Client, buf.Bytes()); err != nil {
return err
}
}
return nil
}
type OnChainDeal struct {
PieceRef []byte // cid bytes // TODO: spec says to use cid.Cid, probably not a good idea
PieceSize uint64
Client address.Address
Provider address.Address
ProposalExpiration uint64
Duration uint64 // TODO: spec
StoragePricePerEpoch types.BigInt
StorageCollateral types.BigInt
ActivationEpoch uint64 // 0 = inactive
}
type WithdrawBalanceParams struct {
Balance types.BigInt
}
func (sma StorageMarketActor) WithdrawBalance(act *types.Actor, vmctx types.VMContext, params *WithdrawBalanceParams) ([]byte, ActorError) {
// TODO: (spec) this should be 2-stage
var self StorageMarketState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
b, bnd, err := GetMarketBalances(vmctx.Context(), vmctx.Ipld(), self.Balances, vmctx.Message().From)
if err != nil {
return nil, aerrors.Wrap(err, "could not get balance")
}
balance := b[0]
if balance.Available.LessThan(params.Balance) {
return nil, aerrors.Newf(1, "can not withdraw more funds than available: %s > %s", params.Balance, b[0].Available)
}
balance.Available = types.BigSub(balance.Available, params.Balance)
_, err = vmctx.Send(vmctx.Message().From, 0, params.Balance, nil)
if err != nil {
return nil, aerrors.Wrap(err, "sending funds failed")
}
bcid, err := setMarketBalances(vmctx, bnd, map[address.Address]StorageParticipantBalance{
vmctx.Message().From: balance,
})
if err != nil {
return nil, err
}
self.Balances = bcid
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
return nil, vmctx.Storage().Commit(old, nroot)
}
func (sma StorageMarketActor) AddBalance(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
var self StorageMarketState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
b, bnd, err := GetMarketBalances(vmctx.Context(), vmctx.Ipld(), self.Balances, vmctx.Message().From)
if err != nil {
return nil, aerrors.Wrap(err, "could not get balance")
}
balance := b[0]
balance.Available = types.BigAdd(balance.Available, vmctx.Message().Value)
bcid, err := setMarketBalances(vmctx, bnd, map[address.Address]StorageParticipantBalance{
vmctx.Message().From: balance,
})
if err != nil {
return nil, err
}
self.Balances = bcid
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
return nil, vmctx.Storage().Commit(old, nroot)
}
func setMarketBalances(vmctx types.VMContext, nd *hamt.Node, set map[address.Address]StorageParticipantBalance) (cid.Cid, ActorError) {
keys := make([]address.Address, 0, len(set))
for k := range set {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return bytes.Compare(keys[i].Bytes(), keys[j].Bytes()) < 0
})
for _, addr := range keys {
balance := set[addr]
if err := nd.Set(vmctx.Context(), string(addr.Bytes()), &balance); err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "setting new balance")
}
}
if err := nd.Flush(vmctx.Context()); err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "flushing balance hamt")
}
c, err := vmctx.Ipld().Put(vmctx.Context(), nd)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to balances storage")
}
return c, nil
}
func GetMarketBalances(ctx context.Context, store *hamt.CborIpldStore, rcid cid.Cid, addrs ...address.Address) ([]StorageParticipantBalance, *hamt.Node, ActorError) {
ctx, span := trace.StartSpan(ctx, "GetMarketBalances")
defer span.End()
nd, err := hamt.LoadNode(ctx, store, rcid)
if err != nil {
return nil, nil, aerrors.HandleExternalError(err, "failed to load miner set")
}
out := make([]StorageParticipantBalance, len(addrs))
for i, a := range addrs {
var balance StorageParticipantBalance
err = nd.Find(ctx, string(a.Bytes()), &balance)
switch err {
case hamt.ErrNotFound:
out[i] = StorageParticipantBalance{
Locked: types.NewInt(0),
Available: types.NewInt(0),
}
case nil:
out[i] = balance
default:
return nil, nil, aerrors.HandleExternalError(err, "failed to do set lookup")
}
}
return out, nd, nil
}
/*
func (sma StorageMarketActor) CheckLockedBalance(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
}
*/
type PublishStorageDealsParams struct {
Deals []StorageDealProposal
}
type PublishStorageDealResponse struct {
DealIDs []uint64
}
func (sma StorageMarketActor) PublishStorageDeals(act *types.Actor, vmctx types.VMContext, params *PublishStorageDealsParams) ([]byte, ActorError) {
var self StorageMarketState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
deals, err := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Deals)
if err != nil {
return nil, aerrors.HandleExternalError(err, "loading deals amt")
}
// todo: handle duplicate deals
if len(params.Deals) == 0 {
return nil, aerrors.New(1, "no storage deals in params.Deals")
}
out := PublishStorageDealResponse{
DealIDs: make([]uint64, len(params.Deals)),
}
workerBytes, aerr := vmctx.Send(params.Deals[0].Provider, MAMethods.GetWorkerAddr, types.NewInt(0), nil)
if aerr != nil {
return nil, aerr
}
providerWorker, err := address.NewFromBytes(workerBytes)
if err != nil {
return nil, aerrors.HandleExternalError(err, "parsing provider worker address bytes")
}
// TODO: REVIEW: Do we want to check if provider exists in the power actor?
for i, deal := range params.Deals {
if err := self.validateDeal(vmctx, deal, providerWorker); err != nil {
return nil, err
}
err := deals.Set(self.NextDealID, &OnChainDeal{
PieceRef: deal.PieceRef,
PieceSize: deal.PieceSize,
Client: deal.Client,
Provider: deal.Provider,
ProposalExpiration: deal.ProposalExpiration,
Duration: deal.Duration,
StoragePricePerEpoch: deal.StoragePricePerEpoch,
StorageCollateral: deal.StorageCollateral,
ActivationEpoch: 0,
})
if err != nil {
return nil, aerrors.HandleExternalError(err, "setting deal in deal AMT")
}
out.DealIDs[i] = self.NextDealID
self.NextDealID++
}
dealsCid, err := deals.Flush()
if err != nil {
return nil, aerrors.HandleExternalError(err, "saving deals AMT")
}
self.Deals = dealsCid
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, aerrors.HandleExternalError(err, "storing state failed")
}
aerr = vmctx.Storage().Commit(old, nroot)
if aerr != nil {
return nil, aerr
}
var outBuf bytes.Buffer
if err := out.MarshalCBOR(&outBuf); err != nil {
return nil, aerrors.HandleExternalError(err, "serialising output")
}
return outBuf.Bytes(), nil
}
func (st *StorageMarketState) validateDeal(vmctx types.VMContext, deal StorageDealProposal, providerWorker address.Address) aerrors.ActorError {
ctx, span := trace.StartSpan(vmctx.Context(), "validateDeal")
defer span.End()
if vmctx.BlockHeight() > deal.ProposalExpiration {
return aerrors.New(1, "deal proposal already expired")
}
if vmctx.Message().From != providerWorker {
return aerrors.New(2, "Deals must be submitted by the miner worker")
}
if err := deal.Verify(providerWorker); err != nil {
return aerrors.Absorb(err, 3, "verifying proposer signature")
}
// TODO: do some caching (changes gas so needs to be in spec too)
b, bnd, aerr := GetMarketBalances(ctx, vmctx.Ipld(), st.Balances, deal.Client, providerWorker)
if aerr != nil {
return aerrors.Wrap(aerr, "getting client, and provider balances")
}
clientBalance := b[0]
providerBalance := b[1]
totalPrice := deal.TotalStoragePrice()
if clientBalance.Available.LessThan(totalPrice) {
return aerrors.Newf(5, "client doesn't have enough available funds to cover storage price; %d < %d", clientBalance.Available, totalPrice)
}
clientBalance = lockFunds(clientBalance, totalPrice)
// TODO: REVIEW: Not clear who pays for this
if providerBalance.Available.LessThan(deal.StorageCollateral) {
return aerrors.Newf(6, "provider doesn't have enough available funds to cover StorageCollateral; %d < %d", providerBalance.Available, deal.StorageCollateral)
}
providerBalance = lockFunds(providerBalance, deal.StorageCollateral)
// TODO: piece checks (e.g. size > sectorSize)?
bcid, aerr := setMarketBalances(vmctx, bnd, map[address.Address]StorageParticipantBalance{
deal.Client: clientBalance,
providerWorker: providerBalance,
})
if aerr != nil {
return aerr
}
st.Balances = bcid
return nil
}
type ActivateStorageDealsParams struct {
Deals []uint64
}
func (sma StorageMarketActor) ActivateStorageDeals(act *types.Actor, vmctx types.VMContext, params *ActivateStorageDealsParams) ([]byte, ActorError) {
var self StorageMarketState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
deals, err := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Deals)
if err != nil {
return nil, aerrors.HandleExternalError(err, "loading deals amt")
}
for _, deal := range params.Deals {
var dealInfo OnChainDeal
if err := deals.Get(deal, &dealInfo); err != nil {
if _, is := err.(*amt.ErrNotFound); is {
return nil, aerrors.New(3, "deal not found")
}
return nil, aerrors.HandleExternalError(err, "getting deal info failed")
}
if vmctx.Message().From != dealInfo.Provider {
return nil, aerrors.New(1, "ActivateStorageDeals can only be called by the deal provider")
}
if vmctx.BlockHeight() > dealInfo.ProposalExpiration {
return nil, aerrors.New(2, "deal cannot be activated: proposal expired")
}
if dealInfo.ActivationEpoch > 0 {
// this probably can't happen in practice
return nil, aerrors.New(3, "deal already active")
}
dealInfo.ActivationEpoch = vmctx.BlockHeight()
if err := deals.Set(deal, &dealInfo); err != nil {
return nil, aerrors.HandleExternalError(err, "setting deal info in AMT failed")
}
}
dealsCid, err := deals.Flush()
if err != nil {
return nil, aerrors.HandleExternalError(err, "saving deals AMT")
}
self.Deals = dealsCid
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, aerrors.HandleExternalError(err, "storing state failed")
}
aerr := vmctx.Storage().Commit(old, nroot)
if aerr != nil {
return nil, aerr
}
return nil, nil
}
type ProcessStorageDealsPaymentParams struct {
DealIDs []uint64
}
func (sma StorageMarketActor) ProcessStorageDealsPayment(act *types.Actor, vmctx types.VMContext, params *ProcessStorageDealsPaymentParams) ([]byte, ActorError) {
var self StorageMarketState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
deals, err := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Deals)
if err != nil {
return nil, aerrors.HandleExternalError(err, "loading deals amt")
}
// TODO: Would be nice if send could assert actor type
workerBytes, aerr := vmctx.Send(vmctx.Message().From, MAMethods.GetWorkerAddr, types.NewInt(0), nil)
if aerr != nil {
return nil, aerr
}
providerWorker, err := address.NewFromBytes(workerBytes)
if err != nil {
return nil, aerrors.HandleExternalError(err, "parsing provider worker address bytes")
}
for _, deal := range params.DealIDs {
var dealInfo OnChainDeal
if err := deals.Get(deal, &dealInfo); err != nil {
if _, is := err.(*amt.ErrNotFound); is {
return nil, aerrors.New(2, "deal not found")
}
return nil, aerrors.HandleExternalError(err, "getting deal info failed")
}
if dealInfo.Provider != vmctx.Message().From {
return nil, aerrors.New(3, "ProcessStorageDealsPayment can only be called by deal provider")
}
if vmctx.BlockHeight() < dealInfo.ActivationEpoch {
// TODO: This is probably fatal
return nil, aerrors.New(4, "ActivationEpoch lower than block height")
}
if vmctx.BlockHeight() > dealInfo.ActivationEpoch+dealInfo.Duration {
// Deal expired, miner should drop it
// TODO: process payment for the remainder of last proving period
return nil, nil
}
toPay := types.BigMul(dealInfo.StoragePricePerEpoch, types.NewInt(build.SlashablePowerDelay))
b, bnd, aerr := GetMarketBalances(vmctx.Context(), vmctx.Ipld(), self.Balances, dealInfo.Client, providerWorker)
if aerr != nil {
return nil, aerr
}
clientBal := b[0]
providerBal := b[1]
clientBal.Locked, providerBal.Available = transferFunds(clientBal.Locked, providerBal.Available, toPay)
// TODO: call set once
bcid, aerr := setMarketBalances(vmctx, bnd, map[address.Address]StorageParticipantBalance{
dealInfo.Client: clientBal,
providerWorker: providerBal,
})
if aerr != nil {
return nil, aerr
}
self.Balances = bcid
}
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, aerrors.HandleExternalError(err, "storing state failed")
}
aerr = vmctx.Storage().Commit(old, nroot)
if aerr != nil {
return nil, aerr
}
return nil, nil
}
func lockFunds(p StorageParticipantBalance, amt types.BigInt) StorageParticipantBalance {
p.Available, p.Locked = transferFunds(p.Available, p.Locked, amt)
return p
}
func transferFunds(from, to, amt types.BigInt) (types.BigInt, types.BigInt) {
// TODO: some asserts
return types.BigSub(from, amt), types.BigAdd(to, amt)
}
type ComputeDataCommitmentParams struct {
DealIDs []uint64
SectorSize uint64
}
func (sma StorageMarketActor) ComputeDataCommitment(act *types.Actor, vmctx types.VMContext, params *ComputeDataCommitmentParams) ([]byte, ActorError) {
var self StorageMarketState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
deals, err := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Deals)
if err != nil {
return nil, aerrors.HandleExternalError(err, "loading deals amt")
}
if len(params.DealIDs) == 0 {
return nil, aerrors.New(3, "no deal IDs")
}
var pieces []sectorbuilder.PublicPieceInfo
for _, deal := range params.DealIDs {
var dealInfo OnChainDeal
if err := deals.Get(deal, &dealInfo); err != nil {
if _, is := err.(*amt.ErrNotFound); is {
return nil, aerrors.New(4, "deal not found")
}
return nil, aerrors.HandleExternalError(err, "getting deal info failed")
}
if dealInfo.Provider != vmctx.Message().From {
return nil, aerrors.New(5, "referenced deal was not from caller")
}
var commP [32]byte
copy(commP[:], dealInfo.PieceRef)
pieces = append(pieces, sectorbuilder.PublicPieceInfo{
Size: dealInfo.PieceSize,
CommP: commP,
})
}
commd, err := sectorbuilder.GenerateDataCommitment(params.SectorSize, pieces)
if err != nil {
return nil, aerrors.Absorb(err, 6, "failed to generate data commitment from pieces")
}
return commd[:], nil
}
/*
func (sma StorageMarketActor) HandleCronAction(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
}
func (sma StorageMarketActor) SettleExpiredDeals(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
}
func (sma StorageMarketActor) SlashStorageDealCollateral(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
}
func (sma StorageMarketActor) GetLastExpirationFromDealIDs(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
}
*/
-858
View File
@@ -1,858 +0,0 @@
package actors
import (
"bytes"
"context"
"io"
"github.com/filecoin-project/go-amt-ipld"
cid "github.com/ipfs/go-cid"
hamt "github.com/ipfs/go-hamt-ipld"
"github.com/libp2p/go-libp2p-core/peer"
cbg "github.com/whyrusleeping/cbor-gen"
"go.opencensus.io/trace"
xerrors "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/lib/sigs"
)
type StoragePowerActor struct{}
type spaMethods struct {
Constructor uint64
CreateStorageMiner uint64
ArbitrateConsensusFault uint64
UpdateStorage uint64
GetTotalStorage uint64
PowerLookup uint64
IsValidMiner uint64
PledgeCollateralForSize uint64
CheckProofSubmissions uint64
}
var SPAMethods = spaMethods{1, 2, 3, 4, 5, 6, 7, 8, 9}
func (spa StoragePowerActor) Exports() []interface{} {
return []interface{}{
//1: spa.StoragePowerConstructor,
2: spa.CreateStorageMiner,
3: spa.ArbitrateConsensusFault,
4: spa.UpdateStorage,
5: spa.GetTotalStorage,
6: spa.PowerLookup,
7: spa.IsValidMiner,
8: spa.PledgeCollateralForSize,
9: spa.CheckProofSubmissions,
}
}
type StoragePowerState struct {
Miners cid.Cid
ProvingBuckets cid.Cid // amt[ProvingPeriodBucket]hamt[minerAddress]struct{}
MinerCount uint64
LastMinerCheck uint64
TotalStorage types.BigInt
}
type CreateStorageMinerParams struct {
Owner address.Address
Worker address.Address
SectorSize uint64
PeerID peer.ID
}
func (spa StoragePowerActor) CreateStorageMiner(act *types.Actor, vmctx types.VMContext, params *CreateStorageMinerParams) ([]byte, ActorError) {
if !build.SupportedSectorSize(params.SectorSize) {
return nil, aerrors.Newf(1, "Unsupported sector size: %d", params.SectorSize)
}
var self StoragePowerState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
reqColl, err := pledgeCollateralForSize(vmctx, types.NewInt(0), self.TotalStorage, self.MinerCount+1)
if err != nil {
return nil, err
}
if vmctx.Message().Value.LessThan(reqColl) {
return nil, aerrors.Newf(1, "not enough funds passed to cover required miner collateral (needed %s, got %s)", reqColl, vmctx.Message().Value)
}
// FORK
minerCid := StorageMinerCodeCid
if vmctx.BlockHeight() > build.ForkFrigidHeight {
minerCid = StorageMiner2CodeCid
}
encoded, err := CreateExecParams(minerCid, &StorageMinerConstructorParams{
Owner: params.Owner,
Worker: params.Worker,
SectorSize: params.SectorSize,
PeerID: params.PeerID,
})
if err != nil {
return nil, err
}
ret, err := vmctx.Send(InitAddress, IAMethods.Exec, vmctx.Message().Value, encoded)
if err != nil {
return nil, err
}
naddr, nerr := address.NewFromBytes(ret)
if nerr != nil {
return nil, aerrors.Absorb(nerr, 2, "could not read address of new actor")
}
ncid, err := MinerSetAdd(context.TODO(), vmctx, self.Miners, naddr)
if err != nil {
return nil, err
}
self.Miners = ncid
self.MinerCount++
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(old, nroot); err != nil {
return nil, err
}
return naddr.Bytes(), nil
}
type ArbitrateConsensusFaultParams struct {
Block1 *types.BlockHeader
Block2 *types.BlockHeader
}
func (spa StoragePowerActor) ArbitrateConsensusFault(act *types.Actor, vmctx types.VMContext, params *ArbitrateConsensusFaultParams) ([]byte, ActorError) {
if params == nil || params.Block1 == nil || params.Block2 == nil {
return nil, aerrors.New(1, "failed to parse params")
}
if params.Block1.Miner != params.Block2.Miner {
return nil, aerrors.New(2, "blocks must be from the same miner")
}
// FORK
if vmctx.BlockHeight() > build.ForkBlizzardHeight {
if params.Block1.Height <= build.ForkBlizzardHeight {
return nil, aerrors.New(10, "cannot slash miners with blocks from before blizzard")
}
if params.Block2.Height <= build.ForkBlizzardHeight {
return nil, aerrors.New(11, "cannot slash miners with blocks from before blizzard")
}
if params.Block1.Cid() == params.Block2.Cid() {
return nil, aerrors.New(3, "blocks must be different")
}
}
rval, err := vmctx.Send(params.Block1.Miner, MAMethods.GetWorkerAddr, types.NewInt(0), nil)
if err != nil {
return nil, aerrors.Wrap(err, "failed to get miner worker")
}
worker, oerr := address.NewFromBytes(rval)
if oerr != nil {
// REVIEW: should this be fatal? i can't think of a real situation that would get us here
return nil, aerrors.Absorb(oerr, 3, "response from 'GetWorkerAddr' was not a valid address")
}
if err := sigs.CheckBlockSignature(params.Block1, vmctx.Context(), worker); err != nil {
return nil, aerrors.Absorb(err, 4, "block1 did not have valid signature")
}
if err := sigs.CheckBlockSignature(params.Block2, vmctx.Context(), worker); err != nil {
return nil, aerrors.Absorb(err, 5, "block2 did not have valid signature")
}
// see the "Consensus Faults" section of the faults spec (faults.md)
// for details on these slashing conditions.
if !shouldSlash(params.Block1, params.Block2) {
return nil, aerrors.New(6, "blocks do not prove a slashable offense")
}
var self StoragePowerState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
if types.BigCmp(self.TotalStorage, types.NewInt(0)) == 0 {
return nil, aerrors.Fatal("invalid state, storage power actor has zero total storage")
}
miner := params.Block1.Miner
if has, err := MinerSetHas(vmctx, self.Miners, miner); err != nil {
return nil, aerrors.Wrapf(err, "failed to check miner in set")
} else if !has {
return nil, aerrors.New(7, "either already slashed or not a miner")
}
minerPower, err := powerLookup(context.TODO(), vmctx, &self, miner)
if err != nil {
return nil, err
}
slashedCollateral, err := pledgeCollateralForSize(vmctx, minerPower, self.TotalStorage, self.MinerCount)
if err != nil {
return nil, err
}
enc, err := SerializeParams(&MinerSlashConsensusFault{
Slasher: vmctx.Message().From,
AtHeight: params.Block1.Height,
SlashedCollateral: slashedCollateral,
})
if err != nil {
return nil, err
}
_, err = vmctx.Send(miner, MAMethods.SlashConsensusFault, types.NewInt(0), enc)
if err != nil {
return nil, err
}
// Remove the miner from the list of network miners
ncid, err := MinerSetRemove(context.TODO(), vmctx, self.Miners, miner)
if err != nil {
return nil, err
}
self.Miners = ncid
self.MinerCount--
self.TotalStorage = types.BigSub(self.TotalStorage, minerPower)
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(old, nroot); err != nil {
return nil, err
}
return nil, nil
}
func cidArrContains(a []cid.Cid, b cid.Cid) bool {
for _, c := range a {
if b == c {
return true
}
}
return false
}
func shouldSlash(block1, block2 *types.BlockHeader) bool {
// First slashing condition, blocks have the same ticket round
if block1.Height == block2.Height {
return true
}
/* Second slashing condition requires having access to the parent tipset blocks
// This might not always be available, needs some thought on the best way to deal with this
// Second slashing condition, miner ignored own block when mining
// Case A: block2 could have been in block1's parent set but is not
b1ParentHeight := block1.Height - len(block1.Tickets)
block1ParentTipSet := block1.Parents
if !cidArrContains(block1.Parents, block2.Cid()) &&
b1ParentHeight == block2.Height &&
block1ParentTipSet.ParentCids == block2.ParentCids {
return true
}
// Case B: block1 could have been in block2's parent set but is not
block2ParentTipSet := parentOf(block2)
if !block2Parent.contains(block1) &&
block2ParentTipSet.Height == block1.Height &&
block2ParentTipSet.ParentCids == block1.ParentCids {
return true
}
*/
return false
}
type UpdateStorageParams struct {
Delta types.BigInt
NextSlashDeadline uint64
PreviousSlashDeadline uint64
}
func (spa StoragePowerActor) UpdateStorage(act *types.Actor, vmctx types.VMContext, params *UpdateStorageParams) ([]byte, ActorError) {
var self StoragePowerState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
has, err := MinerSetHas(vmctx, self.Miners, vmctx.Message().From)
if err != nil {
return nil, err
}
if !has {
return nil, aerrors.New(1, "update storage must only be called by a miner actor")
}
self.TotalStorage = types.BigAdd(self.TotalStorage, params.Delta)
previousBucket := params.PreviousSlashDeadline % build.SlashablePowerDelay
nextBucket := params.NextSlashDeadline % build.SlashablePowerDelay
if previousBucket == nextBucket && params.PreviousSlashDeadline != 0 {
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(old, nroot); err != nil {
return nil, err
}
return nil, nil // Nothing to do
}
buckets, eerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingBuckets)
if eerr != nil {
return nil, aerrors.HandleExternalError(eerr, "loading proving buckets amt")
}
if params.PreviousSlashDeadline != 0 { // delete from previous bucket
err := deleteMinerFromBucket(vmctx, buckets, previousBucket)
if err != nil {
return nil, aerrors.Wrapf(err, "delete from bucket %d, next %d", previousBucket, nextBucket)
}
}
err = addMinerToBucket(vmctx, buckets, nextBucket)
if err != nil {
return nil, err
}
self.ProvingBuckets, eerr = buckets.Flush()
if eerr != nil {
return nil, aerrors.HandleExternalError(eerr, "flushing proving buckets")
}
nroot, err := vmctx.Storage().Put(&self)
if err != nil {
return nil, err
}
if err := vmctx.Storage().Commit(old, nroot); err != nil {
return nil, err
}
return nil, nil
}
func deleteMinerFromBucket(vmctx types.VMContext, buckets *amt.Root, previousBucket uint64) aerrors.ActorError {
var bucket cid.Cid
err := buckets.Get(previousBucket, &bucket)
switch err.(type) {
case *amt.ErrNotFound:
return aerrors.HandleExternalError(err, "proving bucket missing")
case nil: // noop
default:
return aerrors.HandleExternalError(err, "getting proving bucket")
}
bhamt, err := hamt.LoadNode(vmctx.Context(), vmctx.Ipld(), bucket)
if err != nil {
return aerrors.HandleExternalError(err, "failed to load proving bucket")
}
err = bhamt.Delete(vmctx.Context(), string(vmctx.Message().From.Bytes()))
if err != nil {
return aerrors.HandleExternalError(err, "deleting miner from proving bucket")
}
err = bhamt.Flush(vmctx.Context())
if err != nil {
return aerrors.HandleExternalError(err, "flushing previous proving bucket")
}
bucket, err = vmctx.Ipld().Put(vmctx.Context(), bhamt)
if err != nil {
return aerrors.HandleExternalError(err, "putting previous proving bucket hamt")
}
err = buckets.Set(previousBucket, bucket)
if err != nil {
return aerrors.HandleExternalError(err, "setting previous proving bucket cid in amt")
}
return nil
}
func addMinerToBucket(vmctx types.VMContext, buckets *amt.Root, nextBucket uint64) aerrors.ActorError {
var bhamt *hamt.Node
var bucket cid.Cid
err := buckets.Get(nextBucket, &bucket)
switch err.(type) {
case *amt.ErrNotFound:
bhamt = hamt.NewNode(vmctx.Ipld())
case nil:
bhamt, err = hamt.LoadNode(vmctx.Context(), vmctx.Ipld(), bucket)
if err != nil {
return aerrors.HandleExternalError(err, "failed to load proving bucket")
}
default:
return aerrors.HandleExternalError(err, "getting proving bucket")
}
err = bhamt.Set(vmctx.Context(), string(vmctx.Message().From.Bytes()), CborNull)
if err != nil {
return aerrors.HandleExternalError(err, "setting miner in proving bucket")
}
err = bhamt.Flush(vmctx.Context())
if err != nil {
return aerrors.HandleExternalError(err, "flushing previous proving bucket")
}
bucket, err = vmctx.Ipld().Put(vmctx.Context(), bhamt)
if err != nil {
return aerrors.HandleExternalError(err, "putting previous proving bucket hamt")
}
err = buckets.Set(nextBucket, bucket)
if err != nil {
return aerrors.HandleExternalError(err, "setting previous proving bucket cid in amt")
}
return nil
}
func (spa StoragePowerActor) GetTotalStorage(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) {
var self StoragePowerState
if err := vmctx.Storage().Get(vmctx.Storage().GetHead(), &self); err != nil {
return nil, err
}
return self.TotalStorage.Bytes(), nil
}
type PowerLookupParams struct {
Miner address.Address
}
func (spa StoragePowerActor) PowerLookup(act *types.Actor, vmctx types.VMContext, params *PowerLookupParams) ([]byte, ActorError) {
var self StoragePowerState
if err := vmctx.Storage().Get(vmctx.Storage().GetHead(), &self); err != nil {
return nil, aerrors.Wrap(err, "getting head")
}
pow, err := powerLookup(context.TODO(), vmctx, &self, params.Miner)
if err != nil {
return nil, err
}
return pow.Bytes(), nil
}
func powerLookup(ctx context.Context, vmctx types.VMContext, self *StoragePowerState, miner address.Address) (types.BigInt, ActorError) {
has, err := MinerSetHas(vmctx, self.Miners, miner)
if err != nil {
return types.EmptyInt, err
}
if !has {
// A miner could be registered with storage power actor, but removed for some reasons, e.g. consensus fault
return types.EmptyInt, aerrors.New(1, "miner not registered with storage power actor, or removed already")
}
// TODO: Use local amt
ret, err := vmctx.Send(miner, MAMethods.GetPower, types.NewInt(0), nil)
if err != nil {
return types.EmptyInt, aerrors.Wrap(err, "invoke Miner.GetPower")
}
return types.BigFromBytes(ret), nil
}
type IsValidMinerParam struct {
Addr address.Address
}
func (spa StoragePowerActor) IsValidMiner(act *types.Actor, vmctx types.VMContext, param *IsValidMinerParam) ([]byte, ActorError) {
var self StoragePowerState
if err := vmctx.Storage().Get(vmctx.Storage().GetHead(), &self); err != nil {
return nil, err
}
has, err := MinerSetHas(vmctx, self.Miners, param.Addr)
if err != nil {
return nil, err
}
if !has {
log.Warnf("Miner INVALID: not in set: %s", param.Addr)
return cbg.CborBoolFalse, nil
}
ret, err := vmctx.Send(param.Addr, MAMethods.IsSlashed, types.NewInt(0), nil)
if err != nil {
return nil, err
}
slashed := bytes.Equal(ret, cbg.CborBoolTrue)
if slashed {
log.Warnf("Miner INVALID: /SLASHED/ : %s", param.Addr)
}
return cbg.EncodeBool(!slashed), nil
}
type PledgeCollateralParams struct {
Size types.BigInt
}
func (spa StoragePowerActor) PledgeCollateralForSize(act *types.Actor, vmctx types.VMContext, param *PledgeCollateralParams) ([]byte, ActorError) {
var self StoragePowerState
if err := vmctx.Storage().Get(vmctx.Storage().GetHead(), &self); err != nil {
return nil, err
}
totalCollateral, err := pledgeCollateralForSize(vmctx, param.Size, self.TotalStorage, self.MinerCount)
if err != nil {
return nil, err
}
return totalCollateral.Bytes(), nil
}
func pledgeCollateralForSize(vmctx types.VMContext, size, totalStorage types.BigInt, minerCount uint64) (types.BigInt, aerrors.ActorError) {
netBalance, err := vmctx.GetBalance(NetworkAddress)
if err != nil {
return types.EmptyInt, err
}
// TODO: the spec says to also grab 'total vested filecoin' and include it as available
// If we don't factor that in, we effectively assume all of the locked up filecoin is 'available'
// the blocker on that right now is that its hard to tell how much filecoin is unlocked
availableFilecoin := types.BigSub(
types.BigMul(types.NewInt(build.TotalFilecoin), types.NewInt(build.FilecoinPrecision)),
netBalance,
)
totalPowerCollateral := types.BigDiv(
types.BigMul(
availableFilecoin,
types.NewInt(build.PowerCollateralProportion),
),
types.NewInt(build.CollateralPrecision),
)
totalPerCapitaCollateral := types.BigDiv(
types.BigMul(
availableFilecoin,
types.NewInt(build.PerCapitaCollateralProportion),
),
types.NewInt(build.CollateralPrecision),
)
// REVIEW: for bootstrapping purposes, we skip the power portion of the
// collateral if there is no collateral in the network yet
powerCollateral := types.NewInt(0)
if types.BigCmp(totalStorage, types.NewInt(0)) != 0 {
powerCollateral = types.BigDiv(
types.BigMul(
totalPowerCollateral,
size,
),
totalStorage,
)
}
perCapCollateral := types.BigDiv(
totalPerCapitaCollateral,
types.NewInt(minerCount),
)
return types.BigAdd(powerCollateral, perCapCollateral), nil
}
func (spa StoragePowerActor) CheckProofSubmissions(act *types.Actor, vmctx types.VMContext, param *struct{}) ([]byte, ActorError) {
if vmctx.Message().From != CronAddress {
return nil, aerrors.New(1, "CheckProofSubmissions is only callable from the cron actor")
}
var self StoragePowerState
old := vmctx.Storage().GetHead()
if err := vmctx.Storage().Get(old, &self); err != nil {
return nil, err
}
for i := self.LastMinerCheck; i < vmctx.BlockHeight(); i++ {
height := i + 1
err := checkProofSubmissionsAtH(vmctx, &self, height)
if err != nil {
return nil, err
}
}
self.LastMinerCheck = vmctx.BlockHeight()
nroot, aerr := vmctx.Storage().Put(&self)
if aerr != nil {
return nil, aerr
}
if err := vmctx.Storage().Commit(old, nroot); err != nil {
return nil, err
}
return nil, nil
}
func checkProofSubmissionsAtH(vmctx types.VMContext, self *StoragePowerState, height uint64) aerrors.ActorError {
bucketID := height % build.SlashablePowerDelay
buckets, eerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingBuckets)
if eerr != nil {
return aerrors.HandleExternalError(eerr, "loading proving buckets amt")
}
var bucket cid.Cid
err := buckets.Get(bucketID, &bucket)
switch err.(type) {
case *amt.ErrNotFound:
return nil // nothing to do
case nil:
default:
return aerrors.HandleExternalError(err, "getting proving bucket")
}
bhamt, err := hamt.LoadNode(vmctx.Context(), vmctx.Ipld(), bucket)
if err != nil {
return aerrors.HandleExternalError(err, "failed to load proving bucket")
}
forRemoval := make([]address.Address, 0)
err = bhamt.ForEach(vmctx.Context(), func(k string, val interface{}) error {
_, span := trace.StartSpan(vmctx.Context(), "StoragePowerActor.CheckProofSubmissions.loop")
defer span.End()
maddr, err := address.NewFromBytes([]byte(k))
if err != nil {
return aerrors.Escalate(err, "parsing miner address")
}
if vmctx.BlockHeight() > build.ForkMissingSnowballs {
has, aerr := MinerSetHas(vmctx, self.Miners, maddr)
if aerr != nil {
return aerr
}
if !has {
forRemoval = append(forRemoval, maddr)
}
}
span.AddAttributes(trace.StringAttribute("miner", maddr.String()))
params, err := SerializeParams(&CheckMinerParams{NetworkPower: self.TotalStorage})
if err != nil {
return err
}
ret, err := vmctx.Send(maddr, MAMethods.CheckMiner, types.NewInt(0), params)
if err != nil {
return err
}
if len(ret) == 0 {
return nil // miner is fine
}
var power types.BigInt
if err := power.UnmarshalCBOR(bytes.NewReader(ret)); err != nil {
return xerrors.Errorf("unmarshaling CheckMiner response (%x): %w", ret, err)
}
if power.GreaterThan(types.NewInt(0)) {
log.Warnf("slashing miner %s for missed PoSt (%s B, H: %d, Bucket: %d)", maddr, power, height, bucketID)
self.TotalStorage = types.BigSub(self.TotalStorage, power)
}
return nil
})
if err != nil {
return aerrors.HandleExternalError(err, "iterating miners in proving bucket")
}
if vmctx.BlockHeight() > build.ForkMissingSnowballs && len(forRemoval) > 0 {
nBucket, err := MinerSetRemove(vmctx.Context(), vmctx, bucket, forRemoval...)
if err != nil {
return aerrors.Wrap(err, "could not remove miners from set")
}
eerr := buckets.Set(bucketID, nBucket)
if err != nil {
return aerrors.HandleExternalError(eerr, "could not set the bucket")
}
ncid, eerr := buckets.Flush()
if err != nil {
return aerrors.HandleExternalError(eerr, "could not flush buckets")
}
self.ProvingBuckets = ncid
}
return nil
}
func MinerSetHas(vmctx types.VMContext, rcid cid.Cid, maddr address.Address) (bool, aerrors.ActorError) {
nd, err := hamt.LoadNode(vmctx.Context(), vmctx.Ipld(), rcid)
if err != nil {
return false, aerrors.HandleExternalError(err, "failed to load miner set")
}
err = nd.Find(vmctx.Context(), string(maddr.Bytes()), nil)
switch err {
case hamt.ErrNotFound:
return false, nil
case nil:
return true, nil
default:
return false, aerrors.HandleExternalError(err, "failed to do set lookup")
}
}
func MinerSetList(ctx context.Context, cst *hamt.CborIpldStore, rcid cid.Cid) ([]address.Address, error) {
nd, err := hamt.LoadNode(ctx, cst, rcid)
if err != nil {
return nil, xerrors.Errorf("failed to load miner set: %w", err)
}
var out []address.Address
err = nd.ForEach(ctx, func(k string, val interface{}) error {
addr, err := address.NewFromBytes([]byte(k))
if err != nil {
return err
}
out = append(out, addr)
return nil
})
if err != nil {
return nil, err
}
return out, nil
}
func MinerSetAdd(ctx context.Context, vmctx types.VMContext, rcid cid.Cid, maddr address.Address) (cid.Cid, aerrors.ActorError) {
nd, err := hamt.LoadNode(ctx, vmctx.Ipld(), rcid)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to load miner set")
}
mkey := string(maddr.Bytes())
err = nd.Find(ctx, mkey, nil)
if err == nil {
return cid.Undef, aerrors.New(20, "miner already in set")
}
if !xerrors.Is(err, hamt.ErrNotFound) {
return cid.Undef, aerrors.HandleExternalError(err, "failed to do miner set check")
}
if err := nd.Set(ctx, mkey, uint64(1)); err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "adding miner address to set failed")
}
if err := nd.Flush(ctx); err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to flush miner set")
}
c, err := vmctx.Ipld().Put(ctx, nd)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to persist miner set to storage")
}
return c, nil
}
func MinerSetRemove(ctx context.Context, vmctx types.VMContext, rcid cid.Cid, maddrs ...address.Address) (cid.Cid, aerrors.ActorError) {
nd, err := hamt.LoadNode(ctx, vmctx.Ipld(), rcid)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to load miner set")
}
for _, maddr := range maddrs {
mkey := string(maddr.Bytes())
switch nd.Delete(ctx, mkey) {
default:
return cid.Undef, aerrors.HandleExternalError(err, "failed to delete miner from set")
case hamt.ErrNotFound:
return cid.Undef, aerrors.New(1, "miner not found in set on delete")
case nil:
}
}
if err := nd.Flush(ctx); err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to flush miner set")
}
c, err := vmctx.Ipld().Put(ctx, nd)
if err != nil {
return cid.Undef, aerrors.HandleExternalError(err, "failed to persist miner set to storage")
}
return c, nil
}
type cbgNull struct{}
var CborNull = &cbgNull{}
func (cbgNull) MarshalCBOR(w io.Writer) error {
n, err := w.Write(cbg.CborNull)
if err != nil {
return err
}
if n != 1 {
return xerrors.New("expected to write 1 byte")
}
return nil
}
func (cbgNull) UnmarshalCBOR(r io.Reader) error {
b := [1]byte{}
n, err := r.Read(b[:])
if err != nil {
return err
}
if n != 1 {
return xerrors.New("expected 1 byte")
}
if !bytes.Equal(b[:], cbg.CborNull) {
return xerrors.New("expected cbor null")
}
return nil
}
-184
View File
@@ -1,184 +0,0 @@
package actors_test
import (
"context"
"fmt"
"testing"
"github.com/filecoin-project/lotus/build"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
. "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
"github.com/filecoin-project/lotus/chain/wallet"
_ "github.com/filecoin-project/lotus/lib/sigs/bls"
_ "github.com/filecoin-project/lotus/lib/sigs/secp"
cid "github.com/ipfs/go-cid"
hamt "github.com/ipfs/go-hamt-ipld"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
mh "github.com/multiformats/go-multihash"
"github.com/stretchr/testify/assert"
)
func TestStorageMarketCreateAndSlashMiner(t *testing.T) {
var ownerAddr, workerAddr address.Address
opts := []HarnessOpt{
HarnessAddr(&ownerAddr, 1000000),
HarnessAddr(&workerAddr, 100000),
}
h := NewHarness(t, opts...)
var minerAddr address.Address
{
// cheating the bootstrapping problem
cheatStorageMarketTotal(t, h.vm, h.cs.Blockstore())
ret, _ := h.InvokeWithValue(t, ownerAddr, StoragePowerAddress, SPAMethods.CreateStorageMiner,
types.NewInt(500000),
&CreateStorageMinerParams{
Owner: ownerAddr,
Worker: workerAddr,
SectorSize: build.SectorSizes[0],
PeerID: "fakepeerid",
})
ApplyOK(t, ret)
var err error
minerAddr, err = address.NewFromBytes(ret.Return)
assert.NoError(t, err)
}
{
ret, _ := h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.IsValidMiner,
&IsValidMinerParam{Addr: minerAddr})
ApplyOK(t, ret)
var output bool
err := cbor.DecodeInto(ret.Return, &output)
if err != nil {
t.Fatalf("error decoding: %+v", err)
}
if !output {
t.Fatalf("%s is miner but IsValidMiner call returned false", minerAddr)
}
}
{
ret, _ := h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.PowerLookup,
&PowerLookupParams{Miner: minerAddr})
ApplyOK(t, ret)
power := types.BigFromBytes(ret.Return)
if types.BigCmp(power, types.NewInt(0)) != 0 {
t.Fatalf("power should be zero, is: %s", power)
}
}
{
ret, _ := h.Invoke(t, ownerAddr, minerAddr, MAMethods.GetOwner, nil)
ApplyOK(t, ret)
oA, err := address.NewFromBytes(ret.Return)
assert.NoError(t, err)
assert.Equal(t, ownerAddr, oA, "return from GetOwner should be equal to the owner")
}
{
b1 := fakeBlock(t, minerAddr, 100)
b2 := fakeBlock(t, minerAddr, 101)
signBlock(t, h.w, workerAddr, b1)
signBlock(t, h.w, workerAddr, b2)
h.BlockHeight = build.ForkBlizzardHeight + 1
ret, _ := h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.ArbitrateConsensusFault,
&ArbitrateConsensusFaultParams{
Block1: b1,
Block2: b1,
})
assert.Equal(t, uint8(3), ret.ExitCode, "should have failed with exit 3")
ret, _ = h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.ArbitrateConsensusFault,
&ArbitrateConsensusFaultParams{
Block1: b1,
Block2: b2,
})
ApplyOK(t, ret)
}
{
ret, _ := h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.PowerLookup,
&PowerLookupParams{Miner: minerAddr})
assert.Equal(t, ret.ExitCode, byte(1))
}
{
ret, _ := h.Invoke(t, ownerAddr, StoragePowerAddress, SPAMethods.IsValidMiner, &IsValidMinerParam{minerAddr})
ApplyOK(t, ret)
assert.Equal(t, ret.Return, cbg.CborBoolFalse)
}
}
func cheatStorageMarketTotal(t *testing.T, vm *vm.VM, bs bstore.Blockstore) {
t.Helper()
sma, err := vm.StateTree().GetActor(StoragePowerAddress)
if err != nil {
t.Fatal(err)
}
cst := hamt.CSTFromBstore(bs)
var smastate StoragePowerState
if err := cst.Get(context.TODO(), sma.Head, &smastate); err != nil {
t.Fatal(err)
}
smastate.TotalStorage = types.NewInt(10000)
c, err := cst.Put(context.TODO(), &smastate)
if err != nil {
t.Fatal(err)
}
sma.Head = c
if err := vm.StateTree().SetActor(StoragePowerAddress, sma); err != nil {
t.Fatal(err)
}
}
func fakeBlock(t *testing.T, minerAddr address.Address, ts uint64) *types.BlockHeader {
c := fakeCid(t, 1)
return &types.BlockHeader{Height: 8000, Miner: minerAddr, Timestamp: ts, ParentStateRoot: c, Messages: c, ParentMessageReceipts: c, BLSAggregate: types.Signature{Type: types.KTBLS}}
}
func fakeCid(t *testing.T, s int) cid.Cid {
t.Helper()
c, err := cid.NewPrefixV1(cid.Raw, mh.IDENTITY).Sum([]byte(fmt.Sprintf("%d", s)))
if err != nil {
t.Fatal(err)
}
return c
}
func signBlock(t *testing.T, w *wallet.Wallet, worker address.Address, blk *types.BlockHeader) {
t.Helper()
sb, err := blk.SigningBytes()
if err != nil {
t.Fatal(err)
}
sig, err := w.Sign(context.TODO(), worker, sb)
if err != nil {
t.Fatal(err)
}
blk.BlockSig = sig
}
-65
View File
@@ -1,65 +0,0 @@
package actors
import (
"github.com/filecoin-project/go-address"
"github.com/ipfs/go-cid"
mh "github.com/multiformats/go-multihash"
)
var AccountCodeCid cid.Cid
var CronCodeCid cid.Cid
var StoragePowerCodeCid cid.Cid
var StorageMarketCodeCid cid.Cid
var StorageMinerCodeCid cid.Cid
var StorageMiner2CodeCid cid.Cid
var MultisigCodeCid cid.Cid
var InitCodeCid cid.Cid
var PaymentChannelCodeCid cid.Cid
var InitAddress = mustIDAddress(0)
var NetworkAddress = mustIDAddress(1)
var StoragePowerAddress = mustIDAddress(2)
var StorageMarketAddress = mustIDAddress(3) // TODO: missing from spec
var CronAddress = mustIDAddress(4)
var BurntFundsAddress = mustIDAddress(99)
func mustIDAddress(i uint64) address.Address {
a, err := address.NewIDAddress(i)
if err != nil {
panic(err) // ok
}
return a
}
func init() {
pref := cid.NewPrefixV1(cid.Raw, mh.IDENTITY)
mustSum := func(s string) cid.Cid {
c, err := pref.Sum([]byte(s))
if err != nil {
panic(err) // ok
}
return c
}
AccountCodeCid = mustSum("fil/1/account") // TODO: spec
CronCodeCid = mustSum("fil/1/cron")
StoragePowerCodeCid = mustSum("fil/1/power")
StorageMarketCodeCid = mustSum("fil/1/market")
StorageMinerCodeCid = mustSum("fil/1/miner")
StorageMiner2CodeCid = mustSum("fil/1/miner/2")
MultisigCodeCid = mustSum("fil/1/multisig")
InitCodeCid = mustSum("fil/1/init")
PaymentChannelCodeCid = mustSum("fil/1/paych")
BuiltInActors = map[cid.Cid]bool{
StorageMarketCodeCid: true,
StoragePowerCodeCid: true,
StorageMinerCodeCid: true,
StorageMiner2CodeCid: true,
AccountCodeCid: true,
InitCodeCid: true,
MultisigCodeCid: true,
PaymentChannelCodeCid: true,
}
}
-158
View File
@@ -1,158 +0,0 @@
package actors_test
import (
"context"
"encoding/binary"
"fmt"
"testing"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/go-address"
. "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/gen"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
dstore "github.com/ipfs/go-datastore"
bstore "github.com/ipfs/go-ipfs-blockstore"
)
func blsaddr(n uint64) address.Address {
buf := make([]byte, 48)
binary.PutUvarint(buf, n)
addr, err := address.NewBLSAddress(buf)
if err != nil {
panic(err) // ok
}
return addr
}
func setupVMTestEnv(t *testing.T) (*vm.VM, []address.Address, bstore.Blockstore) {
bs := bstore.NewBlockstore(dstore.NewMapDatastore())
from := blsaddr(0)
maddr := blsaddr(1)
actors := map[address.Address]types.BigInt{
from: types.NewInt(1000000),
maddr: types.NewInt(0),
}
st, err := gen.MakeInitialStateTree(bs, actors)
if err != nil {
t.Fatal(err)
}
stateroot, err := st.Flush(context.TODO())
if err != nil {
t.Fatal(err)
}
cs := store.NewChainStore(bs, nil, nil)
// TODO: should probabaly mock out the randomness bit, nil works for now
vm, err := vm.NewVM(stateroot, 1, nil, maddr, cs.Blockstore(), cs.VMSys())
if err != nil {
t.Fatal(err)
}
return vm, []address.Address{from, maddr}, bs
}
func TestVMInvokeMethod(t *testing.T) {
vm, addrs, _ := setupVMTestEnv(t)
from := addrs[0]
var err error
cenc, err := SerializeParams(&StorageMinerConstructorParams{Owner: from, Worker: from})
if err != nil {
t.Fatal(err)
}
execparams := &ExecParams{
Code: StorageMinerCodeCid,
Params: cenc,
}
enc, err := SerializeParams(execparams)
if err != nil {
t.Fatal(err)
}
msg := &types.Message{
To: InitAddress,
From: from,
Method: IAMethods.Exec,
Params: enc,
GasPrice: types.NewInt(1),
GasLimit: types.NewInt(10000),
Value: types.NewInt(0),
}
ret, err := vm.ApplyMessage(context.TODO(), msg)
if err != nil {
t.Fatal(err)
}
if ret.ExitCode != 0 {
t.Fatal("invocation failed")
}
outaddr, err := address.NewFromBytes(ret.Return)
if err != nil {
t.Fatal(err)
}
if outaddr.String() != "t0102" {
t.Fatal("hold up")
}
}
func TestStorageMarketActorCreateMiner(t *testing.T) {
vm, addrs, bs := setupVMTestEnv(t)
from := addrs[0]
maddr := addrs[1]
cheatStorageMarketTotal(t, vm, bs)
params := &StorageMinerConstructorParams{
Owner: maddr,
Worker: maddr,
SectorSize: build.SectorSizes[0],
PeerID: "fakepeerid",
}
var err error
enc, err := SerializeParams(params)
if err != nil {
t.Fatal(err)
}
msg := &types.Message{
To: StoragePowerAddress,
From: from,
Method: SPAMethods.CreateStorageMiner,
Params: enc,
GasPrice: types.NewInt(1),
GasLimit: types.NewInt(10000),
Value: types.NewInt(50000),
}
ret, err := vm.ApplyMessage(context.TODO(), msg)
if err != nil {
t.Fatal(err)
}
if ret.ExitCode != 0 {
fmt.Println(ret.ActorErr)
t.Fatal("invocation failed: ", ret.ExitCode)
}
outaddr, err := address.NewFromBytes(ret.Return)
if err != nil {
t.Fatal(err)
}
if outaddr.String() != "t0102" {
t.Fatal("hold up")
}
}
-14
View File
@@ -1,14 +0,0 @@
package actors
import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
)
func NewIDAddress(id uint64) (address.Address, ActorError) {
a, err := address.NewIDAddress(id)
if err != nil {
return address.Undef, aerrors.Escalate(err, "could not create ID Address")
}
return a, nil
}
+5 -4
View File
@@ -3,13 +3,14 @@ package aerrors
import (
"fmt"
"github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
"golang.org/x/xerrors"
)
func IsFatal(err ActorError) bool {
return err != nil && err.IsFatal()
}
func RetCode(err ActorError) uint8 {
func RetCode(err ActorError) exitcode.ExitCode {
if err == nil {
return 0
}
@@ -25,12 +26,12 @@ type internalActorError interface {
type ActorError interface {
error
IsFatal() bool
RetCode() uint8
RetCode() exitcode.ExitCode
}
type actorError struct {
fatal bool
retCode uint8
retCode exitcode.ExitCode
msg string
frame xerrors.Frame
@@ -41,7 +42,7 @@ func (e *actorError) IsFatal() bool {
return e.fatal
}
func (e *actorError) RetCode() uint8 {
func (e *actorError) RetCode() exitcode.ExitCode {
return e.retCode
}
+2 -1
View File
@@ -4,6 +4,7 @@ import (
"testing"
. "github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
"github.com/stretchr/testify/assert"
"golang.org/x/xerrors"
@@ -31,5 +32,5 @@ func TestAbsorbeError(t *testing.T) {
aw3 := Wrap(aw2, "creating miner in storage market")
t.Logf("Verbose error: %+v", aw3)
t.Logf("Normal error: %v", aw3)
assert.Equal(t, uint8(35), RetCode(aw3))
assert.Equal(t, exitcode.ExitCode(35), RetCode(aw3))
}
+27 -5
View File
@@ -4,12 +4,13 @@ import (
"errors"
"fmt"
hamt "github.com/ipfs/go-hamt-ipld"
"github.com/filecoin-project/specs-actors/actors/runtime/exitcode"
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
)
// New creates a new non-fatal error
func New(retCode uint8, message string) ActorError {
func New(retCode exitcode.ExitCode, message string) ActorError {
if retCode == 0 {
return &actorError{
fatal: true,
@@ -29,7 +30,7 @@ func New(retCode uint8, message string) ActorError {
}
// Newf creates a new non-fatal error
func Newf(retCode uint8, format string, args ...interface{}) ActorError {
func Newf(retCode exitcode.ExitCode, format string, args ...interface{}) ActorError {
if retCode == 0 {
return &actorError{
fatal: true,
@@ -48,6 +49,27 @@ func Newf(retCode uint8, format string, args ...interface{}) ActorError {
}
}
// todo: bit hacky
func NewfSkip(skip int, retCode exitcode.ExitCode, format string, args ...interface{}) ActorError {
if retCode == 0 {
return &actorError{
fatal: true,
retCode: 0,
msg: "tried creating an error and setting RetCode to 0",
frame: xerrors.Caller(skip),
err: fmt.Errorf(format, args...),
}
}
return &actorError{
retCode: retCode,
msg: fmt.Sprintf(format, args...),
frame: xerrors.Caller(skip),
}
}
func Fatal(message string, args ...interface{}) ActorError {
return &actorError{
fatal: true,
@@ -95,7 +117,7 @@ func Wrapf(err ActorError, format string, args ...interface{}) ActorError {
}
// Absorb takes and error and makes in not fatal ActorError
func Absorb(err error, retCode uint8, msg string) ActorError {
func Absorb(err error, retCode exitcode.ExitCode, msg string) ActorError {
if err == nil {
return nil
}
@@ -160,7 +182,7 @@ func HandleExternalError(err error, msg string) ActorError {
}
}
if xerrors.Is(err, &hamt.SerializationError{}) {
if xerrors.Is(err, &cbor.SerializationError{}) {
return &actorError{
fatal: false,
retCode: 253,
File diff suppressed because it is too large Load Diff
-5
View File
@@ -1,5 +0,0 @@
package actors
import "github.com/filecoin-project/lotus/chain/actors/aerrors"
type ActorError = aerrors.ActorError
-46
View File
@@ -1,46 +0,0 @@
package actors
import (
"reflect"
"sort"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
"github.com/filecoin-project/lotus/chain/types"
)
type update struct {
start uint64
method interface{}
}
func withUpdates(updates ...update) interface{} {
sort.Slice(updates, func(i, j int) bool { // so we iterate from newest below
return updates[i].start > updates[j].start
})
// <script type="application/javascript">
typ := reflect.TypeOf(updates[0].method)
out := reflect.MakeFunc(typ, func(args []reflect.Value) (results []reflect.Value) {
vmctx := args[1].Interface().(types.VMContext)
for _, u := range updates {
if vmctx.BlockHeight() > u.start {
return reflect.ValueOf(u.method).Call(args)
}
}
return reflect.ValueOf(notFound(vmctx)).Call([]reflect.Value{})
})
return out.Interface()
// </script>
}
func notFound(vmctx types.VMContext) func() ([]byte, ActorError) {
return func() ([]byte, ActorError) {
return nil, aerrors.Fatal("no code for method %d at height %d", vmctx.Message().Method, vmctx.BlockHeight())
}
}
-365
View File
@@ -1,365 +0,0 @@
package actors_test
import (
"bytes"
"context"
"math/rand"
"testing"
"github.com/filecoin-project/go-sectorbuilder"
"github.com/ipfs/go-cid"
dstore "github.com/ipfs/go-datastore"
hamt "github.com/ipfs/go-hamt-ipld"
blockstore "github.com/ipfs/go-ipfs-blockstore"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/gen"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
"github.com/filecoin-project/lotus/chain/wallet"
)
const testGasLimit = 10000
type HarnessInit struct {
NAddrs uint64
Addrs map[address.Address]types.BigInt
Miner address.Address
}
type HarnessStage int
const (
HarnessPreInit HarnessStage = iota
HarnessPostInit
)
type HarnessOpt func(testing.TB, *Harness) error
type Harness struct {
HI HarnessInit
Stage HarnessStage
Nonces map[address.Address]uint64
GasCharges map[address.Address]types.BigInt
Rand vm.Rand
BlockHeight uint64
lastBalanceCheck map[address.Address]types.BigInt
ctx context.Context
bs blockstore.Blockstore
vm *vm.VM
cs *store.ChainStore
w *wallet.Wallet
}
var HarnessMinerFunds = types.NewInt(1000000)
func HarnessAddr(addr *address.Address, value uint64) HarnessOpt {
return func(t testing.TB, h *Harness) error {
if h.Stage != HarnessPreInit {
return nil
}
hi := &h.HI
if addr.Empty() {
k, err := h.w.GenerateKey(types.KTSecp256k1)
if err != nil {
t.Fatal(err)
}
*addr = k
}
hi.Addrs[*addr] = types.NewInt(value)
return nil
}
}
func HarnessMiner(addr *address.Address) HarnessOpt {
return func(_ testing.TB, h *Harness) error {
if h.Stage != HarnessPreInit {
return nil
}
hi := &h.HI
if addr.Empty() {
*addr = hi.Miner
return nil
}
delete(hi.Addrs, hi.Miner)
hi.Miner = *addr
return nil
}
}
func HarnessActor(actor *address.Address, creator *address.Address, code cid.Cid, params func() cbg.CBORMarshaler) HarnessOpt {
return func(t testing.TB, h *Harness) error {
if h.Stage != HarnessPostInit {
return nil
}
if !actor.Empty() {
return xerrors.New("actor address should be empty")
}
ret, _ := h.CreateActor(t, *creator, code, params())
if ret.ExitCode != 0 {
return xerrors.Errorf("creating actor: %w", ret.ActorErr)
}
var err error
*actor, err = address.NewFromBytes(ret.Return)
return err
}
}
func HarnessAddMiner(addr *address.Address, creator *address.Address) HarnessOpt {
return func(t testing.TB, h *Harness) error {
if h.Stage != HarnessPostInit {
return nil
}
if !addr.Empty() {
return xerrors.New("actor address should be empty")
}
ret, _ := h.InvokeWithValue(t, *creator, actors.StoragePowerAddress,
actors.SPAMethods.CreateStorageMiner, types.NewInt(3000), &actors.StorageMinerConstructorParams{
Owner: *creator,
Worker: *creator,
SectorSize: 1024,
PeerID: "fakepeerid",
})
if ret.ExitCode != 0 {
return xerrors.Errorf("creating actor: %w", ret.ActorErr)
}
var err error
*addr, err = address.NewFromBytes(ret.Return)
return err
}
}
func HarnessCtx(ctx context.Context) HarnessOpt {
return func(t testing.TB, h *Harness) error {
h.ctx = ctx
return nil
}
}
func NewHarness(t *testing.T, options ...HarnessOpt) *Harness {
w, err := wallet.NewWallet(wallet.NewMemKeyStore())
if err != nil {
t.Fatal(err)
}
h := &Harness{
Stage: HarnessPreInit,
Nonces: make(map[address.Address]uint64),
Rand: &fakeRand{},
HI: HarnessInit{
NAddrs: 1,
Miner: blsaddr(0),
Addrs: map[address.Address]types.BigInt{
blsaddr(0): HarnessMinerFunds,
},
},
GasCharges: make(map[address.Address]types.BigInt),
lastBalanceCheck: make(map[address.Address]types.BigInt),
w: w,
ctx: context.Background(),
bs: bstore.NewBlockstore(dstore.NewMapDatastore()),
BlockHeight: 0,
}
for _, opt := range options {
err := opt(t, h)
if err != nil {
t.Fatalf("Applying options: %v", err)
}
}
st, err := gen.MakeInitialStateTree(h.bs, h.HI.Addrs)
if err != nil {
t.Fatal(err)
}
stateroot, err := st.Flush(context.TODO())
if err != nil {
t.Fatal(err)
}
stateroot, err = gen.SetupStorageMarketActor(h.bs, stateroot, nil)
if err != nil {
t.Fatal(err)
}
h.cs = store.NewChainStore(h.bs, nil, vm.Syscalls(sectorbuilder.ProofVerifier))
h.vm, err = vm.NewVM(stateroot, 1, h.Rand, h.HI.Miner, h.cs.Blockstore(), h.cs.VMSys())
if err != nil {
t.Fatal(err)
}
h.Stage = HarnessPostInit
for _, opt := range options {
err := opt(t, h)
if err != nil {
t.Fatalf("Applying options: %+v", err)
}
}
return h
}
func (h *Harness) Apply(t testing.TB, msg types.Message) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
if msg.Nonce == 0 {
msg.Nonce, _ = h.Nonces[msg.From]
h.Nonces[msg.From] = msg.Nonce + 1
}
ret, err := h.vm.ApplyMessage(h.ctx, &msg)
if err != nil {
t.Fatalf("Applying message: %+v", err)
}
if ret != nil {
if prev, ok := h.GasCharges[msg.From]; ok {
h.GasCharges[msg.From] = types.BigAdd(prev, ret.GasUsed)
} else {
h.GasCharges[msg.From] = ret.GasUsed
}
}
stateroot, err := h.vm.Flush(context.TODO())
if err != nil {
t.Fatalf("Flushing VM: %+v", err)
}
cst := hamt.CSTFromBstore(h.bs)
state, err := state.LoadStateTree(cst, stateroot)
if err != nil {
t.Fatalf("Loading state tree: %+v", err)
}
return ret, state
}
func (h *Harness) CreateActor(t testing.TB, from address.Address,
code cid.Cid, params cbg.CBORMarshaler) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
return h.Apply(t, types.Message{
To: actors.InitAddress,
From: from,
Method: actors.IAMethods.Exec,
Params: DumpObject(t,
&actors.ExecParams{
Code: code,
Params: DumpObject(t, params),
}),
GasPrice: types.NewInt(1),
GasLimit: types.NewInt(testGasLimit),
Value: types.NewInt(0),
})
}
func (h *Harness) SendFunds(t testing.TB, from address.Address, to address.Address,
value types.BigInt) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
return h.Apply(t, types.Message{
To: to,
From: from,
Method: 0,
Value: value,
GasPrice: types.NewInt(1),
GasLimit: types.NewInt(testGasLimit),
})
}
func (h *Harness) Invoke(t testing.TB, from address.Address, to address.Address,
method uint64, params cbg.CBORMarshaler) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
return h.InvokeWithValue(t, from, to, method, types.NewInt(0), params)
}
func (h *Harness) InvokeWithValue(t testing.TB, from address.Address, to address.Address,
method uint64, value types.BigInt, params cbg.CBORMarshaler) (*vm.ApplyRet, *state.StateTree) {
t.Helper()
h.vm.SetBlockHeight(h.BlockHeight)
return h.Apply(t, types.Message{
To: to,
From: from,
Method: method,
Value: value,
Params: DumpObject(t, params),
GasPrice: types.NewInt(1),
GasLimit: types.NewInt(testGasLimit),
})
}
func (h *Harness) AssertBalance(t testing.TB, addr address.Address, amt uint64) {
t.Helper()
b, err := h.vm.ActorBalance(addr)
if err != nil {
t.Fatalf("%+v", err)
}
if types.BigCmp(types.NewInt(amt), b) != 0 {
t.Errorf("expected %s to have balanced of %d. Instead has %s", addr, amt, b)
}
}
func (h *Harness) AssertBalanceChange(t testing.TB, addr address.Address, amt int64) {
t.Helper()
lastBalance, ok := h.lastBalanceCheck[addr]
if !ok {
lastBalance, ok = h.HI.Addrs[addr]
if !ok {
lastBalance = types.NewInt(0)
}
}
var expected types.BigInt
if amt >= 0 {
expected = types.BigAdd(lastBalance, types.NewInt(uint64(amt)))
} else {
expected = types.BigSub(lastBalance, types.NewInt(uint64(-amt)))
}
h.lastBalanceCheck[addr] = expected
if gasUsed, ok := h.GasCharges[addr]; ok {
expected = types.BigSub(expected, gasUsed)
}
b, err := h.vm.ActorBalance(addr)
if err != nil {
t.Fatalf("%+v", err)
}
if types.BigCmp(expected, b) != 0 {
t.Errorf("expected %s to have balanced of %d. Instead has %s", addr, amt, b)
}
}
func DumpObject(t testing.TB, obj cbg.CBORMarshaler) []byte {
if obj == nil {
return nil
}
t.Helper()
b := new(bytes.Buffer)
if err := obj.MarshalCBOR(b); err != nil {
t.Fatalf("dumping params: %+v", err)
}
return b.Bytes()
}
type fakeRand struct{}
func (fr *fakeRand) GetRandomness(ctx context.Context, h int64) ([]byte, error) {
out := make([]byte, 32)
rand.New(rand.NewSource(h)).Read(out)
return out, nil
}
-4
View File
@@ -7,10 +7,6 @@ import (
cbg "github.com/whyrusleeping/cbor-gen"
)
var (
EmptyStructCBOR = []byte{0xa0}
)
func SerializeParams(i cbg.CBORMarshaler) ([]byte, aerrors.ActorError) {
buf := new(bytes.Buffer)
if err := i.MarshalCBOR(buf); err != nil {
+36 -5
View File
@@ -1,6 +1,8 @@
package chain
import (
"fmt"
"github.com/filecoin-project/lotus/build"
lru "github.com/hashicorp/golang-lru"
"github.com/ipfs/go-cid"
@@ -10,6 +12,35 @@ type BadBlockCache struct {
badBlocks *lru.ARCCache
}
type BadBlockReason struct {
Reason string
TipSet []cid.Cid
OriginalReason *BadBlockReason
}
func NewBadBlockReason(cid []cid.Cid, format string, i ...interface{}) BadBlockReason {
return BadBlockReason{
TipSet: cid,
Reason: fmt.Sprintf(format, i...),
}
}
func (bbr BadBlockReason) Linked(reason string, i ...interface{}) BadBlockReason {
or := &bbr
if bbr.OriginalReason != nil {
or = bbr.OriginalReason
}
return BadBlockReason{Reason: fmt.Sprintf(reason, i...), OriginalReason: or}
}
func (bbr BadBlockReason) String() string {
res := bbr.Reason
if bbr.OriginalReason != nil {
res += " caused by: " + fmt.Sprintf("%s %s", bbr.OriginalReason.TipSet, bbr.OriginalReason.String())
}
return res
}
func NewBadBlockCache() *BadBlockCache {
cache, err := lru.NewARC(build.BadBlockCacheSize)
if err != nil {
@@ -21,15 +52,15 @@ func NewBadBlockCache() *BadBlockCache {
}
}
func (bts *BadBlockCache) Add(c cid.Cid, reason string) {
bts.badBlocks.Add(c, reason)
func (bts *BadBlockCache) Add(c cid.Cid, bbr BadBlockReason) {
bts.badBlocks.Add(c, bbr)
}
func (bts *BadBlockCache) Has(c cid.Cid) (string, bool) {
func (bts *BadBlockCache) Has(c cid.Cid) (BadBlockReason, bool) {
rval, ok := bts.badBlocks.Get(c)
if !ok {
return "", false
return BadBlockReason{}, false
}
return rval.(string), true
return rval.(BadBlockReason), true
}
+93
View File
@@ -0,0 +1,93 @@
package beacon
import (
"context"
"time"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/abi"
logging "github.com/ipfs/go-log"
"golang.org/x/xerrors"
)
var log = logging.Logger("beacon")
type Response struct {
Entry types.BeaconEntry
Err error
}
// RandomBeacon represents a system that provides randomness to Lotus.
// Other components interrogate the RandomBeacon to acquire randomness that's
// valid for a specific chain epoch. Also to verify beacon entries that have
// been posted on chain.
type RandomBeacon interface {
Entry(context.Context, uint64) <-chan Response
VerifyEntry(types.BeaconEntry, types.BeaconEntry) error
MaxBeaconRoundForEpoch(abi.ChainEpoch, types.BeaconEntry) uint64
}
func ValidateBlockValues(b RandomBeacon, h *types.BlockHeader, prevEntry types.BeaconEntry) error {
maxRound := b.MaxBeaconRoundForEpoch(h.Height, prevEntry)
if maxRound == prevEntry.Round {
if len(h.BeaconEntries) != 0 {
return xerrors.Errorf("expected not to have any beacon entries in this block, got %d", len(h.BeaconEntries))
}
return nil
}
last := h.BeaconEntries[len(h.BeaconEntries)-1]
if last.Round != maxRound {
return xerrors.Errorf("expected final beacon entry in block to be at round %d, got %d", maxRound, last.Round)
}
for i, e := range h.BeaconEntries {
if err := b.VerifyEntry(e, prevEntry); err != nil {
return xerrors.Errorf("beacon entry %d (%d - %x (%d)) was invalid: %w", i, e.Round, e.Data, len(e.Data), err)
}
prevEntry = e
}
return nil
}
func BeaconEntriesForBlock(ctx context.Context, beacon RandomBeacon, round abi.ChainEpoch, prev types.BeaconEntry) ([]types.BeaconEntry, error) {
start := time.Now()
maxRound := beacon.MaxBeaconRoundForEpoch(round, prev)
if maxRound == prev.Round {
return nil, nil
}
// TODO: this is a sketchy way to handle the genesis block not having a beacon entry
if prev.Round == 0 {
prev.Round = maxRound - 1
}
cur := maxRound
var out []types.BeaconEntry
for cur > prev.Round {
rch := beacon.Entry(ctx, cur)
select {
case resp := <-rch:
if resp.Err != nil {
return nil, xerrors.Errorf("beacon entry request returned error: %w", resp.Err)
}
out = append(out, resp.Entry)
cur = resp.Entry.Round - 1
case <-ctx.Done():
return nil, xerrors.Errorf("context timed out waiting on beacon entry to come back for round %d: %w", round, ctx.Err())
}
}
log.Debugw("fetching beacon entries", "took", time.Since(start), "numEntries", len(out))
reverse(out)
return out, nil
}
func reverse(arr []types.BeaconEntry) {
for i := 0; i < len(arr)/2; i++ {
arr[i], arr[len(arr)-(1+i)] = arr[len(arr)-(1+i)], arr[i]
}
}
+192
View File
@@ -0,0 +1,192 @@
package drand
import (
"bytes"
"context"
"sync"
"time"
dchain "github.com/drand/drand/chain"
dclient "github.com/drand/drand/client"
hclient "github.com/drand/drand/client/http"
dlog "github.com/drand/drand/log"
gclient "github.com/drand/drand/lp2p/client"
"github.com/drand/kyber"
kzap "github.com/go-kit/kit/log/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/xerrors"
logging "github.com/ipfs/go-log"
pubsub "github.com/libp2p/go-libp2p-pubsub"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/lotus/chain/beacon"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
var log = logging.Logger("drand")
type drandPeer struct {
addr string
tls bool
}
func (dp *drandPeer) Address() string {
return dp.addr
}
func (dp *drandPeer) IsTLS() bool {
return dp.tls
}
// DrandBeacon connects Lotus with a drand network in order to provide
// randomness to the system in a way that's aligned with Filecoin rounds/epochs.
//
// We connect to drand peers via their public HTTP endpoints. The peers are
// enumerated in the drandServers variable.
//
// The root trust for the Drand chain is configured from build.DrandChain.
type DrandBeacon struct {
client dclient.Client
pubkey kyber.Point
// seconds
interval time.Duration
drandGenTime uint64
filGenTime uint64
filRoundTime uint64
cacheLk sync.Mutex
localCache map[uint64]types.BeaconEntry
}
func NewDrandBeacon(genesisTs, interval uint64, ps *pubsub.PubSub, config dtypes.DrandConfig) (*DrandBeacon, error) {
if genesisTs == 0 {
panic("what are you doing this cant be zero")
}
drandChain, err := dchain.InfoFromJSON(bytes.NewReader([]byte(config.ChainInfoJSON)))
if err != nil {
return nil, xerrors.Errorf("unable to unmarshal drand chain info: %w", err)
}
dlogger := dlog.NewKitLoggerFrom(kzap.NewZapSugarLogger(
log.SugaredLogger.Desugar(), zapcore.InfoLevel))
var clients []dclient.Client
for _, url := range config.Servers {
hc, err := hclient.NewWithInfo(url, drandChain, nil)
if err != nil {
return nil, xerrors.Errorf("could not create http drand client: %w", err)
}
clients = append(clients, hc)
}
opts := []dclient.Option{
dclient.WithChainInfo(drandChain),
dclient.WithCacheSize(1024),
dclient.WithLogger(dlogger),
dclient.WithAutoWatch(),
}
if ps != nil {
opts = append(opts, gclient.WithPubsub(ps))
} else {
log.Info("drand beacon without pubsub")
}
client, err := dclient.Wrap(clients, opts...)
if err != nil {
return nil, xerrors.Errorf("creating drand client")
}
db := &DrandBeacon{
client: client,
localCache: make(map[uint64]types.BeaconEntry),
}
db.pubkey = drandChain.PublicKey
db.interval = drandChain.Period
db.drandGenTime = uint64(drandChain.GenesisTime)
db.filRoundTime = interval
db.filGenTime = genesisTs
return db, nil
}
func (db *DrandBeacon) Entry(ctx context.Context, round uint64) <-chan beacon.Response {
out := make(chan beacon.Response, 1)
if round != 0 {
be := db.getCachedValue(round)
if be != nil {
out <- beacon.Response{Entry: *be}
close(out)
return out
}
}
go func() {
start := time.Now()
log.Infow("start fetching randomness", "round", round)
resp, err := db.client.Get(ctx, round)
var br beacon.Response
if err != nil {
br.Err = xerrors.Errorf("drand failed Get request: %w", err)
} else {
br.Entry.Round = resp.Round()
br.Entry.Data = resp.Signature()
}
log.Infow("done fetching randomness", "round", round, "took", time.Since(start))
out <- br
close(out)
}()
return out
}
func (db *DrandBeacon) cacheValue(e types.BeaconEntry) {
db.cacheLk.Lock()
defer db.cacheLk.Unlock()
db.localCache[e.Round] = e
}
func (db *DrandBeacon) getCachedValue(round uint64) *types.BeaconEntry {
db.cacheLk.Lock()
defer db.cacheLk.Unlock()
v, ok := db.localCache[round]
if !ok {
return nil
}
return &v
}
func (db *DrandBeacon) VerifyEntry(curr types.BeaconEntry, prev types.BeaconEntry) error {
if prev.Round == 0 {
// TODO handle genesis better
return nil
}
b := &dchain.Beacon{
PreviousSig: prev.Data,
Round: curr.Round,
Signature: curr.Data,
}
err := dchain.VerifyBeacon(db.pubkey, b)
if err == nil {
db.cacheValue(curr)
}
return err
}
func (db *DrandBeacon) MaxBeaconRoundForEpoch(filEpoch abi.ChainEpoch, prevEntry types.BeaconEntry) uint64 {
// TODO: sometimes the genesis time for filecoin is zero and this goes negative
latestTs := ((uint64(filEpoch) * db.filRoundTime) + db.filGenTime) - db.filRoundTime
dround := (latestTs - db.drandGenTime) / uint64(db.interval.Seconds())
return dround
}
var _ beacon.RandomBeacon = (*DrandBeacon)(nil)
+25
View File
@@ -0,0 +1,25 @@
package drand
import (
"os"
"testing"
dchain "github.com/drand/drand/chain"
hclient "github.com/drand/drand/client/http"
"github.com/stretchr/testify/assert"
"github.com/filecoin-project/lotus/build"
)
func TestPrintGroupInfo(t *testing.T) {
server := build.DrandConfig.Servers[0]
c, err := hclient.New(server, nil, nil)
assert.NoError(t, err)
cg := c.(interface {
FetchChainInfo(groupHash []byte) (*dchain.Info, error)
})
chain, err := cg.FetchChainInfo(nil)
assert.NoError(t, err)
err = chain.ToJSON(os.Stdout)
assert.NoError(t, err)
}
+64
View File
@@ -0,0 +1,64 @@
package beacon
import (
"bytes"
"context"
"encoding/binary"
"time"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/minio/blake2b-simd"
"golang.org/x/xerrors"
)
// Mock beacon assumes that filecoin rounds are 1:1 mapped with the beacon rounds
type mockBeacon struct {
interval time.Duration
}
func NewMockBeacon(interval time.Duration) RandomBeacon {
mb := &mockBeacon{interval: interval}
return mb
}
func (mb *mockBeacon) RoundTime() time.Duration {
return mb.interval
}
func (mb *mockBeacon) entryForIndex(index uint64) types.BeaconEntry {
buf := make([]byte, 8)
binary.BigEndian.PutUint64(buf, index)
rval := blake2b.Sum256(buf)
return types.BeaconEntry{
Round: index,
Data: rval[:],
}
}
func (mb *mockBeacon) Entry(ctx context.Context, index uint64) <-chan Response {
e := mb.entryForIndex(index)
out := make(chan Response, 1)
out <- Response{Entry: e}
return out
}
func (mb *mockBeacon) VerifyEntry(from types.BeaconEntry, to types.BeaconEntry) error {
// TODO: cache this, especially for bls
oe := mb.entryForIndex(from.Round)
if !bytes.Equal(from.Data, oe.Data) {
return xerrors.Errorf("mock beacon entry was invalid!")
}
return nil
}
func (mb *mockBeacon) IsEntryForEpoch(e types.BeaconEntry, epoch abi.ChainEpoch, nulls int) (bool, error) {
return int64(e.Round) <= int64(epoch) && int64(epoch)-int64(nulls) >= int64(e.Round), nil
}
func (mb *mockBeacon) MaxBeaconRoundForEpoch(epoch abi.ChainEpoch, prevEntry types.BeaconEntry) uint64 {
return uint64(epoch)
}
var _ RandomBeacon = (*mockBeacon)(nil)
+27 -8
View File
@@ -10,6 +10,7 @@ import (
"golang.org/x/xerrors"
cborutil "github.com/filecoin-project/go-cbor-util"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
@@ -27,6 +28,24 @@ const BlockSyncProtocolID = "/fil/sync/blk/0.0.1"
const BlockSyncMaxRequestLength = 800
// BlockSyncService is the component that services BlockSync requests from
// peers.
//
// BlockSync is the basic chain synchronization protocol of Filecoin. BlockSync
// is an RPC-oriented protocol, with a single operation to request blocks.
//
// A request contains a start anchor block (referred to with a CID), and a
// amount of blocks requested beyond the anchor (including the anchor itself).
//
// A client can also pass options, encoded as a 64-bit bitfield. Lotus supports
// two options at the moment:
//
// - include block contents
// - include block messages
//
// The response will include a status code, an optional message, and the
// response payload in case of success. The payload is a slice of serialized
// tipsets.
type BlockSyncService struct {
cs *store.ChainStore
}
@@ -91,7 +110,7 @@ func (bss *BlockSyncService) HandleStream(s inet.Stream) {
ctx, span := trace.StartSpan(context.Background(), "blocksync.HandleStream")
defer span.End()
defer s.Close()
defer s.Close() //nolint:errcheck
var req BlockSyncRequest
if err := cborutil.ReadCborRPC(bufio.NewReader(s), &req); err != nil {
@@ -107,7 +126,7 @@ func (bss *BlockSyncService) HandleStream(s inet.Stream) {
}
writeDeadline := 60 * time.Second
s.SetDeadline(time.Now().Add(writeDeadline))
_ = s.SetDeadline(time.Now().Add(writeDeadline))
if err := cborutil.WriteCborRPC(s, resp); err != nil {
log.Warnw("failed to write back response for handle stream", "err", err, "peer", s.Conn().RemotePeer())
return
@@ -138,7 +157,7 @@ func (bss *BlockSyncService) processRequest(ctx context.Context, p peer.ID, req
reqlen = BlockSyncMaxRequestLength
}
chain, err := bss.collectChainSegment(types.NewTipSetKey(req.Start...), reqlen, opts)
chain, err := collectChainSegment(bss.cs, types.NewTipSetKey(req.Start...), reqlen, opts)
if err != nil {
log.Warn("encountered error while responding to block sync request: ", err)
return &BlockSyncResponse{
@@ -158,18 +177,18 @@ func (bss *BlockSyncService) processRequest(ctx context.Context, p peer.ID, req
}, nil
}
func (bss *BlockSyncService) collectChainSegment(start types.TipSetKey, length uint64, opts *BSOptions) ([]*BSTipSet, error) {
func collectChainSegment(cs *store.ChainStore, start types.TipSetKey, length uint64, opts *BSOptions) ([]*BSTipSet, error) {
var bstips []*BSTipSet
cur := start
for {
var bst BSTipSet
ts, err := bss.cs.LoadTipSet(cur)
ts, err := cs.LoadTipSet(cur)
if err != nil {
return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err)
}
if opts.IncludeMessages {
bmsgs, bmincl, smsgs, smincl, err := bss.gatherMessages(ts)
bmsgs, bmincl, smsgs, smincl, err := gatherMessages(cs, ts)
if err != nil {
return nil, xerrors.Errorf("gather messages failed: %w", err)
}
@@ -194,7 +213,7 @@ func (bss *BlockSyncService) collectChainSegment(start types.TipSetKey, length u
}
}
func (bss *BlockSyncService) gatherMessages(ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) {
func gatherMessages(cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) {
blsmsgmap := make(map[cid.Cid]uint64)
secpkmsgmap := make(map[cid.Cid]uint64)
var secpkmsgs []*types.SignedMessage
@@ -202,7 +221,7 @@ func (bss *BlockSyncService) gatherMessages(ts *types.TipSet) ([]*types.Message,
var secpkincl, blsincl [][]uint64
for _, b := range ts.Blocks() {
bmsgs, smsgs, err := bss.cs.MessagesForBlock(b)
bmsgs, smsgs, err := cs.MessagesForBlock(b)
if err != nil {
return nil, nil, nil, nil, err
}
+69 -22
View File
@@ -12,6 +12,8 @@ import (
blocks "github.com/ipfs/go-block-format"
bserv "github.com/ipfs/go-blockservice"
"github.com/ipfs/go-cid"
graphsync "github.com/ipfs/go-graphsync"
gsnet "github.com/ipfs/go-graphsync/network"
host "github.com/libp2p/go-libp2p-core/host"
inet "github.com/libp2p/go-libp2p-core/network"
"github.com/libp2p/go-libp2p-core/peer"
@@ -22,24 +24,26 @@ import (
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
incrt "github.com/filecoin-project/lotus/lib/increadtimeout"
"github.com/filecoin-project/lotus/lib/peermgr"
"github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/lotus/peermgr"
)
type BlockSync struct {
bserv bserv.BlockService
gsync graphsync.GraphExchange
host host.Host
syncPeers *bsPeerTracker
peerMgr *peermgr.PeerMgr
}
func NewBlockSyncClient(bserv dtypes.ChainBlockService, h host.Host, pmgr peermgr.MaybePeerMgr) *BlockSync {
func NewBlockSyncClient(bserv dtypes.ChainBlockService, h host.Host, pmgr peermgr.MaybePeerMgr, gs dtypes.Graphsync) *BlockSync {
return &BlockSync{
bserv: bserv,
host: h,
syncPeers: newPeerTracker(pmgr.Mgr),
peerMgr: pmgr.Mgr,
gsync: gs,
}
}
@@ -60,6 +64,11 @@ func (bs *BlockSync) processStatus(req *BlockSyncRequest, res *BlockSyncResponse
}
}
// GetBlocks fetches count blocks from the network, from the provided tipset
// *backwards*, returning as many tipsets as count.
//
// {hint/usage}: This is used by the Syncer during normal chain syncing and when
// resolving forks.
func (bs *BlockSync) GetBlocks(ctx context.Context, tsk types.TipSetKey, count int) ([]*types.TipSet, error) {
ctx, span := trace.StartSpan(ctx, "bsync.GetBlocks")
defer span.End()
@@ -76,7 +85,9 @@ func (bs *BlockSync) GetBlocks(ctx context.Context, tsk types.TipSetKey, count i
Options: BSOptBlocks,
}
// this peerset is sorted by latency and failure counting.
peers := bs.getPeers()
// randomize the first few peers so we don't always pick the same peer
shufflePrefix(peers)
@@ -101,7 +112,7 @@ func (bs *BlockSync) GetBlocks(ctx context.Context, tsk types.TipSetKey, count i
continue
}
if res.Status == 0 {
if res.Status == StatusOK || res.Status == StatusPartial {
resp, err := bs.processBlocksResponse(req, res)
if err != nil {
return nil, xerrors.Errorf("success response from peer failed to process: %w", err)
@@ -110,6 +121,7 @@ func (bs *BlockSync) GetBlocks(ctx context.Context, tsk types.TipSetKey, count i
bs.host.ConnManager().TagPeer(p, "bsync", 25)
return resp, nil
}
oerr = bs.processStatus(req, res)
if oerr != nil {
log.Warnf("BlockSync peer %s response was an error: %s", p.String(), oerr)
@@ -141,7 +153,7 @@ func (bs *BlockSync) GetFullTipSet(ctx context.Context, p peer.ID, tsk types.Tip
return bstsToFullTipSet(bts)
case 101: // Partial Response
return nil, xerrors.Errorf("partial responses are not handled")
return nil, xerrors.Errorf("partial responses are not handled for single tipset fetching")
case 201: // req.Start not found
return nil, fmt.Errorf("not found")
case 202: // Go Away
@@ -181,7 +193,7 @@ func (bs *BlockSync) GetChainMessages(ctx context.Context, h *types.TipSet, coun
req := &BlockSyncRequest{
Start: h.Cids(),
RequestLength: count,
Options: BSOptMessages | BSOptBlocks,
Options: BSOptMessages,
}
var err error
@@ -201,8 +213,8 @@ func (bs *BlockSync) GetChainMessages(ctx context.Context, h *types.TipSet, coun
}
if res.Status == StatusPartial {
log.Warn("dont yet handle partial responses")
continue
// TODO: track partial response sizes to ensure we don't overrequest too often
return res.Chain, nil
}
err = bs.processStatus(req, res)
@@ -234,27 +246,58 @@ func (bs *BlockSync) sendRequestToPeer(ctx context.Context, p peer.ID, req *Bloc
}
}()
start := time.Now()
if span.IsRecordingEvents() {
span.AddAttributes(
trace.StringAttribute("peer", p.Pretty()),
)
}
gsproto := string(gsnet.ProtocolGraphsync)
supp, err := bs.host.Peerstore().SupportsProtocols(p, BlockSyncProtocolID, gsproto)
if err != nil {
return nil, xerrors.Errorf("failed to get protocols for peer: %w", err)
}
if len(supp) == 0 {
return nil, xerrors.Errorf("peer %s supports no known sync protocols", p)
}
switch supp[0] {
case BlockSyncProtocolID:
res, err := bs.fetchBlocksBlockSync(ctx, p, req)
if err != nil {
return nil, xerrors.Errorf("blocksync req failed: %w", err)
}
return res, nil
case gsproto:
res, err := bs.fetchBlocksGraphSync(ctx, p, req)
if err != nil {
return nil, xerrors.Errorf("graphsync req failed: %w", err)
}
return res, nil
default:
return nil, xerrors.Errorf("peerstore somehow returned unexpected protocols: %v", supp)
}
}
func (bs *BlockSync) fetchBlocksBlockSync(ctx context.Context, p peer.ID, req *BlockSyncRequest) (*BlockSyncResponse, error) {
ctx, span := trace.StartSpan(ctx, "blockSyncFetch")
defer span.End()
start := time.Now()
s, err := bs.host.NewStream(inet.WithNoDial(ctx, "should already have connection"), p, BlockSyncProtocolID)
if err != nil {
bs.RemovePeer(p)
return nil, xerrors.Errorf("failed to open stream to peer: %w", err)
}
s.SetWriteDeadline(time.Now().Add(5 * time.Second))
_ = s.SetWriteDeadline(time.Now().Add(5 * time.Second))
if err := cborutil.WriteCborRPC(s, req); err != nil {
s.SetWriteDeadline(time.Time{})
_ = s.SetWriteDeadline(time.Time{})
bs.syncPeers.logFailure(p, time.Since(start))
return nil, err
}
s.SetWriteDeadline(time.Time{})
_ = s.SetWriteDeadline(time.Time{})
var res BlockSyncResponse
r := incrt.New(s, 50<<10, 5*time.Second)
@@ -272,7 +315,6 @@ func (bs *BlockSync) sendRequestToPeer(ctx context.Context, p peer.ID, req *Bloc
}
bs.syncPeers.logSuccess(p, time.Since(start))
return &res, nil
}
@@ -321,6 +363,7 @@ func (bs *BlockSync) RemovePeer(p peer.ID) {
bs.syncPeers.removePeer(p)
}
// getPeers returns a preference-sorted set of peers to query.
func (bs *BlockSync) getPeers() []peer.ID {
return bs.syncPeers.prefSortedPeers()
}
@@ -526,26 +569,30 @@ func (bpt *bsPeerTracker) logSuccess(p peer.ID, dur time.Duration) {
bpt.lk.Lock()
defer bpt.lk.Unlock()
if pi, ok := bpt.peers[p]; !ok {
var pi *peerStats
var ok bool
if pi, ok = bpt.peers[p]; !ok {
log.Warnw("log success called on peer not in tracker", "peerid", p.String())
return
} else {
pi.successes++
logTime(pi, dur)
}
pi.successes++
logTime(pi, dur)
}
func (bpt *bsPeerTracker) logFailure(p peer.ID, dur time.Duration) {
bpt.lk.Lock()
defer bpt.lk.Unlock()
if pi, ok := bpt.peers[p]; !ok {
var pi *peerStats
var ok bool
if pi, ok = bpt.peers[p]; !ok {
log.Warn("log failure called on peer not in tracker", "peerid", p.String())
return
} else {
pi.failures++
logTime(pi, dur)
}
pi.failures++
logTime(pi, dur)
}
func (bpt *bsPeerTracker) removePeer(p peer.ID) {
+110 -61
View File
@@ -1,3 +1,5 @@
// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.
package blocksync
import (
@@ -5,54 +7,60 @@ import (
"io"
"github.com/filecoin-project/lotus/chain/types"
cid "github.com/ipfs/go-cid"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
xerrors "golang.org/x/xerrors"
)
// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.
var _ = xerrors.Errorf
var lengthBufBlockSyncRequest = []byte{131}
func (t *BlockSyncRequest) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{131}); err != nil {
if _, err := w.Write(lengthBufBlockSyncRequest); err != nil {
return err
}
scratch := make([]byte, 9)
// t.Start ([]cid.Cid) (slice)
if len(t.Start) > cbg.MaxLength {
return xerrors.Errorf("Slice value in field t.Start was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Start)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Start))); err != nil {
return err
}
for _, v := range t.Start {
if err := cbg.WriteCid(w, v); err != nil {
if err := cbg.WriteCidBuf(scratch, w, v); err != nil {
return xerrors.Errorf("failed writing cid field t.Start: %w", err)
}
}
// t.RequestLength (uint64) (uint64)
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.RequestLength))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.RequestLength)); err != nil {
return err
}
// t.Options (uint64) (uint64)
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.Options))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Options)); err != nil {
return err
}
return nil
}
func (t *BlockSyncRequest) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeader(br)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -66,7 +74,7 @@ func (t *BlockSyncRequest) UnmarshalCBOR(r io.Reader) error {
// t.Start ([]cid.Cid) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -78,9 +86,11 @@ func (t *BlockSyncRequest) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.Start = make([]cid.Cid, extra)
}
for i := 0; i < int(extra); i++ {
c, err := cbg.ReadCid(br)
@@ -92,42 +102,54 @@ func (t *BlockSyncRequest) UnmarshalCBOR(r io.Reader) error {
// t.RequestLength (uint64) (uint64)
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
return err
{
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.RequestLength = uint64(extra)
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.RequestLength = uint64(extra)
// t.Options (uint64) (uint64)
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
return err
{
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Options = uint64(extra)
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Options = uint64(extra)
return nil
}
var lengthBufBlockSyncResponse = []byte{131}
func (t *BlockSyncResponse) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{131}); err != nil {
if _, err := w.Write(lengthBufBlockSyncResponse); err != nil {
return err
}
scratch := make([]byte, 9)
// t.Chain ([]*blocksync.BSTipSet) (slice)
if len(t.Chain) > cbg.MaxLength {
return xerrors.Errorf("Slice value in field t.Chain was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Chain)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Chain))); err != nil {
return err
}
for _, v := range t.Chain {
@@ -137,7 +159,8 @@ func (t *BlockSyncResponse) MarshalCBOR(w io.Writer) error {
}
// t.Status (uint64) (uint64)
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajUnsignedInt, uint64(t.Status))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Status)); err != nil {
return err
}
@@ -146,10 +169,10 @@ func (t *BlockSyncResponse) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Value in field t.Message was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajTextString, uint64(len(t.Message)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len(t.Message))); err != nil {
return err
}
if _, err := w.Write([]byte(t.Message)); err != nil {
if _, err := io.WriteString(w, t.Message); err != nil {
return err
}
return nil
@@ -157,8 +180,9 @@ func (t *BlockSyncResponse) MarshalCBOR(w io.Writer) error {
func (t *BlockSyncResponse) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeader(br)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -172,7 +196,7 @@ func (t *BlockSyncResponse) UnmarshalCBOR(r io.Reader) error {
// t.Chain ([]*blocksync.BSTipSet) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -184,9 +208,11 @@ func (t *BlockSyncResponse) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.Chain = make([]*BSTipSet, extra)
}
for i := 0; i < int(extra); i++ {
var v BSTipSet
@@ -199,18 +225,22 @@ func (t *BlockSyncResponse) UnmarshalCBOR(r io.Reader) error {
// t.Status (uint64) (uint64)
maj, extra, err = cbg.CborReadHeader(br)
if err != nil {
return err
{
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Status = uint64(extra)
}
if maj != cbg.MajUnsignedInt {
return fmt.Errorf("wrong type for uint64 field")
}
t.Status = uint64(extra)
// t.Message (string) (string)
{
sval, err := cbg.ReadString(br)
sval, err := cbg.ReadStringBuf(br, scratch)
if err != nil {
return err
}
@@ -220,21 +250,25 @@ func (t *BlockSyncResponse) UnmarshalCBOR(r io.Reader) error {
return nil
}
var lengthBufBSTipSet = []byte{133}
func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
}
if _, err := w.Write([]byte{133}); err != nil {
if _, err := w.Write(lengthBufBSTipSet); err != nil {
return err
}
scratch := make([]byte, 9)
// t.Blocks ([]*types.BlockHeader) (slice)
if len(t.Blocks) > cbg.MaxLength {
return xerrors.Errorf("Slice value in field t.Blocks was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Blocks)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.Blocks))); err != nil {
return err
}
for _, v := range t.Blocks {
@@ -248,7 +282,7 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field t.BlsMessages was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.BlsMessages)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsMessages))); err != nil {
return err
}
for _, v := range t.BlsMessages {
@@ -262,7 +296,7 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field t.BlsMsgIncludes was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.BlsMsgIncludes)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.BlsMsgIncludes))); err != nil {
return err
}
for _, v := range t.BlsMsgIncludes {
@@ -270,11 +304,11 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field v was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(v)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil {
return err
}
for _, v := range v {
if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, v); err != nil {
if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil {
return err
}
}
@@ -285,7 +319,7 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field t.SecpkMessages was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.SecpkMessages)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkMessages))); err != nil {
return err
}
for _, v := range t.SecpkMessages {
@@ -299,7 +333,7 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field t.SecpkMsgIncludes was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.SecpkMsgIncludes)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.SecpkMsgIncludes))); err != nil {
return err
}
for _, v := range t.SecpkMsgIncludes {
@@ -307,11 +341,11 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
return xerrors.Errorf("Slice value in field v was too long")
}
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(v)))); err != nil {
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(v))); err != nil {
return err
}
for _, v := range v {
if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, v); err != nil {
if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, uint64(v)); err != nil {
return err
}
}
@@ -321,8 +355,9 @@ func (t *BSTipSet) MarshalCBOR(w io.Writer) error {
func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
br := cbg.GetPeeker(r)
scratch := make([]byte, 8)
maj, extra, err := cbg.CborReadHeader(br)
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -336,7 +371,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
// t.Blocks ([]*types.BlockHeader) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -348,9 +383,11 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.Blocks = make([]*types.BlockHeader, extra)
}
for i := 0; i < int(extra); i++ {
var v types.BlockHeader
@@ -363,7 +400,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
// t.BlsMessages ([]*types.Message) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -375,9 +412,11 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.BlsMessages = make([]*types.Message, extra)
}
for i := 0; i < int(extra); i++ {
var v types.Message
@@ -390,7 +429,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
// t.BlsMsgIncludes ([][]uint64) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -402,16 +441,18 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.BlsMsgIncludes = make([][]uint64, extra)
}
for i := 0; i < int(extra); i++ {
{
var maj byte
var extra uint64
var err error
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -423,12 +464,14 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.BlsMsgIncludes[i] = make([]uint64, extra)
}
for j := 0; j < int(extra); j++ {
maj, val, err := cbg.CborReadHeader(br)
maj, val, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return xerrors.Errorf("failed to read uint64 for t.BlsMsgIncludes[i] slice: %w", err)
}
@@ -437,7 +480,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
return xerrors.Errorf("value read for array t.BlsMsgIncludes[i] was not a uint, instead got %d", maj)
}
t.BlsMsgIncludes[i][j] = val
t.BlsMsgIncludes[i][j] = uint64(val)
}
}
@@ -445,7 +488,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
// t.SecpkMessages ([]*types.SignedMessage) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -457,9 +500,11 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.SecpkMessages = make([]*types.SignedMessage, extra)
}
for i := 0; i < int(extra); i++ {
var v types.SignedMessage
@@ -472,7 +517,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
// t.SecpkMsgIncludes ([][]uint64) (slice)
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -484,16 +529,18 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.SecpkMsgIncludes = make([][]uint64, extra)
}
for i := 0; i < int(extra); i++ {
{
var maj byte
var extra uint64
var err error
maj, extra, err = cbg.CborReadHeader(br)
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return err
}
@@ -505,12 +552,14 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
if maj != cbg.MajArray {
return fmt.Errorf("expected cbor array")
}
if extra > 0 {
t.SecpkMsgIncludes[i] = make([]uint64, extra)
}
for j := 0; j < int(extra); j++ {
maj, val, err := cbg.CborReadHeader(br)
maj, val, err := cbg.CborReadHeaderBuf(br, scratch)
if err != nil {
return xerrors.Errorf("failed to read uint64 for t.SecpkMsgIncludes[i] slice: %w", err)
}
@@ -519,7 +568,7 @@ func (t *BSTipSet) UnmarshalCBOR(r io.Reader) error {
return xerrors.Errorf("value read for array t.SecpkMsgIncludes[i] was not a uint, instead got %d", maj)
}
t.SecpkMsgIncludes[i][j] = val
t.SecpkMsgIncludes[i][j] = uint64(val)
}
}
+151
View File
@@ -0,0 +1,151 @@
package blocksync
import (
"context"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
"github.com/ipfs/go-graphsync"
"github.com/ipld/go-ipld-prime"
"github.com/libp2p/go-libp2p-core/peer"
"golang.org/x/xerrors"
store "github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
basicnode "github.com/ipld/go-ipld-prime/node/basic"
ipldselector "github.com/ipld/go-ipld-prime/traversal/selector"
selectorbuilder "github.com/ipld/go-ipld-prime/traversal/selector/builder"
)
const (
// AMT selector recursion. An AMT has arity of 8 so this gives allows
// us to retrieve trees with 8^10 (1,073,741,824) elements.
amtRecursionDepth = uint32(10)
// some constants for looking up tuple encoded struct fields
// field index of Parents field in a block header
blockIndexParentsField = 5
// field index of Messages field in a block header
blockIndexMessagesField = 10
// field index of AMT node in AMT head
amtHeadNodeFieldIndex = 2
// field index of links array AMT node
amtNodeLinksFieldIndex = 1
// field index of values array AMT node
amtNodeValuesFieldIndex = 2
// maximum depth per traversal
maxRequestLength = 50
)
var amtSelector selectorbuilder.SelectorSpec
func init() {
// builer for selectors
ssb := selectorbuilder.NewSelectorSpecBuilder(basicnode.Style.Any)
// amt selector -- needed to selector through a messages AMT
amtSelector = ssb.ExploreIndex(amtHeadNodeFieldIndex,
ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(amtRecursionDepth)),
ssb.ExploreUnion(
ssb.ExploreIndex(amtNodeLinksFieldIndex,
ssb.ExploreAll(ssb.ExploreRecursiveEdge())),
ssb.ExploreIndex(amtNodeValuesFieldIndex,
ssb.ExploreAll(ssb.Matcher())))))
}
func selectorForRequest(req *BlockSyncRequest) ipld.Node {
// builer for selectors
ssb := selectorbuilder.NewSelectorSpecBuilder(basicnode.Style.Any)
bso := ParseBSOptions(req.Options)
if bso.IncludeMessages {
return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(req.RequestLength)),
ssb.ExploreIndex(blockIndexParentsField,
ssb.ExploreUnion(
ssb.ExploreAll(
ssb.ExploreIndex(blockIndexMessagesField,
ssb.ExploreRange(0, 2, amtSelector),
)),
ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()),
))).Node()
}
return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(int(req.RequestLength)), ssb.ExploreIndex(blockIndexParentsField,
ssb.ExploreUnion(
ssb.ExploreAll(
ssb.Matcher(),
),
ssb.ExploreIndex(0, ssb.ExploreRecursiveEdge()),
))).Node()
}
func firstTipsetSelector(req *BlockSyncRequest) ipld.Node {
// builer for selectors
ssb := selectorbuilder.NewSelectorSpecBuilder(basicnode.Style.Any)
bso := ParseBSOptions(req.Options)
if bso.IncludeMessages {
return ssb.ExploreIndex(blockIndexMessagesField,
ssb.ExploreRange(0, 2, amtSelector),
).Node()
}
return ssb.Matcher().Node()
}
func (bs *BlockSync) executeGsyncSelector(ctx context.Context, p peer.ID, root cid.Cid, sel ipld.Node) error {
extension := graphsync.ExtensionData{
Name: "chainsync",
Data: nil,
}
_, errs := bs.gsync.Request(ctx, p, cidlink.Link{Cid: root}, sel, extension)
for err := range errs {
return xerrors.Errorf("failed to complete graphsync request: %w", err)
}
return nil
}
// Fallback for interacting with other non-lotus nodes
func (bs *BlockSync) fetchBlocksGraphSync(ctx context.Context, p peer.ID, req *BlockSyncRequest) (*BlockSyncResponse, error) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
immediateTsSelector := firstTipsetSelector(req)
// Do this because we can only request one root at a time
for _, r := range req.Start {
if err := bs.executeGsyncSelector(ctx, p, r, immediateTsSelector); err != nil {
return nil, err
}
}
if req.RequestLength > maxRequestLength {
req.RequestLength = maxRequestLength
}
sel := selectorForRequest(req)
// execute the selector forreal
if err := bs.executeGsyncSelector(ctx, p, req.Start[0], sel); err != nil {
return nil, err
}
// Now pull the data we fetched out of the chainstore (where it should now be persisted)
tempcs := store.NewChainStore(bs.bserv.Blockstore(), datastore.NewMapDatastore(), nil)
opts := ParseBSOptions(req.Options)
tsk := types.NewTipSetKey(req.Start...)
chain, err := collectChainSegment(tempcs, tsk, req.RequestLength, opts)
if err != nil {
return nil, xerrors.Errorf("failed to load chain data from chainstore after successful graphsync response (start = %v): %w", req.Start, err)
}
return &BlockSyncResponse{Chain: chain}, nil
}
+22 -24
View File
@@ -5,6 +5,7 @@ import (
"sync"
"time"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/ipfs/go-cid"
logging "github.com/ipfs/go-log/v2"
"golang.org/x/xerrors"
@@ -18,8 +19,8 @@ import (
var log = logging.Logger("events")
// `curH`-`ts.Height` = `confidence`
type HeightHandler func(ctx context.Context, ts *types.TipSet, curH uint64) error
// HeightHandler `curH`-`ts.Height` = `confidence`
type HeightHandler func(ctx context.Context, ts *types.TipSet, curH abi.ChainEpoch) error
type RevertHandler func(ctx context.Context, ts *types.TipSet) error
type heightHandler struct {
@@ -30,17 +31,18 @@ type heightHandler struct {
revert RevertHandler
}
type eventApi interface {
ChainNotify(context.Context) (<-chan []*store.HeadChange, error)
type eventAPI interface {
ChainNotify(context.Context) (<-chan []*api.HeadChange, error)
ChainGetBlockMessages(context.Context, cid.Cid) (*api.BlockMessages, error)
ChainGetTipSetByHeight(context.Context, uint64, types.TipSetKey) (*types.TipSet, error)
ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)
StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error)
ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error)
StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) // optional / for CalledMsg
}
type Events struct {
api eventApi
api eventAPI
tsc *tipSetCache
lk sync.Mutex
@@ -49,10 +51,10 @@ type Events struct {
readyOnce sync.Once
heightEvents
calledEvents
*hcEvents
}
func NewEvents(ctx context.Context, api eventApi) *Events {
func NewEvents(ctx context.Context, api eventAPI) *Events {
gcConfidence := 2 * build.ForkLengthThreshold
tsc := newTSCache(gcConfidence, api.ChainGetTipSetByHeight)
@@ -65,25 +67,14 @@ func NewEvents(ctx context.Context, api eventApi) *Events {
heightEvents: heightEvents{
tsc: tsc,
ctx: ctx,
gcConfidence: uint64(gcConfidence),
gcConfidence: gcConfidence,
heightTriggers: map[uint64]*heightHandler{},
htTriggerHeights: map[uint64][]uint64{},
htHeights: map[uint64][]uint64{},
htTriggerHeights: map[abi.ChainEpoch][]uint64{},
htHeights: map[abi.ChainEpoch][]uint64{},
},
calledEvents: calledEvents{
cs: api,
tsc: tsc,
ctx: ctx,
gcConfidence: uint64(gcConfidence),
confQueue: map[triggerH]map[msgH][]*queuedEvent{},
revertQueue: map[msgH][]triggerH{},
triggers: map[triggerId]*callHandler{},
matchers: map[triggerId][]MatchFunc{},
timeouts: map[uint64]map[triggerId]int{},
},
hcEvents: newHCEvents(ctx, api, tsc, uint64(gcConfidence)),
}
e.ready.Add(1)
@@ -141,6 +132,8 @@ func (e *Events) listenHeadChangesOnce(ctx context.Context) error {
}
e.readyOnce.Do(func() {
e.lastTs = cur[0].Val
e.ready.Done()
})
@@ -160,6 +153,11 @@ func (e *Events) listenHeadChangesOnce(ctx context.Context) error {
if err := e.headChange(rev, app); err != nil {
log.Warnf("headChange failed: %s", err)
}
// sync with fake chainstore (for tests)
if fcs, ok := e.api.(interface{ notifDone() }); ok {
fcs.notifDone()
}
}
return nil
@@ -177,5 +175,5 @@ func (e *Events) headChange(rev, app []*types.TipSet) error {
return err
}
return e.headChangeCalled(rev, app)
return e.processHeadChangeEvent(rev, app)
}
+387 -123
View File
@@ -5,69 +5,79 @@ import (
"math"
"sync"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/ipfs/go-cid"
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
)
const NoTimeout = math.MaxUint64
const NoTimeout = math.MaxInt64
const NoHeight = abi.ChainEpoch(-1)
type triggerId = uint64
type triggerID = uint64
// msgH is the block height at which a message was present / event has happened
type msgH = uint64
type msgH = abi.ChainEpoch
// triggerH is the block height at which the listener will be notified about the
// message (msgH+confidence)
type triggerH = uint64
type triggerH = abi.ChainEpoch
// `ts` is the tipset, in which the `msg` is included.
type eventData interface{}
// EventHandler arguments:
// `prevTs` is the previous tipset, eg the "from" tipset for a state change.
// `ts` is the event tipset, eg the tipset in which the `msg` is included.
// `curH`-`ts.Height` = `confidence`
type CalledHandler func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH uint64) (more bool, err error)
type EventHandler func(data eventData, prevTs, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error)
// CheckFunc is used for atomicity guarantees. If the condition the callbacks
// wait for has already happened in tipset `ts`
//
// If `done` is true, timeout won't be triggered
// If `more` is false, no messages will be sent to CalledHandler (RevertHandler
// If `more` is false, no messages will be sent to EventHandler (RevertHandler
// may still be called)
type CheckFunc func(ts *types.TipSet) (done bool, more bool, err error)
type MatchFunc func(msg *types.Message) (bool, error)
type callHandler struct {
// Keep track of information for an event handler
type handlerInfo struct {
confidence int
timeout uint64
timeout abi.ChainEpoch
disabled bool // TODO: GC after gcConfidence reached
handle CalledHandler
handle EventHandler
revert RevertHandler
}
// When a change occurs, a queuedEvent is created and put into a queue
// until the required confidence is reached
type queuedEvent struct {
trigger triggerId
trigger triggerID
h uint64
msg *types.Message
prevH abi.ChainEpoch
h abi.ChainEpoch
data eventData
called bool
}
type calledEvents struct {
cs eventApi
// Manages chain head change events, which may be forward (new tipset added to
// chain) or backward (chain branch discarded in favour of heavier branch)
type hcEvents struct {
cs eventAPI
tsc *tipSetCache
ctx context.Context
gcConfidence uint64
lastTs *types.TipSet
lk sync.Mutex
ctr triggerId
ctr triggerID
triggers map[triggerId]*callHandler
matchers map[triggerId][]MatchFunc
triggers map[triggerID]*handlerInfo
// maps block heights to events
// [triggerH][msgH][event]
@@ -76,27 +86,81 @@ type calledEvents struct {
// [msgH][triggerH]
revertQueue map[msgH][]triggerH
// [timeoutH+confidence][triggerId]{calls}
timeouts map[uint64]map[triggerId]int
// [timeoutH+confidence][triggerID]{calls}
timeouts map[abi.ChainEpoch]map[triggerID]int
messageEvents
watcherEvents
}
func (e *calledEvents) headChangeCalled(rev, app []*types.TipSet) error {
func newHCEvents(ctx context.Context, cs eventAPI, tsc *tipSetCache, gcConfidence uint64) *hcEvents {
e := hcEvents{
ctx: ctx,
cs: cs,
tsc: tsc,
gcConfidence: gcConfidence,
confQueue: map[triggerH]map[msgH][]*queuedEvent{},
revertQueue: map[msgH][]triggerH{},
triggers: map[triggerID]*handlerInfo{},
timeouts: map[abi.ChainEpoch]map[triggerID]int{},
}
e.messageEvents = newMessageEvents(ctx, &e, cs)
e.watcherEvents = newWatcherEvents(ctx, &e, cs)
return &e
}
// Called when there is a change to the head with tipsets to be
// reverted / applied
func (e *hcEvents) processHeadChangeEvent(rev, app []*types.TipSet) error {
e.lk.Lock()
defer e.lk.Unlock()
for _, ts := range rev {
e.handleReverts(ts)
e.lastTs = ts
}
for _, ts := range app {
// called triggers
// Check if the head change caused any state changes that we were
// waiting for
stateChanges := e.watcherEvents.checkStateChanges(e.lastTs, ts)
e.checkNewCalls(ts)
e.applyWithConfidence(ts)
e.applyTimeouts(ts)
// Queue up calls until there have been enough blocks to reach
// confidence on the state changes
for tid, data := range stateChanges {
e.queueForConfidence(tid, data, e.lastTs, ts)
}
// Check if the head change included any new message calls
newCalls, err := e.messageEvents.checkNewCalls(ts)
if err != nil {
return err
}
// Queue up calls until there have been enough blocks to reach
// confidence on the message calls
for tid, data := range newCalls {
e.queueForConfidence(tid, data, nil, ts)
}
for at := e.lastTs.Height(); at <= ts.Height(); at++ {
// Apply any queued events and timeouts that were targeted at the
// current chain height
e.applyWithConfidence(ts, at)
e.applyTimeouts(ts)
}
// Update the latest known tipset
e.lastTs = ts
}
return nil
}
func (e *calledEvents) handleReverts(ts *types.TipSet) {
func (e *hcEvents) handleReverts(ts *types.TipSet) {
reverts, ok := e.revertQueue[ts.Height()]
if !ok {
return // nothing to do
@@ -112,7 +176,7 @@ func (e *calledEvents) handleReverts(ts *types.TipSet) {
trigger := e.triggers[event.trigger]
if err := trigger.revert(e.ctx, ts); err != nil {
log.Errorf("reverting chain trigger (call %s.%d() @H %d, called @ %d) failed: %s", event.msg.To, event.msg.Method, ts.Height(), triggerH, err)
log.Errorf("reverting chain trigger (@H %d, triggered @ %d) failed: %s", ts.Height(), triggerH, err)
}
}
delete(e.confQueue[triggerH], ts.Height())
@@ -120,66 +184,46 @@ func (e *calledEvents) handleReverts(ts *types.TipSet) {
delete(e.revertQueue, ts.Height())
}
func (e *calledEvents) checkNewCalls(ts *types.TipSet) {
e.messagesForTs(ts, func(msg *types.Message) {
// TODO: provide receipts
// Queue up events until the chain has reached a height that reflects the
// desired confidence
func (e *hcEvents) queueForConfidence(trigID uint64, data eventData, prevTs, ts *types.TipSet) {
trigger := e.triggers[trigID]
for tid, matchFns := range e.matchers {
var matched bool
for _, matchFn := range matchFns {
ok, err := matchFn(msg)
if err != nil {
log.Warnf("event matcher failed: %s")
continue
}
matched = ok
prevH := NoHeight
if prevTs != nil {
prevH = prevTs.Height()
}
appliedH := ts.Height()
if matched {
break
}
}
if matched {
e.queueForConfidence(tid, msg, ts)
break
}
}
})
}
func (e *calledEvents) queueForConfidence(triggerId uint64, msg *types.Message, ts *types.TipSet) {
trigger := e.triggers[triggerId]
// messages are not applied in the tipset they are included in
appliedH := ts.Height() + 1
triggerH := appliedH + uint64(trigger.confidence)
triggerH := appliedH + abi.ChainEpoch(trigger.confidence)
byOrigH, ok := e.confQueue[triggerH]
if !ok {
byOrigH = map[uint64][]*queuedEvent{}
byOrigH = map[abi.ChainEpoch][]*queuedEvent{}
e.confQueue[triggerH] = byOrigH
}
byOrigH[appliedH] = append(byOrigH[appliedH], &queuedEvent{
trigger: triggerId,
trigger: trigID,
prevH: prevH,
h: appliedH,
msg: msg,
data: data,
})
e.revertQueue[appliedH] = append(e.revertQueue[appliedH], triggerH)
}
func (e *calledEvents) applyWithConfidence(ts *types.TipSet) {
byOrigH, ok := e.confQueue[ts.Height()]
// Apply any events that were waiting for this chain height for confidence
func (e *hcEvents) applyWithConfidence(ts *types.TipSet, height abi.ChainEpoch) {
byOrigH, ok := e.confQueue[height]
if !ok {
return // no triggers at thin height
return // no triggers at this height
}
for origH, events := range byOrigH {
triggerTs, err := e.tsc.get(origH)
if err != nil {
log.Errorf("events: applyWithConfidence didn't find tipset for event; wanted %d; current %d", origH, ts.Height())
log.Errorf("events: applyWithConfidence didn't find tipset for event; wanted %d; current %d", origH, height)
}
for _, event := range events {
@@ -192,15 +236,20 @@ func (e *calledEvents) applyWithConfidence(ts *types.TipSet) {
continue
}
rec, err := e.cs.StateGetReceipt(e.ctx, event.msg.Cid(), ts.Key())
if err != nil {
log.Error(err)
return
// Previous tipset - this is relevant for example in a state change
// from one tipset to another
var prevTs *types.TipSet
if event.prevH != NoHeight {
prevTs, err = e.tsc.get(event.prevH)
if err != nil {
log.Errorf("events: applyWithConfidence didn't find tipset for previous event; wanted %d; current %d", event.prevH, height)
continue
}
}
more, err := trigger.handle(event.msg, rec, triggerTs, ts.Height())
more, err := trigger.handle(event.data, prevTs, triggerTs, height)
if err != nil {
log.Errorf("chain trigger (call %s.%d() @H %d, called @ %d) failed: %s", event.msg.To, event.msg.Method, origH, ts.Height(), err)
log.Errorf("chain trigger (@H %d, triggered @ %d) failed: %s", origH, height, err)
continue // don't revert failed calls
}
@@ -216,24 +265,25 @@ func (e *calledEvents) applyWithConfidence(ts *types.TipSet) {
}
}
func (e *calledEvents) applyTimeouts(ts *types.TipSet) {
// Apply any timeouts that expire at this height
func (e *hcEvents) applyTimeouts(ts *types.TipSet) {
triggers, ok := e.timeouts[ts.Height()]
if !ok {
return // nothing to do
}
for triggerId, calls := range triggers {
for triggerID, calls := range triggers {
if calls > 0 {
continue // don't timeout if the method was called
}
trigger := e.triggers[triggerId]
trigger := e.triggers[triggerID]
if trigger.disabled {
continue
}
timeoutTs, err := e.tsc.get(ts.Height() - uint64(trigger.confidence))
timeoutTs, err := e.tsc.get(ts.Height() - abi.ChainEpoch(trigger.confidence))
if err != nil {
log.Errorf("events: applyTimeouts didn't find tipset for event; wanted %d; current %d", ts.Height()-uint64(trigger.confidence), ts.Height())
log.Errorf("events: applyTimeouts didn't find tipset for event; wanted %d; current %d", ts.Height()-abi.ChainEpoch(trigger.confidence), ts.Height())
}
more, err := trigger.handle(nil, nil, timeoutTs, ts.Height())
@@ -246,12 +296,225 @@ func (e *calledEvents) applyTimeouts(ts *types.TipSet) {
}
}
func (e *calledEvents) messagesForTs(ts *types.TipSet, consume func(*types.Message)) {
// Listen for an event
// - CheckFunc: immediately checks if the event already occurred
// - EventHandler: called when the event has occurred, after confidence tipsets
// - RevertHandler: called if the chain head changes causing the event to revert
// - confidence: wait this many tipsets before calling EventHandler
// - timeout: at this chain height, timeout on waiting for this event
func (e *hcEvents) onHeadChanged(check CheckFunc, hnd EventHandler, rev RevertHandler, confidence int, timeout abi.ChainEpoch) (triggerID, error) {
e.lk.Lock()
defer e.lk.Unlock()
// Check if the event has already occurred
ts := e.tsc.best()
done, more, err := check(ts)
if err != nil {
return 0, xerrors.Errorf("called check error (h: %d): %w", ts.Height(), err)
}
if done {
timeout = NoTimeout
}
// Create a trigger for the event
id := e.ctr
e.ctr++
e.triggers[id] = &handlerInfo{
confidence: confidence,
timeout: timeout + abi.ChainEpoch(confidence),
disabled: !more,
handle: hnd,
revert: rev,
}
// If there's a timeout, set up a timeout check at that height
if timeout != NoTimeout {
if e.timeouts[timeout+abi.ChainEpoch(confidence)] == nil {
e.timeouts[timeout+abi.ChainEpoch(confidence)] = map[uint64]int{}
}
e.timeouts[timeout+abi.ChainEpoch(confidence)][id] = 0
}
return id, nil
}
// headChangeAPI is used to allow the composed event APIs to call back to hcEvents
// to listen for changes
type headChangeAPI interface {
onHeadChanged(check CheckFunc, hnd EventHandler, rev RevertHandler, confidence int, timeout abi.ChainEpoch) (triggerID, error)
}
// watcherEvents watches for a state change
type watcherEvents struct {
ctx context.Context
cs eventAPI
hcAPI headChangeAPI
lk sync.RWMutex
matchers map[triggerID]StateMatchFunc
}
func newWatcherEvents(ctx context.Context, hcAPI headChangeAPI, cs eventAPI) watcherEvents {
return watcherEvents{
ctx: ctx,
cs: cs,
hcAPI: hcAPI,
matchers: make(map[triggerID]StateMatchFunc),
}
}
// Run each of the matchers against the previous and current state to see if
// there's a change
func (we *watcherEvents) checkStateChanges(oldState, newState *types.TipSet) map[triggerID]eventData {
we.lk.RLock()
defer we.lk.RUnlock()
res := make(map[triggerID]eventData)
for tid, matchFn := range we.matchers {
ok, data, err := matchFn(oldState, newState)
if err != nil {
log.Errorf("event diff fn failed: %s", err)
continue
}
if ok {
res[tid] = data
}
}
return res
}
// StateChange represents a change in state
type StateChange interface{}
// StateChangeHandler arguments:
// `oldTs` is the state "from" tipset
// `newTs` is the state "to" tipset
// `states` is the change in state
// `curH`-`ts.Height` = `confidence`
type StateChangeHandler func(oldTs, newTs *types.TipSet, states StateChange, curH abi.ChainEpoch) (more bool, err error)
type StateMatchFunc func(oldTs, newTs *types.TipSet) (bool, StateChange, error)
// StateChanged registers a callback which is triggered when a specified state
// change occurs or a timeout is reached.
//
// * `CheckFunc` callback is invoked immediately with a recent tipset, it
// returns two booleans - `done`, and `more`.
//
// * `done` should be true when some on-chain state change we are waiting
// for has happened. When `done` is set to true, timeout trigger is disabled.
//
// * `more` should be false when we don't want to receive new notifications
// through StateChangeHandler. Note that notifications may still be delivered to
// RevertHandler
//
// * `StateChangeHandler` is called when the specified state change was observed
// on-chain, and a confidence threshold was reached, or the specified `timeout`
// height was reached with no state change observed. When this callback is
// invoked on a timeout, `oldState` and `newState` are set to nil.
// This callback returns a boolean specifying whether further notifications
// should be sent, like `more` return param from `CheckFunc` above.
//
// * `RevertHandler` is called after apply handler, when we drop the tipset
// containing the message. The tipset passed as the argument is the tipset
// that is being dropped. Note that the event dropped may be re-applied
// in a different tipset in small amount of time.
//
// * `StateMatchFunc` is called against each tipset state. If there is a match,
// the state change is queued up until the confidence interval has elapsed (and
// `StateChangeHandler` is called)
func (we *watcherEvents) StateChanged(check CheckFunc, scHnd StateChangeHandler, rev RevertHandler, confidence int, timeout abi.ChainEpoch, mf StateMatchFunc) error {
hnd := func(data eventData, prevTs, ts *types.TipSet, height abi.ChainEpoch) (bool, error) {
states, ok := data.(StateChange)
if data != nil && !ok {
panic("expected StateChange")
}
return scHnd(prevTs, ts, states, height)
}
id, err := we.hcAPI.onHeadChanged(check, hnd, rev, confidence, timeout)
if err != nil {
return err
}
we.lk.Lock()
defer we.lk.Unlock()
we.matchers[id] = mf
return nil
}
// messageEvents watches for message calls to actors
type messageEvents struct {
ctx context.Context
cs eventAPI
hcAPI headChangeAPI
lk sync.RWMutex
matchers map[triggerID][]MsgMatchFunc
}
func newMessageEvents(ctx context.Context, hcAPI headChangeAPI, cs eventAPI) messageEvents {
return messageEvents{
ctx: ctx,
cs: cs,
hcAPI: hcAPI,
matchers: map[triggerID][]MsgMatchFunc{},
}
}
// Check if there are any new actor calls
func (me *messageEvents) checkNewCalls(ts *types.TipSet) (map[triggerID]eventData, error) {
pts, err := me.cs.ChainGetTipSet(me.ctx, ts.Parents()) // we actually care about messages in the parent tipset here
if err != nil {
log.Errorf("getting parent tipset in checkNewCalls: %s", err)
return nil, err
}
me.lk.RLock()
defer me.lk.RUnlock()
res := make(map[triggerID]eventData)
me.messagesForTs(pts, func(msg *types.Message) {
// TODO: provide receipts
for tid, matchFns := range me.matchers {
var matched bool
for _, matchFn := range matchFns {
ok, err := matchFn(msg)
if err != nil {
log.Errorf("event matcher failed: %s", err)
continue
}
matched = ok
if matched {
break
}
}
if matched {
res[tid] = msg
break
}
}
})
return res, nil
}
// Get the messages in a tipset
func (me *messageEvents) messagesForTs(ts *types.TipSet, consume func(*types.Message)) {
seen := map[cid.Cid]struct{}{}
for _, tsb := range ts.Blocks() {
msgs, err := e.cs.ChainGetBlockMessages(context.TODO(), tsb.Cid())
msgs, err := me.cs.ChainGetBlockMessages(context.TODO(), tsb.Cid())
if err != nil {
log.Errorf("messagesForTs MessagesForBlock failed (ts.H=%d, Bcid:%s, B.Mcid:%s): %s", ts.Height(), tsb.Cid(), tsb.Messages, err)
// this is quite bad, but probably better than missing all the other updates
@@ -280,20 +543,27 @@ func (e *calledEvents) messagesForTs(ts *types.TipSet, consume func(*types.Messa
}
}
// Called registers a callbacks which are triggered when a specified method is
// MsgHandler arguments:
// `ts` is the tipset, in which the `msg` is included.
// `curH`-`ts.Height` = `confidence`
type MsgHandler func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (more bool, err error)
type MsgMatchFunc func(msg *types.Message) (bool, error)
// Called registers a callback which is triggered when a specified method is
// called on an actor, or a timeout is reached.
//
// * `CheckFunc` callback is invoked immediately with a recent tipset, it
// returns two booleans - `done`, and `more`.
//
// * `done` should be true when some on-chain action we are waiting for has
// happened. When `done` is set to true, timeout trigger is disabled.
// * `done` should be true when some on-chain action we are waiting for has
// happened. When `done` is set to true, timeout trigger is disabled.
//
// * `more` should be false when we don't want to receive new notifications
// through CalledHandler. Note that notifications may still be delivered to
// RevertHandler
// * `more` should be false when we don't want to receive new notifications
// through MsgHandler. Note that notifications may still be delivered to
// RevertHandler
//
// * `CalledHandler` is called when the specified event was observed on-chain,
// * `MsgHandler` is called when the specified event was observed on-chain,
// and a confidence threshold was reached, or the specified `timeout` height
// was reached with no events observed. When this callback is invoked on a
// timeout, `msg` is set to nil. This callback returns a boolean specifying
@@ -304,44 +574,38 @@ func (e *calledEvents) messagesForTs(ts *types.TipSet, consume func(*types.Messa
// containing the message. The tipset passed as the argument is the tipset
// that is being dropped. Note that the message dropped may be re-applied
// in a different tipset in small amount of time.
func (e *calledEvents) Called(check CheckFunc, hnd CalledHandler, rev RevertHandler, confidence int, timeout uint64, mf MatchFunc) error {
e.lk.Lock()
defer e.lk.Unlock()
ts := e.tsc.best()
done, more, err := check(ts)
if err != nil {
return xerrors.Errorf("called check error (h: %d): %w", ts.Height(), err)
}
if done {
timeout = NoTimeout
}
id := e.ctr
e.ctr++
e.triggers[id] = &callHandler{
confidence: confidence,
timeout: timeout + uint64(confidence),
disabled: !more,
handle: hnd,
revert: rev,
}
e.matchers[id] = append(e.matchers[id], mf)
if timeout != NoTimeout {
if e.timeouts[timeout+uint64(confidence)] == nil {
e.timeouts[timeout+uint64(confidence)] = map[uint64]int{}
//
// * `MsgMatchFunc` is called against each message. If there is a match, the
// message is queued up until the confidence interval has elapsed (and
// `MsgHandler` is called)
func (me *messageEvents) Called(check CheckFunc, msgHnd MsgHandler, rev RevertHandler, confidence int, timeout abi.ChainEpoch, mf MsgMatchFunc) error {
hnd := func(data eventData, prevTs, ts *types.TipSet, height abi.ChainEpoch) (bool, error) {
msg, ok := data.(*types.Message)
if data != nil && !ok {
panic("expected msg")
}
e.timeouts[timeout+uint64(confidence)][id] = 0
rec, err := me.cs.StateGetReceipt(me.ctx, msg.Cid(), ts.Key())
if err != nil {
return false, err
}
return msgHnd(msg, rec, ts, height)
}
id, err := me.hcAPI.onHeadChanged(check, hnd, rev, confidence, timeout)
if err != nil {
return err
}
me.lk.Lock()
defer me.lk.Unlock()
me.matchers[id] = append(me.matchers[id], mf)
return nil
}
func (e *calledEvents) CalledMsg(ctx context.Context, hnd CalledHandler, rev RevertHandler, confidence int, timeout uint64, msg store.ChainMsg) error {
return e.Called(e.CheckMsg(ctx, msg, hnd), hnd, rev, confidence, timeout, e.MatchMsg(msg.VMMessage()))
// Convenience function for checking and matching messages
func (me *messageEvents) CalledMsg(ctx context.Context, hnd MsgHandler, rev RevertHandler, confidence int, timeout abi.ChainEpoch, msg types.ChainMsg) error {
return me.Called(me.CheckMsg(ctx, msg, hnd), hnd, rev, confidence, timeout, me.MatchMsg(msg.VMMessage()))
}
+25 -16
View File
@@ -4,6 +4,7 @@ import (
"context"
"sync"
"github.com/filecoin-project/specs-actors/actors/abi"
"go.opencensus.io/trace"
"github.com/filecoin-project/lotus/chain/types"
@@ -12,34 +13,40 @@ import (
type heightEvents struct {
lk sync.Mutex
tsc *tipSetCache
gcConfidence uint64
gcConfidence abi.ChainEpoch
ctr triggerId
ctr triggerID
heightTriggers map[triggerId]*heightHandler
heightTriggers map[triggerID]*heightHandler
htTriggerHeights map[triggerH][]triggerId
htHeights map[msgH][]triggerId
htTriggerHeights map[triggerH][]triggerID
htHeights map[msgH][]triggerID
ctx context.Context
}
func (e *heightEvents) headChangeAt(rev, app []*types.TipSet) error {
ctx, span := trace.StartSpan(e.ctx, "events.HeightHeadChange")
defer span.End()
span.AddAttributes(trace.Int64Attribute("endHeight", int64(app[0].Height())))
span.AddAttributes(trace.Int64Attribute("reverts", int64(len(rev))))
span.AddAttributes(trace.Int64Attribute("applies", int64(len(app))))
e.lk.Lock()
defer e.lk.Unlock()
for _, ts := range rev {
// TODO: log error if h below gcconfidence
// revert height-based triggers
revert := func(h uint64, ts *types.TipSet) {
revert := func(h abi.ChainEpoch, ts *types.TipSet) {
for _, tid := range e.htHeights[h] {
ctx, span := trace.StartSpan(ctx, "events.HeightRevert")
err := e.heightTriggers[tid].revert(ctx, ts)
rev := e.heightTriggers[tid].revert
e.lk.Unlock()
err := rev(ctx, ts)
e.lk.Lock()
e.heightTriggers[tid].called = false
span.End()
@@ -80,15 +87,14 @@ func (e *heightEvents) headChangeAt(rev, app []*types.TipSet) error {
// height triggers
apply := func(h uint64, ts *types.TipSet) error {
apply := func(h abi.ChainEpoch, ts *types.TipSet) error {
for _, tid := range e.htTriggerHeights[h] {
hnd := e.heightTriggers[tid]
if hnd.called {
return nil
}
hnd.called = true
triggerH := h - uint64(hnd.confidence)
triggerH := h - abi.ChainEpoch(hnd.confidence)
incTs, err := e.tsc.getNonNull(triggerH)
if err != nil {
@@ -97,8 +103,11 @@ func (e *heightEvents) headChangeAt(rev, app []*types.TipSet) error {
ctx, span := trace.StartSpan(ctx, "events.HeightApply")
span.AddAttributes(trace.BoolAttribute("immediate", false))
err = hnd.handle(ctx, incTs, h)
handle := hnd.handle
e.lk.Unlock()
err = handle(ctx, incTs, h)
e.lk.Lock()
hnd.called = true
span.End()
if err != nil {
@@ -139,13 +148,13 @@ func (e *heightEvents) headChangeAt(rev, app []*types.TipSet) error {
// specified height, `RevertHandler` will be called.
//
// ts passed to handlers is the tipset at the specified, or above, if lower tipsets were null
func (e *heightEvents) ChainAt(hnd HeightHandler, rev RevertHandler, confidence int, h uint64) error {
func (e *heightEvents) ChainAt(hnd HeightHandler, rev RevertHandler, confidence int, h abi.ChainEpoch) error {
e.lk.Lock() // Tricky locking, check your locks if you modify this function!
bestH := e.tsc.best().Height()
if bestH >= h+uint64(confidence) {
if bestH >= h+abi.ChainEpoch(confidence) {
ts, err := e.tsc.getNonNull(h)
if err != nil {
log.Warnf("events.ChainAt: calling HandleFunc with nil tipset, not found in cache: %s", err)
@@ -168,11 +177,11 @@ func (e *heightEvents) ChainAt(hnd HeightHandler, rev RevertHandler, confidence
defer e.lk.Unlock()
if bestH >= h+uint64(confidence)+e.gcConfidence {
if bestH >= h+abi.ChainEpoch(confidence)+e.gcConfidence {
return nil
}
triggerAt := h + uint64(confidence)
triggerAt := h + abi.ChainEpoch(confidence)
id := e.ctr
e.ctr++
+503 -72
View File
@@ -3,18 +3,20 @@ package events
import (
"context"
"fmt"
"sync"
"testing"
"time"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/store"
"github.com/ipfs/go-cid"
"github.com/multiformats/go-multihash"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -31,15 +33,23 @@ type fakeMsg struct {
type fakeCS struct {
t *testing.T
h uint64
h abi.ChainEpoch
tsc *tipSetCache
msgs map[cid.Cid]fakeMsg
blkMsgs map[cid.Cid]cid.Cid
sync sync.Mutex
tipsets map[types.TipSetKey]*types.TipSet
sub func(rev, app []*types.TipSet)
}
func (fcs *fakeCS) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) {
return fcs.tipsets[key], nil
}
func (fcs *fakeCS) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) {
return nil, nil
}
@@ -48,11 +58,11 @@ func (fcs *fakeCS) StateGetActor(ctx context.Context, actor address.Address, tsk
panic("Not Implemented")
}
func (fcs *fakeCS) ChainGetTipSetByHeight(context.Context, uint64, types.TipSetKey) (*types.TipSet, error) {
func (fcs *fakeCS) ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) {
panic("Not Implemented")
}
func makeTs(t *testing.T, h uint64, msgcid cid.Cid) *types.TipSet {
func (fcs *fakeCS) makeTs(t *testing.T, parents []cid.Cid, h abi.ChainEpoch, msgcid cid.Cid) *types.TipSet {
a, _ := address.NewFromString("t00")
b, _ := address.NewFromString("t02")
var ts, err = types.NewTipSet([]*types.BlockHeader{
@@ -60,50 +70,59 @@ func makeTs(t *testing.T, h uint64, msgcid cid.Cid) *types.TipSet {
Height: h,
Miner: a,
Parents: parents,
Ticket: &types.Ticket{VRFProof: []byte{byte(h % 2)}},
ParentStateRoot: dummyCid,
Messages: msgcid,
ParentMessageReceipts: dummyCid,
BlockSig: &types.Signature{Type: types.KTBLS},
BLSAggregate: types.Signature{Type: types.KTBLS},
BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS},
BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS},
},
{
Height: h,
Miner: b,
Parents: parents,
Ticket: &types.Ticket{VRFProof: []byte{byte((h + 1) % 2)}},
ParentStateRoot: dummyCid,
Messages: msgcid,
ParentMessageReceipts: dummyCid,
BlockSig: &types.Signature{Type: types.KTBLS},
BLSAggregate: types.Signature{Type: types.KTBLS},
BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS},
BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS},
},
})
if fcs.tipsets == nil {
fcs.tipsets = map[types.TipSetKey]*types.TipSet{}
}
fcs.tipsets[ts.Key()] = ts
require.NoError(t, err)
return ts
}
func (fcs *fakeCS) ChainNotify(context.Context) (<-chan []*store.HeadChange, error) {
out := make(chan []*store.HeadChange, 1)
out <- []*store.HeadChange{{Type: store.HCCurrent, Val: fcs.tsc.best()}}
func (fcs *fakeCS) ChainNotify(context.Context) (<-chan []*api.HeadChange, error) {
out := make(chan []*api.HeadChange, 1)
out <- []*api.HeadChange{{Type: store.HCCurrent, Val: fcs.tsc.best()}}
fcs.sub = func(rev, app []*types.TipSet) {
notif := make([]*store.HeadChange, len(rev)+len(app))
notif := make([]*api.HeadChange, len(rev)+len(app))
for i, r := range rev {
notif[i] = &store.HeadChange{
notif[i] = &api.HeadChange{
Type: store.HCRevert,
Val: r,
}
}
for i, r := range app {
notif[i+len(rev)] = &store.HeadChange{
notif[i+len(rev)] = &api.HeadChange{
Type: store.HCApply,
Val: r,
}
@@ -177,7 +196,7 @@ func (fcs *fakeCS) advance(rev, app int, msgs map[int]cid.Cid, nulls ...int) { /
continue
}
ts := makeTs(fcs.t, fcs.h, mc)
ts := fcs.makeTs(fcs.t, fcs.tsc.best().Key().Cids(), fcs.h, mc)
require.NoError(fcs.t, fcs.tsc.add(ts))
if hasMsgs {
@@ -187,11 +206,19 @@ func (fcs *fakeCS) advance(rev, app int, msgs map[int]cid.Cid, nulls ...int) { /
apps = append(apps, ts)
}
fcs.sync.Lock()
fcs.sub(revs, apps)
time.Sleep(100 * time.Millisecond) // TODO: :c
fcs.sync.Lock()
fcs.sync.Unlock() //nolint:staticcheck
}
var _ eventApi = &fakeCS{}
func (fcs *fakeCS) notifDone() {
fcs.sync.Unlock()
}
var _ eventAPI = &fakeCS{}
func TestAt(t *testing.T) {
fcs := &fakeCS{
@@ -199,14 +226,14 @@ func TestAt(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 5, int(ts.Height()))
require.Equal(t, 8, int(curH))
applied = true
@@ -264,14 +291,14 @@ func TestAtDoubleTrigger(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 5, int(ts.Height()))
require.Equal(t, 8, int(curH))
applied = true
@@ -306,15 +333,15 @@ func TestAtNullTrigger(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
require.Equal(t, uint64(6), ts.Height())
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, abi.ChainEpoch(6), ts.Height())
require.Equal(t, 8, int(curH))
applied = true
return nil
@@ -340,14 +367,14 @@ func TestAtNullConf(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 5, int(ts.Height()))
require.Equal(t, 8, int(curH))
applied = true
@@ -379,7 +406,7 @@ func TestAtStart(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -388,7 +415,7 @@ func TestAtStart(t *testing.T) {
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 5, int(ts.Height()))
require.Equal(t, 8, int(curH))
applied = true
@@ -413,7 +440,7 @@ func TestAtStartConfidence(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -422,7 +449,7 @@ func TestAtStartConfidence(t *testing.T) {
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 5, int(ts.Height()))
require.Equal(t, 11, int(curH))
applied = true
@@ -443,15 +470,15 @@ func TestAtChained(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
return events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
return events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 10, int(ts.Height()))
applied = true
return nil
@@ -477,7 +504,7 @@ func TestAtChainedConfidence(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -486,8 +513,8 @@ func TestAtChainedConfidence(t *testing.T) {
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
return events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
return events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
require.Equal(t, 10, int(ts.Height()))
applied = true
return nil
@@ -511,7 +538,7 @@ func TestAtChainedConfidenceNull(t *testing.T) {
h: 1,
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -520,7 +547,7 @@ func TestAtChainedConfidenceNull(t *testing.T) {
var applied bool
var reverted bool
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH uint64) error {
err := events.ChainAt(func(_ context.Context, ts *types.TipSet, curH abi.ChainEpoch) error {
applied = true
require.Equal(t, 6, int(ts.Height()))
return nil
@@ -534,7 +561,7 @@ func TestAtChainedConfidenceNull(t *testing.T) {
require.Equal(t, false, reverted)
}
func matchAddrMethod(to address.Address, m uint64) func(msg *types.Message) (bool, error) {
func matchAddrMethod(to address.Address, m abi.MethodNum) func(msg *types.Message) (bool, error) {
return func(msg *types.Message) (bool, error) {
return to == msg.To && m == msg.Method, nil
}
@@ -549,7 +576,7 @@ func TestCalled(t *testing.T) {
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -560,11 +587,11 @@ func TestCalled(t *testing.T) {
var applied, reverted bool
var appliedMsg *types.Message
var appliedTs *types.TipSet
var appliedH uint64
var appliedH abi.ChainEpoch
err = events.Called(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH uint64) (bool, error) {
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (bool, error) {
require.Equal(t, false, applied)
applied = true
appliedMsg = msg
@@ -610,12 +637,12 @@ func TestCalled(t *testing.T) {
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
require.Equal(t, uint64(7), appliedTs.Height())
require.Equal(t, abi.ChainEpoch(7), appliedTs.Height())
require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String())
require.Equal(t, uint64(10), appliedH)
require.Equal(t, abi.ChainEpoch(10), appliedH)
require.Equal(t, t0123, appliedMsg.To)
require.Equal(t, uint64(1), appliedMsg.Nonce)
require.Equal(t, uint64(5), appliedMsg.Method)
require.Equal(t, abi.MethodNum(5), appliedMsg.Method)
// revert some blocks, keep the message
@@ -625,7 +652,7 @@ func TestCalled(t *testing.T) {
// revert the message
fcs.advance(2, 1, nil) // H=7, we reverted ts with the msg
fcs.advance(2, 1, nil) // H=7, we reverted ts with the msg execution, but not the msg itself
require.Equal(t, false, applied)
require.Equal(t, true, reverted)
@@ -639,24 +666,31 @@ func TestCalled(t *testing.T) {
},
})
fcs.advance(0, 5, map[int]cid.Cid{ // (confidence=3)
fcs.advance(0, 3, map[int]cid.Cid{ // (n2msg confidence=1)
0: n2msg,
})
require.Equal(t, true, applied) // msg from H=7, which had reverted execution
require.Equal(t, false, reverted)
require.Equal(t, abi.ChainEpoch(10), appliedH)
applied = false
fcs.advance(0, 2, nil) // (confidence=3)
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
applied = false
require.Equal(t, uint64(9), appliedTs.Height())
require.Equal(t, abi.ChainEpoch(9), appliedTs.Height())
require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String())
require.Equal(t, uint64(12), appliedH)
require.Equal(t, abi.ChainEpoch(12), appliedH)
require.Equal(t, t0123, appliedMsg.To)
require.Equal(t, uint64(2), appliedMsg.Nonce)
require.Equal(t, uint64(5), appliedMsg.Method)
require.Equal(t, abi.MethodNum(5), appliedMsg.Method)
// revert and apply at different height
fcs.advance(4, 6, map[int]cid.Cid{ // (confidence=3)
fcs.advance(8, 6, map[int]cid.Cid{ // (confidence=3)
1: n2msg,
})
@@ -668,12 +702,12 @@ func TestCalled(t *testing.T) {
reverted = false
applied = false
require.Equal(t, uint64(11), appliedTs.Height())
require.Equal(t, abi.ChainEpoch(7), appliedTs.Height())
require.Equal(t, "bafkqaaa", appliedTs.Blocks()[0].Messages.String())
require.Equal(t, uint64(14), appliedH)
require.Equal(t, abi.ChainEpoch(10), appliedH)
require.Equal(t, t0123, appliedMsg.To)
require.Equal(t, uint64(2), appliedMsg.Nonce)
require.Equal(t, uint64(5), appliedMsg.Method)
require.Equal(t, abi.MethodNum(5), appliedMsg.Method)
// call method again
@@ -694,7 +728,7 @@ func TestCalled(t *testing.T) {
}),
})
fcs.advance(1, 4, nil) // H=19, but message reverted
fcs.advance(2, 5, nil) // H=19, but message reverted
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
@@ -754,7 +788,7 @@ func TestCalledTimeout(t *testing.T) {
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -765,11 +799,11 @@ func TestCalledTimeout(t *testing.T) {
err = events.Called(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH uint64) (bool, error) {
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (bool, error) {
called = true
require.Nil(t, msg)
require.Equal(t, uint64(20), ts.Height())
require.Equal(t, uint64(23), curH)
require.Equal(t, abi.ChainEpoch(20), ts.Height())
require.Equal(t, abi.ChainEpoch(23), curH)
return false, nil
}, func(_ context.Context, ts *types.TipSet) error {
t.Fatal("revert on timeout")
@@ -794,17 +828,17 @@ func TestCalledTimeout(t *testing.T) {
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events = NewEvents(context.Background(), fcs)
err = events.Called(func(ts *types.TipSet) (d bool, m bool, e error) {
return true, true, nil
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH uint64) (bool, error) {
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (bool, error) {
called = true
require.Nil(t, msg)
require.Equal(t, uint64(20), ts.Height())
require.Equal(t, uint64(23), curH)
require.Equal(t, abi.ChainEpoch(20), ts.Height())
require.Equal(t, abi.ChainEpoch(23), curH)
return false, nil
}, func(_ context.Context, ts *types.TipSet) error {
t.Fatal("revert on timeout")
@@ -828,7 +862,7 @@ func TestCalledOrder(t *testing.T) {
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(makeTs(t, 1, dummyCid)))
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
@@ -839,14 +873,14 @@ func TestCalledOrder(t *testing.T) {
err = events.Called(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH uint64) (bool, error) {
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (bool, error) {
switch at {
case 0:
require.Equal(t, uint64(1), msg.Nonce)
require.Equal(t, uint64(4), ts.Height())
require.Equal(t, abi.ChainEpoch(4), ts.Height())
case 1:
require.Equal(t, uint64(2), msg.Nonce)
require.Equal(t, uint64(5), ts.Height())
require.Equal(t, abi.ChainEpoch(5), ts.Height())
default:
t.Fatal("apply should only get called twice, at: ", at)
}
@@ -855,9 +889,9 @@ func TestCalledOrder(t *testing.T) {
}, func(_ context.Context, ts *types.TipSet) error {
switch at {
case 2:
require.Equal(t, uint64(5), ts.Height())
require.Equal(t, abi.ChainEpoch(5), ts.Height())
case 3:
require.Equal(t, uint64(4), ts.Height())
require.Equal(t, abi.ChainEpoch(4), ts.Height())
default:
t.Fatal("revert should only get called twice, at: ", at)
}
@@ -881,3 +915,400 @@ func TestCalledOrder(t *testing.T) {
fcs.advance(9, 1, nil)
}
func TestCalledNull(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
msgs: map[cid.Cid]fakeMsg{},
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
t0123, err := address.NewFromString("t0123")
require.NoError(t, err)
more := true
var applied, reverted bool
err = events.Called(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (bool, error) {
require.Equal(t, false, applied)
applied = true
return more, nil
}, func(_ context.Context, ts *types.TipSet) error {
reverted = true
return nil
}, 3, 20, matchAddrMethod(t0123, 5))
require.NoError(t, err)
// create few blocks to make sure nothing get's randomly called
fcs.advance(0, 4, nil) // H=5
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create blocks with message (but below confidence threshold)
fcs.advance(0, 3, map[int]cid.Cid{ // msg at H=6; H=8 (confidence=2)
0: fcs.fakeMsgs(fakeMsg{
bmsgs: []*types.Message{
{To: t0123, From: t0123, Method: 5, Nonce: 1},
},
}),
})
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create additional blocks so we are above confidence threshold, but with null tipset at the height
// of application
fcs.advance(0, 3, nil, 10) // H=11 (confidence=3, apply)
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
applied = false
fcs.advance(5, 1, nil, 10)
require.Equal(t, false, applied)
require.Equal(t, true, reverted)
}
func TestRemoveTriggersOnMessage(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
msgs: map[cid.Cid]fakeMsg{},
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
t0123, err := address.NewFromString("t0123")
require.NoError(t, err)
more := true
var applied, reverted bool
err = events.Called(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(msg *types.Message, rec *types.MessageReceipt, ts *types.TipSet, curH abi.ChainEpoch) (bool, error) {
require.Equal(t, false, applied)
applied = true
return more, nil
}, func(_ context.Context, ts *types.TipSet) error {
reverted = true
return nil
}, 3, 20, matchAddrMethod(t0123, 5))
require.NoError(t, err)
// create few blocks to make sure nothing get's randomly called
fcs.advance(0, 4, nil) // H=5
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create blocks with message (but below confidence threshold)
fcs.advance(0, 3, map[int]cid.Cid{ // msg occurs at H=5, applied at H=6; H=8 (confidence=2)
0: fcs.fakeMsgs(fakeMsg{
bmsgs: []*types.Message{
{To: t0123, From: t0123, Method: 5, Nonce: 1},
},
}),
})
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// revert applied TS & message TS
fcs.advance(3, 1, nil) // H=6 (tipset message applied in reverted, AND message reverted)
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create additional blocks so we are above confidence threshold, but message not applied
// as it was reverted
fcs.advance(0, 5, nil) // H=11 (confidence=3, apply)
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create blocks with message again (but below confidence threshold)
fcs.advance(0, 3, map[int]cid.Cid{ // msg occurs at H=12, applied at H=13; H=15 (confidence=2)
0: fcs.fakeMsgs(fakeMsg{
bmsgs: []*types.Message{
{To: t0123, From: t0123, Method: 5, Nonce: 2},
},
}),
})
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// revert applied height TS, but don't remove message trigger
fcs.advance(2, 1, nil) // H=13 (tipset message applied in reverted, by tipset with message not reverted)
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create additional blocks so we are above confidence threshold
fcs.advance(0, 4, nil) // H=18 (confidence=3, apply)
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
}
type testStateChange struct {
from string
to string
}
func TestStateChanged(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
msgs: map[cid.Cid]fakeMsg{},
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
more := true
var applied, reverted bool
var appliedData StateChange
var appliedOldTs *types.TipSet
var appliedNewTs *types.TipSet
var appliedH abi.ChainEpoch
var matchData StateChange
confidence := 3
timeout := abi.ChainEpoch(20)
err := events.StateChanged(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(oldTs, newTs *types.TipSet, data StateChange, curH abi.ChainEpoch) (bool, error) {
require.Equal(t, false, applied)
applied = true
appliedData = data
appliedOldTs = oldTs
appliedNewTs = newTs
appliedH = curH
return more, nil
}, func(_ context.Context, ts *types.TipSet) error {
reverted = true
return nil
}, confidence, timeout, func(oldTs, newTs *types.TipSet) (bool, StateChange, error) {
if matchData == nil {
return false, matchData, nil
}
d := matchData
matchData = nil
return true, d, nil
})
require.NoError(t, err)
// create few blocks to make sure nothing get's randomly called
fcs.advance(0, 4, nil) // H=5
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create state change (but below confidence threshold)
matchData = testStateChange{from: "a", to: "b"}
fcs.advance(0, 3, nil)
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// create additional block so we are above confidence threshold
fcs.advance(0, 2, nil) // H=10 (confidence=3, apply)
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
applied = false
// dip below confidence (should not apply again)
fcs.advance(2, 2, nil) // H=10 (confidence=3, apply)
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// Change happens from 5 -> 6
require.Equal(t, abi.ChainEpoch(5), appliedOldTs.Height())
require.Equal(t, abi.ChainEpoch(6), appliedNewTs.Height())
// Actually applied (with confidence) at 9
require.Equal(t, abi.ChainEpoch(9), appliedH)
// Make sure the state change was correctly passed through
rcvd := appliedData.(testStateChange)
require.Equal(t, "a", rcvd.from)
require.Equal(t, "b", rcvd.to)
}
func TestStateChangedRevert(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
msgs: map[cid.Cid]fakeMsg{},
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
more := true
var applied, reverted bool
var matchData StateChange
confidence := 1
timeout := abi.ChainEpoch(20)
err := events.StateChanged(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(oldTs, newTs *types.TipSet, data StateChange, curH abi.ChainEpoch) (bool, error) {
require.Equal(t, false, applied)
applied = true
return more, nil
}, func(_ context.Context, ts *types.TipSet) error {
reverted = true
return nil
}, confidence, timeout, func(oldTs, newTs *types.TipSet) (bool, StateChange, error) {
if matchData == nil {
return false, matchData, nil
}
d := matchData
matchData = nil
return true, d, nil
})
require.NoError(t, err)
fcs.advance(0, 2, nil) // H=3
// Make a state change from TS at height 3 to TS at height 4
matchData = testStateChange{from: "a", to: "b"}
fcs.advance(0, 1, nil) // H=4
// Haven't yet reached confidence
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// Advance to reach confidence level
fcs.advance(0, 1, nil) // H=5
// Should now have called the handler
require.Equal(t, true, applied)
require.Equal(t, false, reverted)
applied = false
// Advance 3 more TS
fcs.advance(0, 3, nil) // H=8
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// Regress but not so far as to cause a revert
fcs.advance(3, 1, nil) // H=6
require.Equal(t, false, applied)
require.Equal(t, false, reverted)
// Regress back to state where change happened
fcs.advance(3, 1, nil) // H=4
// Expect revert to have happened
require.Equal(t, false, applied)
require.Equal(t, true, reverted)
}
func TestStateChangedTimeout(t *testing.T) {
fcs := &fakeCS{
t: t,
h: 1,
msgs: map[cid.Cid]fakeMsg{},
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events := NewEvents(context.Background(), fcs)
called := false
err := events.StateChanged(func(ts *types.TipSet) (d bool, m bool, e error) {
return false, true, nil
}, func(oldTs, newTs *types.TipSet, data StateChange, curH abi.ChainEpoch) (bool, error) {
called = true
require.Nil(t, data)
require.Equal(t, abi.ChainEpoch(20), newTs.Height())
require.Equal(t, abi.ChainEpoch(23), curH)
return false, nil
}, func(_ context.Context, ts *types.TipSet) error {
t.Fatal("revert on timeout")
return nil
}, 3, 20, func(oldTs, newTs *types.TipSet) (bool, StateChange, error) {
return false, nil, nil
})
require.NoError(t, err)
fcs.advance(0, 21, nil)
require.False(t, called)
fcs.advance(0, 5, nil)
require.True(t, called)
called = false
// with check func reporting done
fcs = &fakeCS{
t: t,
h: 1,
msgs: map[cid.Cid]fakeMsg{},
blkMsgs: map[cid.Cid]cid.Cid{},
tsc: newTSCache(2*build.ForkLengthThreshold, nil),
}
require.NoError(t, fcs.tsc.add(fcs.makeTs(t, nil, 1, dummyCid)))
events = NewEvents(context.Background(), fcs)
err = events.StateChanged(func(ts *types.TipSet) (d bool, m bool, e error) {
return true, true, nil
}, func(oldTs, newTs *types.TipSet, data StateChange, curH abi.ChainEpoch) (bool, error) {
called = true
require.Nil(t, data)
require.Equal(t, abi.ChainEpoch(20), newTs.Height())
require.Equal(t, abi.ChainEpoch(23), curH)
return false, nil
}, func(_ context.Context, ts *types.TipSet) error {
t.Fatal("revert on timeout")
return nil
}, 3, 20, func(oldTs, newTs *types.TipSet) (bool, StateChange, error) {
return false, nil, nil
})
require.NoError(t, err)
fcs.advance(0, 21, nil)
require.False(t, called)
fcs.advance(0, 5, nil)
require.False(t, called)
}
+25
View File
@@ -0,0 +1,25 @@
package state
import (
"context"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
)
type contextStore struct {
ctx context.Context
cst *cbor.BasicIpldStore
}
func (cs *contextStore) Context() context.Context {
return cs.ctx
}
func (cs *contextStore) Get(ctx context.Context, c cid.Cid, out interface{}) error {
return cs.cst.Get(ctx, c, out)
}
func (cs *contextStore) Put(ctx context.Context, v interface{}) (cid.Cid, error) {
return cs.cst.Put(ctx, v)
}
+106
View File
@@ -0,0 +1,106 @@
package state
import (
"github.com/filecoin-project/specs-actors/actors/util/adt"
typegen "github.com/whyrusleeping/cbor-gen"
)
// AdtArrayDiff generalizes adt.Array diffing by accepting a Deferred type that can unmarshalled to its corresponding struct
// in an interface implantation.
// Add should be called when a new k,v is added to the array
// Modify should be called when a value is modified in the array
// Remove should be called when a value is removed from the array
type AdtArrayDiff interface {
Add(key uint64, val *typegen.Deferred) error
Modify(key uint64, from, to *typegen.Deferred) error
Remove(key uint64, val *typegen.Deferred) error
}
// TODO Performance can be improved by diffing the underlying IPLD graph, e.g. https://github.com/ipfs/go-merkledag/blob/749fd8717d46b4f34c9ce08253070079c89bc56d/dagutils/diff.go#L104
// CBOR Marshaling will likely be the largest performance bottleneck here.
// DiffAdtArray accepts two *adt.Array's and an AdtArrayDiff implementation. It does the following:
// - All values that exist in preArr and not in curArr are passed to AdtArrayDiff.Remove()
// - All values that exist in curArr nnd not in prevArr are passed to adtArrayDiff.Add()
// - All values that exist in preArr and in curArr are passed to AdtArrayDiff.Modify()
// - It is the responsibility of AdtArrayDiff.Modify() to determine if the values it was passed have been modified.
func DiffAdtArray(preArr, curArr *adt.Array, out AdtArrayDiff) error {
prevVal := new(typegen.Deferred)
if err := preArr.ForEach(prevVal, func(i int64) error {
curVal := new(typegen.Deferred)
found, err := curArr.Get(uint64(i), curVal)
if err != nil {
return err
}
if !found {
if err := out.Remove(uint64(i), prevVal); err != nil {
return err
}
return nil
}
if err := out.Modify(uint64(i), prevVal, curVal); err != nil {
return err
}
return curArr.Delete(uint64(i))
}); err != nil {
return err
}
curVal := new(typegen.Deferred)
return curArr.ForEach(curVal, func(i int64) error {
return out.Add(uint64(i), curVal)
})
}
// TODO Performance can be improved by diffing the underlying IPLD graph, e.g. https://github.com/ipfs/go-merkledag/blob/749fd8717d46b4f34c9ce08253070079c89bc56d/dagutils/diff.go#L104
// CBOR Marshaling will likely be the largest performance bottleneck here.
// AdtMapDiff generalizes adt.Map diffing by accepting a Deferred type that can unmarshalled to its corresponding struct
// in an interface implantation.
// AsKey should return the Keyer implementation specific to the map
// Add should be called when a new k,v is added to the map
// Modify should be called when a value is modified in the map
// Remove should be called when a value is removed from the map
type AdtMapDiff interface {
AsKey(key string) (adt.Keyer, error)
Add(key string, val *typegen.Deferred) error
Modify(key string, from, to *typegen.Deferred) error
Remove(key string, val *typegen.Deferred) error
}
func DiffAdtMap(preMap, curMap *adt.Map, out AdtMapDiff) error {
prevVal := new(typegen.Deferred)
if err := preMap.ForEach(prevVal, func(key string) error {
curVal := new(typegen.Deferred)
k, err := out.AsKey(key)
if err != nil {
return err
}
found, err := curMap.Get(k, curVal)
if err != nil {
return err
}
if !found {
if err := out.Remove(key, prevVal); err != nil {
return err
}
return nil
}
if err := out.Modify(key, prevVal, curVal); err != nil {
return err
}
return curMap.Delete(k)
}); err != nil {
return err
}
curVal := new(typegen.Deferred)
return curMap.ForEach(curVal, func(key string) error {
return out.Add(key, curVal)
})
}
+155
View File
@@ -0,0 +1,155 @@
package state
import (
"bytes"
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
ds "github.com/ipfs/go-datastore"
ds_sync "github.com/ipfs/go-datastore/sync"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbornode "github.com/ipfs/go-ipld-cbor"
typegen "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/specs-actors/actors/runtime"
"github.com/filecoin-project/specs-actors/actors/util/adt"
)
func TestDiffAdtArray(t *testing.T) {
ctxstoreA := newContextStore()
ctxstoreB := newContextStore()
arrA := adt.MakeEmptyArray(ctxstoreA)
arrB := adt.MakeEmptyArray(ctxstoreB)
require.NoError(t, arrA.Set(0, runtime.CBORBytes([]byte{0}))) // delete
require.NoError(t, arrA.Set(1, runtime.CBORBytes([]byte{0}))) // modify
require.NoError(t, arrB.Set(1, runtime.CBORBytes([]byte{1})))
require.NoError(t, arrA.Set(2, runtime.CBORBytes([]byte{1}))) // delete
require.NoError(t, arrA.Set(3, runtime.CBORBytes([]byte{0}))) // noop
require.NoError(t, arrB.Set(3, runtime.CBORBytes([]byte{0})))
require.NoError(t, arrA.Set(4, runtime.CBORBytes([]byte{0}))) // modify
require.NoError(t, arrB.Set(4, runtime.CBORBytes([]byte{6})))
require.NoError(t, arrB.Set(5, runtime.CBORBytes{8})) // add
require.NoError(t, arrB.Set(6, runtime.CBORBytes{9})) // add
changes := new(TestAdtDiff)
assert.NoError(t, DiffAdtArray(arrA, arrB, changes))
assert.NotNil(t, changes)
assert.Equal(t, 2, len(changes.Added))
// keys 5 and 6 were added
assert.EqualValues(t, uint64(5), changes.Added[0].key)
assert.EqualValues(t, []byte{8}, changes.Added[0].val)
assert.EqualValues(t, uint64(6), changes.Added[1].key)
assert.EqualValues(t, []byte{9}, changes.Added[1].val)
assert.Equal(t, 2, len(changes.Modified))
// keys 1 and 4 were modified
assert.EqualValues(t, uint64(1), changes.Modified[0].From.key)
assert.EqualValues(t, []byte{0}, changes.Modified[0].From.val)
assert.EqualValues(t, uint64(1), changes.Modified[0].To.key)
assert.EqualValues(t, []byte{1}, changes.Modified[0].To.val)
assert.EqualValues(t, uint64(4), changes.Modified[1].From.key)
assert.EqualValues(t, []byte{0}, changes.Modified[1].From.val)
assert.EqualValues(t, uint64(4), changes.Modified[1].To.key)
assert.EqualValues(t, []byte{6}, changes.Modified[1].To.val)
assert.Equal(t, 2, len(changes.Removed))
// keys 0 and 2 were deleted
assert.EqualValues(t, uint64(0), changes.Removed[0].key)
assert.EqualValues(t, []byte{0}, changes.Removed[0].val)
assert.EqualValues(t, uint64(2), changes.Removed[1].key)
assert.EqualValues(t, []byte{1}, changes.Removed[1].val)
}
type adtDiffResult struct {
key uint64
val runtime.CBORBytes
}
type TestAdtDiff struct {
Added []adtDiffResult
Modified []TestAdtDiffModified
Removed []adtDiffResult
}
var _ AdtArrayDiff = &TestAdtDiff{}
type TestAdtDiffModified struct {
From adtDiffResult
To adtDiffResult
}
func (t *TestAdtDiff) Add(key uint64, val *typegen.Deferred) error {
v := new(runtime.CBORBytes)
err := v.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
t.Added = append(t.Added, adtDiffResult{
key: key,
val: *v,
})
return nil
}
func (t *TestAdtDiff) Modify(key uint64, from, to *typegen.Deferred) error {
vFrom := new(runtime.CBORBytes)
err := vFrom.UnmarshalCBOR(bytes.NewReader(from.Raw))
if err != nil {
return err
}
vTo := new(runtime.CBORBytes)
err = vTo.UnmarshalCBOR(bytes.NewReader(to.Raw))
if err != nil {
return err
}
if !bytes.Equal(*vFrom, *vTo) {
t.Modified = append(t.Modified, TestAdtDiffModified{
From: adtDiffResult{
key: key,
val: *vFrom,
},
To: adtDiffResult{
key: key,
val: *vTo,
},
})
}
return nil
}
func (t *TestAdtDiff) Remove(key uint64, val *typegen.Deferred) error {
v := new(runtime.CBORBytes)
err := v.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
t.Removed = append(t.Removed, adtDiffResult{
key: key,
val: *v,
})
return nil
}
func newContextStore() *contextStore {
ctx := context.Background()
bs := bstore.NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore()))
store := cbornode.NewCborStore(bs)
return &contextStore{
ctx: ctx,
cst: store,
}
}
+490
View File
@@ -0,0 +1,490 @@
package state
import (
"bytes"
"context"
"github.com/filecoin-project/go-address"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
typegen "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/market"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/util/adt"
"github.com/filecoin-project/lotus/api/apibstore"
"github.com/filecoin-project/lotus/chain/types"
)
// UserData is the data returned from the DiffTipSetKeyFunc
type UserData interface{}
// ChainAPI abstracts out calls made by this class to external APIs
type ChainAPI interface {
apibstore.ChainIO
StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error)
}
// StatePredicates has common predicates for responding to state changes
type StatePredicates struct {
api ChainAPI
cst *cbor.BasicIpldStore
}
func NewStatePredicates(api ChainAPI) *StatePredicates {
return &StatePredicates{
api: api,
cst: cbor.NewCborStore(apibstore.NewAPIBlockstore(api)),
}
}
// DiffTipSetKeyFunc check if there's a change form oldState to newState, and returns
// - changed: was there a change
// - user: user-defined data representing the state change
// - err
type DiffTipSetKeyFunc func(ctx context.Context, oldState, newState types.TipSetKey) (changed bool, user UserData, err error)
type DiffActorStateFunc func(ctx context.Context, oldActorStateHead, newActorStateHead cid.Cid) (changed bool, user UserData, err error)
// OnActorStateChanged calls diffStateFunc when the state changes for the given actor
func (sp *StatePredicates) OnActorStateChanged(addr address.Address, diffStateFunc DiffActorStateFunc) DiffTipSetKeyFunc {
return func(ctx context.Context, oldState, newState types.TipSetKey) (changed bool, user UserData, err error) {
oldActor, err := sp.api.StateGetActor(ctx, addr, oldState)
if err != nil {
return false, nil, err
}
newActor, err := sp.api.StateGetActor(ctx, addr, newState)
if err != nil {
return false, nil, err
}
if oldActor.Head.Equals(newActor.Head) {
return false, nil, nil
}
return diffStateFunc(ctx, oldActor.Head, newActor.Head)
}
}
type DiffStorageMarketStateFunc func(ctx context.Context, oldState *market.State, newState *market.State) (changed bool, user UserData, err error)
// OnStorageMarketActorChanged calls diffStorageMarketState when the state changes for the market actor
func (sp *StatePredicates) OnStorageMarketActorChanged(diffStorageMarketState DiffStorageMarketStateFunc) DiffTipSetKeyFunc {
return sp.OnActorStateChanged(builtin.StorageMarketActorAddr, func(ctx context.Context, oldActorStateHead, newActorStateHead cid.Cid) (changed bool, user UserData, err error) {
var oldState market.State
if err := sp.cst.Get(ctx, oldActorStateHead, &oldState); err != nil {
return false, nil, err
}
var newState market.State
if err := sp.cst.Get(ctx, newActorStateHead, &newState); err != nil {
return false, nil, err
}
return diffStorageMarketState(ctx, &oldState, &newState)
})
}
type DiffAdtArraysFunc func(ctx context.Context, oldDealStateRoot, newDealStateRoot *adt.Array) (changed bool, user UserData, err error)
// OnDealStateChanged calls diffDealStates when the market deal state changes
func (sp *StatePredicates) OnDealStateChanged(diffDealStates DiffAdtArraysFunc) DiffStorageMarketStateFunc {
return func(ctx context.Context, oldState *market.State, newState *market.State) (changed bool, user UserData, err error) {
if oldState.States.Equals(newState.States) {
return false, nil, nil
}
ctxStore := &contextStore{
ctx: ctx,
cst: sp.cst,
}
oldRoot, err := adt.AsArray(ctxStore, oldState.States)
if err != nil {
return false, nil, err
}
newRoot, err := adt.AsArray(ctxStore, newState.States)
if err != nil {
return false, nil, err
}
return diffDealStates(ctx, oldRoot, newRoot)
}
}
// OnDealProposalChanged calls diffDealProps when the market proposal state changes
func (sp *StatePredicates) OnDealProposalChanged(diffDealProps DiffAdtArraysFunc) DiffStorageMarketStateFunc {
return func(ctx context.Context, oldState *market.State, newState *market.State) (changed bool, user UserData, err error) {
if oldState.Proposals.Equals(newState.Proposals) {
return false, nil, nil
}
ctxStore := &contextStore{
ctx: ctx,
cst: sp.cst,
}
oldRoot, err := adt.AsArray(ctxStore, oldState.Proposals)
if err != nil {
return false, nil, err
}
newRoot, err := adt.AsArray(ctxStore, newState.Proposals)
if err != nil {
return false, nil, err
}
return diffDealProps(ctx, oldRoot, newRoot)
}
}
var _ AdtArrayDiff = &MarketDealProposalChanges{}
type MarketDealProposalChanges struct {
Added []ProposalIDState
Removed []ProposalIDState
}
type ProposalIDState struct {
ID abi.DealID
Proposal market.DealProposal
}
func (m *MarketDealProposalChanges) Add(key uint64, val *typegen.Deferred) error {
dp := new(market.DealProposal)
err := dp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Added = append(m.Added, ProposalIDState{abi.DealID(key), *dp})
return nil
}
func (m *MarketDealProposalChanges) Modify(key uint64, from, to *typegen.Deferred) error {
// short circuit, DealProposals are static
return nil
}
func (m *MarketDealProposalChanges) Remove(key uint64, val *typegen.Deferred) error {
dp := new(market.DealProposal)
err := dp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Removed = append(m.Removed, ProposalIDState{abi.DealID(key), *dp})
return nil
}
// OnDealProposalAmtChanged detects changes in the deal proposal AMT for all deal proposals and returns a MarketProposalsChanges structure containing:
// - Added Proposals
// - Modified Proposals
// - Removed Proposals
func (sp *StatePredicates) OnDealProposalAmtChanged() DiffAdtArraysFunc {
return func(ctx context.Context, oldDealProps, newDealProps *adt.Array) (changed bool, user UserData, err error) {
proposalChanges := new(MarketDealProposalChanges)
if err := DiffAdtArray(oldDealProps, newDealProps, proposalChanges); err != nil {
return false, nil, err
}
if len(proposalChanges.Added)+len(proposalChanges.Removed) == 0 {
return false, nil, nil
}
return true, proposalChanges, nil
}
}
var _ AdtArrayDiff = &MarketDealStateChanges{}
type MarketDealStateChanges struct {
Added []DealIDState
Modified []DealStateChange
Removed []DealIDState
}
type DealIDState struct {
ID abi.DealID
Deal market.DealState
}
func (m *MarketDealStateChanges) Add(key uint64, val *typegen.Deferred) error {
ds := new(market.DealState)
err := ds.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Added = append(m.Added, DealIDState{abi.DealID(key), *ds})
return nil
}
func (m *MarketDealStateChanges) Modify(key uint64, from, to *typegen.Deferred) error {
dsFrom := new(market.DealState)
if err := dsFrom.UnmarshalCBOR(bytes.NewReader(from.Raw)); err != nil {
return err
}
dsTo := new(market.DealState)
if err := dsTo.UnmarshalCBOR(bytes.NewReader(to.Raw)); err != nil {
return err
}
if *dsFrom != *dsTo {
m.Modified = append(m.Modified, DealStateChange{abi.DealID(key), dsFrom, dsTo})
}
return nil
}
func (m *MarketDealStateChanges) Remove(key uint64, val *typegen.Deferred) error {
ds := new(market.DealState)
err := ds.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Removed = append(m.Removed, DealIDState{abi.DealID(key), *ds})
return nil
}
// OnDealStateAmtChanged detects changes in the deal state AMT for all deal states and returns a MarketDealStateChanges structure containing:
// - Added Deals
// - Modified Deals
// - Removed Deals
func (sp *StatePredicates) OnDealStateAmtChanged() DiffAdtArraysFunc {
return func(ctx context.Context, oldDealStates, newDealStates *adt.Array) (changed bool, user UserData, err error) {
dealStateChanges := new(MarketDealStateChanges)
if err := DiffAdtArray(oldDealStates, newDealStates, dealStateChanges); err != nil {
return false, nil, err
}
if len(dealStateChanges.Added)+len(dealStateChanges.Modified)+len(dealStateChanges.Removed) == 0 {
return false, nil, nil
}
return true, dealStateChanges, nil
}
}
// ChangedDeals is a set of changes to deal state
type ChangedDeals map[abi.DealID]DealStateChange
// DealStateChange is a change in deal state from -> to
type DealStateChange struct {
ID abi.DealID
From *market.DealState
To *market.DealState
}
// DealStateChangedForIDs detects changes in the deal state AMT for the given deal IDs
func (sp *StatePredicates) DealStateChangedForIDs(dealIds []abi.DealID) DiffAdtArraysFunc {
return func(ctx context.Context, oldDealStateArray, newDealStateArray *adt.Array) (changed bool, user UserData, err error) {
changedDeals := make(ChangedDeals)
for _, dealID := range dealIds {
var oldDealPtr, newDealPtr *market.DealState
var oldDeal, newDeal market.DealState
_, err := oldDealStateArray.Get(uint64(dealID), &oldDeal)
if err != nil {
return false, nil, err
}
oldDealPtr = &oldDeal
_, err = newDealStateArray.Get(uint64(dealID), &newDeal)
if err != nil {
return false, nil, err
}
newDealPtr = &newDeal
if oldDeal != newDeal {
changedDeals[dealID] = DealStateChange{dealID, oldDealPtr, newDealPtr}
}
}
if len(changedDeals) > 0 {
return true, changedDeals, nil
}
return false, nil, nil
}
}
type DiffMinerActorStateFunc func(ctx context.Context, oldState *miner.State, newState *miner.State) (changed bool, user UserData, err error)
func (sp *StatePredicates) OnMinerActorChange(minerAddr address.Address, diffMinerActorState DiffMinerActorStateFunc) DiffTipSetKeyFunc {
return sp.OnActorStateChanged(minerAddr, func(ctx context.Context, oldActorStateHead, newActorStateHead cid.Cid) (changed bool, user UserData, err error) {
var oldState miner.State
if err := sp.cst.Get(ctx, oldActorStateHead, &oldState); err != nil {
return false, nil, err
}
var newState miner.State
if err := sp.cst.Get(ctx, newActorStateHead, &newState); err != nil {
return false, nil, err
}
return diffMinerActorState(ctx, &oldState, &newState)
})
}
type MinerSectorChanges struct {
Added []miner.SectorOnChainInfo
Extended []SectorExtensions
Removed []miner.SectorOnChainInfo
}
var _ AdtArrayDiff = &MinerSectorChanges{}
type SectorExtensions struct {
From miner.SectorOnChainInfo
To miner.SectorOnChainInfo
}
func (m *MinerSectorChanges) Add(key uint64, val *typegen.Deferred) error {
si := new(miner.SectorOnChainInfo)
err := si.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Added = append(m.Added, *si)
return nil
}
func (m *MinerSectorChanges) Modify(key uint64, from, to *typegen.Deferred) error {
siFrom := new(miner.SectorOnChainInfo)
err := siFrom.UnmarshalCBOR(bytes.NewReader(from.Raw))
if err != nil {
return err
}
siTo := new(miner.SectorOnChainInfo)
err = siTo.UnmarshalCBOR(bytes.NewReader(to.Raw))
if err != nil {
return err
}
if siFrom.Info.Expiration != siTo.Info.Expiration {
m.Extended = append(m.Extended, SectorExtensions{
From: *siFrom,
To: *siTo,
})
}
return nil
}
func (m *MinerSectorChanges) Remove(key uint64, val *typegen.Deferred) error {
si := new(miner.SectorOnChainInfo)
err := si.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Removed = append(m.Removed, *si)
return nil
}
func (sp *StatePredicates) OnMinerSectorChange() DiffMinerActorStateFunc {
return func(ctx context.Context, oldState, newState *miner.State) (changed bool, user UserData, err error) {
ctxStore := &contextStore{
ctx: ctx,
cst: sp.cst,
}
sectorChanges := &MinerSectorChanges{
Added: []miner.SectorOnChainInfo{},
Extended: []SectorExtensions{},
Removed: []miner.SectorOnChainInfo{},
}
// no sector changes
if oldState.Sectors.Equals(newState.Sectors) {
return false, nil, nil
}
oldSectors, err := adt.AsArray(ctxStore, oldState.Sectors)
if err != nil {
return false, nil, err
}
newSectors, err := adt.AsArray(ctxStore, newState.Sectors)
if err != nil {
return false, nil, err
}
if err := DiffAdtArray(oldSectors, newSectors, sectorChanges); err != nil {
return false, nil, err
}
// nothing changed
if len(sectorChanges.Added)+len(sectorChanges.Extended)+len(sectorChanges.Removed) == 0 {
return false, nil, nil
}
return true, sectorChanges, nil
}
}
type MinerPreCommitChanges struct {
Added []miner.SectorPreCommitOnChainInfo
Removed []miner.SectorPreCommitOnChainInfo
}
func (m *MinerPreCommitChanges) AsKey(key string) (adt.Keyer, error) {
sector, err := adt.ParseUIntKey(key)
if err != nil {
return nil, err
}
return miner.SectorKey(abi.SectorNumber(sector)), nil
}
func (m *MinerPreCommitChanges) Add(key string, val *typegen.Deferred) error {
sp := new(miner.SectorPreCommitOnChainInfo)
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Added = append(m.Added, *sp)
return nil
}
func (m *MinerPreCommitChanges) Modify(key string, from, to *typegen.Deferred) error {
return nil
}
func (m *MinerPreCommitChanges) Remove(key string, val *typegen.Deferred) error {
sp := new(miner.SectorPreCommitOnChainInfo)
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
return err
}
m.Removed = append(m.Removed, *sp)
return nil
}
func (sp *StatePredicates) OnMinerPreCommitChange() DiffMinerActorStateFunc {
return func(ctx context.Context, oldState, newState *miner.State) (changed bool, user UserData, err error) {
ctxStore := &contextStore{
ctx: ctx,
cst: sp.cst,
}
precommitChanges := &MinerPreCommitChanges{
Added: []miner.SectorPreCommitOnChainInfo{},
Removed: []miner.SectorPreCommitOnChainInfo{},
}
if oldState.PreCommittedSectors.Equals(newState.PreCommittedSectors) {
return false, nil, nil
}
oldPrecommits, err := adt.AsMap(ctxStore, oldState.PreCommittedSectors)
if err != nil {
return false, nil, err
}
newPrecommits, err := adt.AsMap(ctxStore, newState.PreCommittedSectors)
if err != nil {
return false, nil, err
}
if err := DiffAdtMap(oldPrecommits, newPrecommits, precommitChanges); err != nil {
return false, nil, err
}
if len(precommitChanges.Added)+len(precommitChanges.Removed) == 0 {
return false, nil, nil
}
return true, precommitChanges, nil
}
}
+483
View File
@@ -0,0 +1,483 @@
package state
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"golang.org/x/xerrors"
"github.com/ipfs/go-cid"
ds "github.com/ipfs/go-datastore"
ds_sync "github.com/ipfs/go-datastore/sync"
"github.com/ipfs/go-hamt-ipld"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbornode "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-amt-ipld/v2"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin/market"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/filecoin-project/specs-actors/actors/util/adt"
tutils "github.com/filecoin-project/specs-actors/support/testing"
"github.com/filecoin-project/lotus/chain/types"
)
var dummyCid cid.Cid
func init() {
dummyCid, _ = cid.Parse("bafkqaaa")
}
type mockAPI struct {
ts map[types.TipSetKey]*types.Actor
bs bstore.Blockstore
}
func newMockAPI(bs bstore.Blockstore) *mockAPI {
return &mockAPI{
bs: bs,
ts: make(map[types.TipSetKey]*types.Actor),
}
}
func (m mockAPI) ChainHasObj(ctx context.Context, c cid.Cid) (bool, error) {
return m.bs.Has(c)
}
func (m mockAPI) ChainReadObj(ctx context.Context, c cid.Cid) ([]byte, error) {
blk, err := m.bs.Get(c)
if err != nil {
return nil, xerrors.Errorf("blockstore get: %w", err)
}
return blk.RawData(), nil
}
func (m mockAPI) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) {
return m.ts[tsk], nil
}
func (m mockAPI) setActor(tsk types.TipSetKey, act *types.Actor) {
m.ts[tsk] = act
}
func TestMarketPredicates(t *testing.T) {
ctx := context.Background()
bs := bstore.NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore()))
store := cbornode.NewCborStore(bs)
oldDeal1 := &market.DealState{
SectorStartEpoch: 1,
LastUpdatedEpoch: 2,
SlashEpoch: 0,
}
oldDeal2 := &market.DealState{
SectorStartEpoch: 4,
LastUpdatedEpoch: 5,
SlashEpoch: 0,
}
oldDeals := map[abi.DealID]*market.DealState{
abi.DealID(1): oldDeal1,
abi.DealID(2): oldDeal2,
}
oldProp1 := &market.DealProposal{
PieceCID: dummyCid,
PieceSize: 0,
VerifiedDeal: false,
Client: tutils.NewIDAddr(t, 1),
Provider: tutils.NewIDAddr(t, 1),
StartEpoch: 1,
EndEpoch: 2,
StoragePricePerEpoch: big.Zero(),
ProviderCollateral: big.Zero(),
ClientCollateral: big.Zero(),
}
oldProp2 := &market.DealProposal{
PieceCID: dummyCid,
PieceSize: 0,
VerifiedDeal: false,
Client: tutils.NewIDAddr(t, 1),
Provider: tutils.NewIDAddr(t, 1),
StartEpoch: 2,
EndEpoch: 3,
StoragePricePerEpoch: big.Zero(),
ProviderCollateral: big.Zero(),
ClientCollateral: big.Zero(),
}
oldProps := map[abi.DealID]*market.DealProposal{
abi.DealID(1): oldProp1,
abi.DealID(2): oldProp2,
}
oldStateC := createMarketState(ctx, t, store, oldDeals, oldProps)
newDeal1 := &market.DealState{
SectorStartEpoch: 1,
LastUpdatedEpoch: 3,
SlashEpoch: 0,
}
newDeal2 := &market.DealState{
SectorStartEpoch: 4,
LastUpdatedEpoch: 6,
SlashEpoch: 6,
}
// added
newDeal3 := &market.DealState{
SectorStartEpoch: 1,
LastUpdatedEpoch: 2,
SlashEpoch: 3,
}
newDeals := map[abi.DealID]*market.DealState{
abi.DealID(1): newDeal1,
abi.DealID(2): newDeal2,
abi.DealID(3): newDeal3,
}
// added
newProp3 := &market.DealProposal{
PieceCID: dummyCid,
PieceSize: 0,
VerifiedDeal: false,
Client: tutils.NewIDAddr(t, 1),
Provider: tutils.NewIDAddr(t, 1),
StartEpoch: 4,
EndEpoch: 4,
StoragePricePerEpoch: big.Zero(),
ProviderCollateral: big.Zero(),
ClientCollateral: big.Zero(),
}
newProps := map[abi.DealID]*market.DealProposal{
abi.DealID(1): oldProp1, // 1 was persisted
// prop 2 was removed
abi.DealID(3): newProp3, // new
// NB: DealProposals cannot be modified, so don't test that case.
}
newStateC := createMarketState(ctx, t, store, newDeals, newProps)
minerAddr, err := address.NewFromString("t00")
require.NoError(t, err)
oldState, err := mockTipset(minerAddr, 1)
require.NoError(t, err)
newState, err := mockTipset(minerAddr, 2)
require.NoError(t, err)
api := newMockAPI(bs)
api.setActor(oldState.Key(), &types.Actor{Head: oldStateC})
api.setActor(newState.Key(), &types.Actor{Head: newStateC})
t.Run("deal ID predicate", func(t *testing.T) {
preds := NewStatePredicates(api)
dealIds := []abi.DealID{abi.DealID(1), abi.DealID(2)}
diffIDFn := preds.OnStorageMarketActorChanged(preds.OnDealStateChanged(preds.DealStateChangedForIDs(dealIds)))
// Diff a state against itself: expect no change
changed, _, err := diffIDFn(ctx, oldState.Key(), oldState.Key())
require.NoError(t, err)
require.False(t, changed)
// Diff old state against new state
changed, valIDs, err := diffIDFn(ctx, oldState.Key(), newState.Key())
require.NoError(t, err)
require.True(t, changed)
changedDealIDs, ok := valIDs.(ChangedDeals)
require.True(t, ok)
require.Len(t, changedDealIDs, 2)
require.Contains(t, changedDealIDs, abi.DealID(1))
require.Contains(t, changedDealIDs, abi.DealID(2))
deal1 := changedDealIDs[abi.DealID(1)]
if deal1.From.LastUpdatedEpoch != 2 || deal1.To.LastUpdatedEpoch != 3 {
t.Fatal("Unexpected change to LastUpdatedEpoch")
}
deal2 := changedDealIDs[abi.DealID(2)]
if deal2.From.SlashEpoch != 0 || deal2.To.SlashEpoch != 6 {
t.Fatal("Unexpected change to SlashEpoch")
}
// Test that OnActorStateChanged does not call the callback if the state has not changed
mockAddr, err := address.NewFromString("t01")
require.NoError(t, err)
actorDiffFn := preds.OnActorStateChanged(mockAddr, func(context.Context, cid.Cid, cid.Cid) (bool, UserData, error) {
t.Fatal("No state change so this should not be called")
return false, nil, nil
})
changed, _, err = actorDiffFn(ctx, oldState.Key(), oldState.Key())
require.NoError(t, err)
require.False(t, changed)
// Test that OnDealStateChanged does not call the callback if the state has not changed
diffDealStateFn := preds.OnDealStateChanged(func(context.Context, *adt.Array, *adt.Array) (bool, UserData, error) {
t.Fatal("No state change so this should not be called")
return false, nil, nil
})
marketState := createEmptyMarketState(t, store)
changed, _, err = diffDealStateFn(ctx, marketState, marketState)
require.NoError(t, err)
require.False(t, changed)
})
t.Run("deal state array predicate", func(t *testing.T) {
preds := NewStatePredicates(api)
diffArrFn := preds.OnStorageMarketActorChanged(preds.OnDealStateChanged(preds.OnDealStateAmtChanged()))
changed, _, err := diffArrFn(ctx, oldState.Key(), oldState.Key())
require.NoError(t, err)
require.False(t, changed)
changed, valArr, err := diffArrFn(ctx, oldState.Key(), newState.Key())
require.NoError(t, err)
require.True(t, changed)
changedDeals, ok := valArr.(*MarketDealStateChanges)
require.True(t, ok)
require.Len(t, changedDeals.Added, 1)
require.Equal(t, abi.DealID(3), changedDeals.Added[0].ID)
require.Equal(t, *newDeal3, changedDeals.Added[0].Deal)
require.Len(t, changedDeals.Removed, 0)
require.Len(t, changedDeals.Modified, 2)
require.Equal(t, abi.DealID(1), changedDeals.Modified[0].ID)
require.Equal(t, newDeal1, changedDeals.Modified[0].To)
require.Equal(t, oldDeal1, changedDeals.Modified[0].From)
require.Equal(t, abi.DealID(2), changedDeals.Modified[1].ID)
require.Equal(t, oldDeal2, changedDeals.Modified[1].From)
require.Equal(t, newDeal2, changedDeals.Modified[1].To)
})
t.Run("deal proposal array predicate", func(t *testing.T) {
preds := NewStatePredicates(api)
diffArrFn := preds.OnStorageMarketActorChanged(preds.OnDealProposalChanged(preds.OnDealProposalAmtChanged()))
changed, _, err := diffArrFn(ctx, oldState.Key(), oldState.Key())
require.NoError(t, err)
require.False(t, changed)
changed, valArr, err := diffArrFn(ctx, oldState.Key(), newState.Key())
require.NoError(t, err)
require.True(t, changed)
changedProps, ok := valArr.(*MarketDealProposalChanges)
require.True(t, ok)
require.Len(t, changedProps.Added, 1)
require.Equal(t, abi.DealID(3), changedProps.Added[0].ID)
require.Equal(t, *newProp3, changedProps.Added[0].Proposal)
// proposals cannot be modified -- no modified testing
require.Len(t, changedProps.Removed, 1)
require.Equal(t, abi.DealID(2), changedProps.Removed[0].ID)
require.Equal(t, *oldProp2, changedProps.Removed[0].Proposal)
})
}
func TestMinerSectorChange(t *testing.T) {
ctx := context.Background()
bs := bstore.NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore()))
store := cbornode.NewCborStore(bs)
nextID := uint64(0)
nextIDAddrF := func() address.Address {
defer func() { nextID++ }()
return tutils.NewIDAddr(t, nextID)
}
owner, worker := nextIDAddrF(), nextIDAddrF()
si0 := newSectorOnChainInfo(0, tutils.MakeCID("0"), big.NewInt(0), abi.ChainEpoch(0), abi.ChainEpoch(10))
si1 := newSectorOnChainInfo(1, tutils.MakeCID("1"), big.NewInt(1), abi.ChainEpoch(1), abi.ChainEpoch(11))
si2 := newSectorOnChainInfo(2, tutils.MakeCID("2"), big.NewInt(2), abi.ChainEpoch(2), abi.ChainEpoch(11))
oldMinerC := createMinerState(ctx, t, store, owner, worker, []miner.SectorOnChainInfo{si0, si1, si2})
si3 := newSectorOnChainInfo(3, tutils.MakeCID("3"), big.NewInt(3), abi.ChainEpoch(3), abi.ChainEpoch(12))
// 0 delete
// 1 extend
// 2 same
// 3 added
si1Ext := si1
si1Ext.Info.Expiration++
newMinerC := createMinerState(ctx, t, store, owner, worker, []miner.SectorOnChainInfo{si1Ext, si2, si3})
minerAddr := nextIDAddrF()
oldState, err := mockTipset(minerAddr, 1)
require.NoError(t, err)
newState, err := mockTipset(minerAddr, 2)
require.NoError(t, err)
api := newMockAPI(bs)
api.setActor(oldState.Key(), &types.Actor{Head: oldMinerC})
api.setActor(newState.Key(), &types.Actor{Head: newMinerC})
preds := NewStatePredicates(api)
minerDiffFn := preds.OnMinerActorChange(minerAddr, preds.OnMinerSectorChange())
change, val, err := minerDiffFn(ctx, oldState.Key(), newState.Key())
require.NoError(t, err)
require.True(t, change)
require.NotNil(t, val)
sectorChanges, ok := val.(*MinerSectorChanges)
require.True(t, ok)
require.Equal(t, len(sectorChanges.Added), 1)
require.Equal(t, 1, len(sectorChanges.Added))
require.Equal(t, si3, sectorChanges.Added[0])
require.Equal(t, 1, len(sectorChanges.Removed))
require.Equal(t, si0, sectorChanges.Removed[0])
require.Equal(t, 1, len(sectorChanges.Extended))
require.Equal(t, si1, sectorChanges.Extended[0].From)
require.Equal(t, si1Ext, sectorChanges.Extended[0].To)
change, val, err = minerDiffFn(ctx, oldState.Key(), oldState.Key())
require.NoError(t, err)
require.False(t, change)
require.Nil(t, val)
change, val, err = minerDiffFn(ctx, newState.Key(), oldState.Key())
require.NoError(t, err)
require.True(t, change)
require.NotNil(t, val)
sectorChanges, ok = val.(*MinerSectorChanges)
require.True(t, ok)
require.Equal(t, 1, len(sectorChanges.Added))
require.Equal(t, si0, sectorChanges.Added[0])
require.Equal(t, 1, len(sectorChanges.Removed))
require.Equal(t, si3, sectorChanges.Removed[0])
require.Equal(t, 1, len(sectorChanges.Extended))
require.Equal(t, si1, sectorChanges.Extended[0].To)
require.Equal(t, si1Ext, sectorChanges.Extended[0].From)
}
func mockTipset(minerAddr address.Address, timestamp uint64) (*types.TipSet, error) {
return types.NewTipSet([]*types.BlockHeader{{
Miner: minerAddr,
Height: 5,
ParentStateRoot: dummyCid,
Messages: dummyCid,
ParentMessageReceipts: dummyCid,
BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS},
BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS},
Timestamp: timestamp,
}})
}
func createMarketState(ctx context.Context, t *testing.T, store *cbornode.BasicIpldStore, deals map[abi.DealID]*market.DealState, props map[abi.DealID]*market.DealProposal) cid.Cid {
dealRootCid := createDealAMT(ctx, t, store, deals)
propRootCid := createProposalAMT(ctx, t, store, props)
state := createEmptyMarketState(t, store)
state.States = dealRootCid
state.Proposals = propRootCid
stateC, err := store.Put(ctx, state)
require.NoError(t, err)
return stateC
}
func createEmptyMarketState(t *testing.T, store *cbornode.BasicIpldStore) *market.State {
emptyArrayCid, err := amt.NewAMT(store).Flush(context.TODO())
require.NoError(t, err)
emptyMap, err := store.Put(context.TODO(), hamt.NewNode(store, hamt.UseTreeBitWidth(5)))
require.NoError(t, err)
return market.ConstructState(emptyArrayCid, emptyMap, emptyMap)
}
func createDealAMT(ctx context.Context, t *testing.T, store *cbornode.BasicIpldStore, deals map[abi.DealID]*market.DealState) cid.Cid {
root := amt.NewAMT(store)
for dealID, dealState := range deals {
err := root.Set(ctx, uint64(dealID), dealState)
require.NoError(t, err)
}
rootCid, err := root.Flush(ctx)
require.NoError(t, err)
return rootCid
}
func createProposalAMT(ctx context.Context, t *testing.T, store *cbornode.BasicIpldStore, props map[abi.DealID]*market.DealProposal) cid.Cid {
root := amt.NewAMT(store)
for dealID, prop := range props {
err := root.Set(ctx, uint64(dealID), prop)
require.NoError(t, err)
}
rootCid, err := root.Flush(ctx)
require.NoError(t, err)
return rootCid
}
func createMinerState(ctx context.Context, t *testing.T, store *cbornode.BasicIpldStore, owner, worker address.Address, sectors []miner.SectorOnChainInfo) cid.Cid {
rootCid := createSectorsAMT(ctx, t, store, sectors)
state := createEmptyMinerState(ctx, t, store, owner, worker)
state.Sectors = rootCid
stateC, err := store.Put(ctx, state)
require.NoError(t, err)
return stateC
}
func createEmptyMinerState(ctx context.Context, t *testing.T, store *cbornode.BasicIpldStore, owner, worker address.Address) *miner.State {
emptyArrayCid, err := amt.NewAMT(store).Flush(context.TODO())
require.NoError(t, err)
emptyMap, err := store.Put(context.TODO(), hamt.NewNode(store, hamt.UseTreeBitWidth(5)))
require.NoError(t, err)
emptyDeadlines := miner.ConstructDeadlines()
emptyDeadlinesCid, err := store.Put(context.Background(), emptyDeadlines)
require.NoError(t, err)
state, err := miner.ConstructState(emptyArrayCid, emptyMap, emptyDeadlinesCid, owner, worker, abi.PeerID{'1'}, nil, abi.RegisteredSealProof_StackedDrg64GiBV1, 0)
require.NoError(t, err)
return state
}
func createSectorsAMT(ctx context.Context, t *testing.T, store *cbornode.BasicIpldStore, sectors []miner.SectorOnChainInfo) cid.Cid {
root := amt.NewAMT(store)
for _, sector := range sectors {
sector := sector
err := root.Set(ctx, uint64(sector.Info.SectorNumber), &sector)
require.NoError(t, err)
}
rootCid, err := root.Flush(ctx)
require.NoError(t, err)
return rootCid
}
// returns a unique SectorOnChainInfo with each invocation with SectorNumber set to `sectorNo`.
func newSectorOnChainInfo(sectorNo abi.SectorNumber, sealed cid.Cid, weight big.Int, activation, expiration abi.ChainEpoch) miner.SectorOnChainInfo {
info := newSectorPreCommitInfo(sectorNo, sealed, expiration)
return miner.SectorOnChainInfo{
Info: *info,
ActivationEpoch: activation,
DealWeight: weight,
VerifiedDealWeight: weight,
}
}
const (
sectorSealRandEpochValue = abi.ChainEpoch(1)
)
// returns a unique SectorPreCommitInfo with each invocation with SectorNumber set to `sectorNo`.
func newSectorPreCommitInfo(sectorNo abi.SectorNumber, sealed cid.Cid, expiration abi.ChainEpoch) *miner.SectorPreCommitInfo {
return &miner.SectorPreCommitInfo{
SealProof: abi.RegisteredSealProof_StackedDrg32GiBV1,
SectorNumber: sectorNo,
SealedCID: sealed,
SealRandEpoch: sectorSealRandEpochValue,
DealIDs: nil,
Expiration: expiration,
}
}
+5 -4
View File
@@ -3,12 +3,13 @@ package events
import (
"context"
"github.com/filecoin-project/specs-actors/actors/abi"
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/types"
)
type tsByHFunc func(context.Context, uint64, types.TipSetKey) (*types.TipSet, error)
type tsByHFunc func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error)
// tipSetCache implements a simple ring-buffer cache to keep track of recent
// tipsets
@@ -20,7 +21,7 @@ type tipSetCache struct {
storage tsByHFunc
}
func newTSCache(cap int, storage tsByHFunc) *tipSetCache {
func newTSCache(cap abi.ChainEpoch, storage tsByHFunc) *tipSetCache {
return &tipSetCache{
cache: make([]*types.TipSet, cap),
start: 0,
@@ -77,7 +78,7 @@ func (tsc *tipSetCache) revert(ts *types.TipSet) error {
return nil
}
func (tsc *tipSetCache) getNonNull(height uint64) (*types.TipSet, error) {
func (tsc *tipSetCache) getNonNull(height abi.ChainEpoch) (*types.TipSet, error) {
for {
ts, err := tsc.get(height)
if err != nil {
@@ -90,7 +91,7 @@ func (tsc *tipSetCache) getNonNull(height uint64) (*types.TipSet, error) {
}
}
func (tsc *tipSetCache) get(height uint64) (*types.TipSet, error) {
func (tsc *tipSetCache) get(height abi.ChainEpoch) (*types.TipSet, error) {
if tsc.len == 0 {
log.Warnf("tipSetCache.get: cache is empty, requesting from storage (h=%d)", height)
return tsc.storage(context.TODO(), height, types.EmptyTSK)
+10 -8
View File
@@ -4,6 +4,8 @@ import (
"context"
"testing"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-address"
@@ -11,12 +13,12 @@ import (
)
func TestTsCache(t *testing.T) {
tsc := newTSCache(50, func(context.Context, uint64, types.TipSetKey) (*types.TipSet, error) {
tsc := newTSCache(50, func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) {
t.Fatal("storage call")
return &types.TipSet{}, nil
})
h := uint64(75)
h := abi.ChainEpoch(75)
a, _ := address.NewFromString("t00")
@@ -27,8 +29,8 @@ func TestTsCache(t *testing.T) {
ParentStateRoot: dummyCid,
Messages: dummyCid,
ParentMessageReceipts: dummyCid,
BlockSig: &types.Signature{Type: types.KTBLS},
BLSAggregate: types.Signature{Type: types.KTBLS},
BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS},
BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS},
}})
if err != nil {
t.Fatal(err)
@@ -54,12 +56,12 @@ func TestTsCache(t *testing.T) {
}
func TestTsCacheNulls(t *testing.T) {
tsc := newTSCache(50, func(context.Context, uint64, types.TipSetKey) (*types.TipSet, error) {
tsc := newTSCache(50, func(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) {
t.Fatal("storage call")
return &types.TipSet{}, nil
})
h := uint64(75)
h := abi.ChainEpoch(75)
a, _ := address.NewFromString("t00")
add := func() {
@@ -69,8 +71,8 @@ func TestTsCacheNulls(t *testing.T) {
ParentStateRoot: dummyCid,
Messages: dummyCid,
ParentMessageReceipts: dummyCid,
BlockSig: &types.Signature{Type: types.KTBLS},
BLSAggregate: types.Signature{Type: types.KTBLS},
BlockSig: &crypto.Signature{Type: crypto.SigTypeBLS},
BLSAggregate: &crypto.Signature{Type: crypto.SigTypeBLS},
}})
if err != nil {
t.Fatal(err)
+5 -6
View File
@@ -5,15 +5,14 @@ import (
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
)
func (e *calledEvents) CheckMsg(ctx context.Context, smsg store.ChainMsg, hnd CalledHandler) CheckFunc {
func (me *messageEvents) CheckMsg(ctx context.Context, smsg types.ChainMsg, hnd MsgHandler) CheckFunc {
msg := smsg.VMMessage()
return func(ts *types.TipSet) (done bool, more bool, err error) {
fa, err := e.cs.StateGetActor(ctx, msg.From, ts.Key())
fa, err := me.cs.StateGetActor(ctx, msg.From, ts.Key())
if err != nil {
return false, true, err
}
@@ -23,7 +22,7 @@ func (e *calledEvents) CheckMsg(ctx context.Context, smsg store.ChainMsg, hnd Ca
return false, true, nil
}
rec, err := e.cs.StateGetReceipt(ctx, smsg.VMMessage().Cid(), ts.Key())
rec, err := me.cs.StateGetReceipt(ctx, smsg.VMMessage().Cid(), ts.Key())
if err != nil {
return false, true, xerrors.Errorf("getting receipt in CheckMsg: %w", err)
}
@@ -34,10 +33,10 @@ func (e *calledEvents) CheckMsg(ctx context.Context, smsg store.ChainMsg, hnd Ca
}
}
func (e *calledEvents) MatchMsg(inmsg *types.Message) MatchFunc {
func (me *messageEvents) MatchMsg(inmsg *types.Message) MsgMatchFunc {
return func(msg *types.Message) (bool, error) {
if msg.From == inmsg.From && msg.Nonce == inmsg.Nonce && !inmsg.Equals(msg) {
return false, xerrors.Errorf("matching msg %s from %s, nonce %d: got duplicate origin/nonce msg %s", inmsg.Cid(), inmsg.From, inmsg.Nonce, msg.Nonce)
return false, xerrors.Errorf("matching msg %s from %s, nonce %d: got duplicate origin/nonce msg %d", inmsg.Cid(), inmsg.From, inmsg.Nonce, msg.Nonce)
}
return inmsg.Equals(msg), nil
+217 -271
View File
@@ -3,27 +3,32 @@ package gen
import (
"bytes"
"context"
"crypto/sha256"
"encoding/binary"
"fmt"
"io/ioutil"
"sync/atomic"
"time"
"github.com/filecoin-project/go-address"
commcid "github.com/filecoin-project/go-fil-commcid"
"github.com/filecoin-project/specs-actors/actors/abi"
saminer "github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/crypto"
block "github.com/ipfs/go-block-format"
"github.com/ipfs/go-blockservice"
"github.com/ipfs/go-car"
"github.com/ipfs/go-cid"
blockstore "github.com/ipfs/go-ipfs-blockstore"
offline "github.com/ipfs/go-ipfs-exchange-offline"
format "github.com/ipfs/go-ipld-format"
logging "github.com/ipfs/go-log/v2"
"github.com/ipfs/go-merkledag"
peer "github.com/libp2p/go-libp2p-core/peer"
"github.com/ipld/go-car"
"go.opencensus.io/trace"
"golang.org/x/xerrors"
ffi "github.com/filecoin-project/filecoin-ffi"
"github.com/filecoin-project/go-address"
sectorbuilder "github.com/filecoin-project/go-sectorbuilder"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/beacon"
genesis2 "github.com/filecoin-project/lotus/chain/gen/genesis"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
@@ -33,15 +38,17 @@ import (
"github.com/filecoin-project/lotus/genesis"
"github.com/filecoin-project/lotus/lib/sigs"
"github.com/filecoin-project/lotus/node/repo"
"go.opencensus.io/trace"
"golang.org/x/xerrors"
"github.com/filecoin-project/sector-storage/ffiwrapper"
)
var log = logging.Logger("gen")
const msgsPerBlock = 20
var ValidWpostForTesting = []abi.PoStProof{{
ProofBytes: []byte("valid proof"),
}}
type ChainGen struct {
msgsPerBlock int
@@ -49,18 +56,20 @@ type ChainGen struct {
cs *store.ChainStore
beacon beacon.RandomBeacon
sm *stmgr.StateManager
genesis *types.BlockHeader
CurTipset *store.FullTipSet
Timestamper func(*types.TipSet, uint64) uint64
Timestamper func(*types.TipSet, abi.ChainEpoch) uint64
GetMessages func(*ChainGen) ([]*types.SignedMessage, error)
w *wallet.Wallet
eppProvs map[address.Address]ElectionPoStProver
eppProvs map[address.Address]WinningPoStProver
Miners []address.Address
receivers []address.Address
banker address.Address
@@ -83,7 +92,11 @@ func (m mybs) Get(c cid.Cid) (block.Block, error) {
return b, nil
}
func NewGenerator() (*ChainGen, error) {
func NewGeneratorWithSectors(numSectors int) (*ChainGen, error) {
saminer.SupportedProofTypes = map[abi.RegisteredSealProof]struct{}{
abi.RegisteredSealProof_StackedDrg2KiBV1: {},
}
mr := repo.NewMemory(nil)
lr, err := mr.Lock(repo.StorageMiner)
if err != nil {
@@ -95,7 +108,7 @@ func NewGenerator() (*ChainGen, error) {
return nil, xerrors.Errorf("failed to get metadata datastore: %w", err)
}
bds, err := lr.Datastore("/blocks")
bds, err := lr.Datastore("/chain")
if err != nil {
return nil, xerrors.Errorf("failed to get blocks datastore: %w", err)
}
@@ -112,74 +125,81 @@ func NewGenerator() (*ChainGen, error) {
return nil, xerrors.Errorf("creating memrepo wallet failed: %w", err)
}
banker, err := w.GenerateKey(types.KTSecp256k1)
banker, err := w.GenerateKey(crypto.SigTypeSecp256k1)
if err != nil {
return nil, xerrors.Errorf("failed to generate banker key: %w", err)
}
receievers := make([]address.Address, msgsPerBlock)
for r := range receievers {
receievers[r], err = w.GenerateKey(types.KTBLS)
receievers[r], err = w.GenerateKey(crypto.SigTypeBLS)
if err != nil {
return nil, xerrors.Errorf("failed to generate receiver key: %w", err)
}
}
maddr1, err := address.NewFromString("t0300")
if err != nil {
return nil, err
}
maddr1 := genesis2.MinerAddress(0)
m1temp, err := ioutil.TempDir("", "preseal")
if err != nil {
return nil, err
}
genm1, err := seed.PreSeal(maddr1, 1024, 0, 1, m1temp, []byte("some randomness"))
genm1, k1, err := seed.PreSeal(maddr1, abi.RegisteredSealProof_StackedDrg2KiBV1, 0, numSectors, m1temp, []byte("some randomness"), nil, true)
if err != nil {
return nil, err
}
maddr2, err := address.NewFromString("t0301")
if err != nil {
return nil, err
}
maddr2 := genesis2.MinerAddress(1)
m2temp, err := ioutil.TempDir("", "preseal")
if err != nil {
return nil, err
}
genm2, err := seed.PreSeal(maddr2, 1024, 0, 1, m2temp, []byte("some randomness"))
genm2, k2, err := seed.PreSeal(maddr2, abi.RegisteredSealProof_StackedDrg2KiBV1, 0, numSectors, m2temp, []byte("some randomness"), nil, true)
if err != nil {
return nil, err
}
mk1, err := w.Import(&genm1.Key)
mk1, err := w.Import(k1)
if err != nil {
return nil, err
}
mk2, err := w.Import(&genm2.Key)
mk2, err := w.Import(k2)
if err != nil {
return nil, err
}
minercfg := &GenMinerCfg{
PeerIDs: []peer.ID{"peerID1", "peerID2"},
PreSeals: map[string]genesis.GenesisMiner{
maddr1.String(): *genm1,
maddr2.String(): *genm2,
sys := vm.Syscalls(&genFakeVerifier{})
tpl := genesis.Template{
Accounts: []genesis.Actor{
{
Type: genesis.TAccount,
Balance: types.FromFil(40000),
Meta: (&genesis.AccountMeta{Owner: mk1}).ActorMeta(),
},
{
Type: genesis.TAccount,
Balance: types.FromFil(40000),
Meta: (&genesis.AccountMeta{Owner: mk2}).ActorMeta(),
},
{
Type: genesis.TAccount,
Balance: types.FromFil(50000),
Meta: (&genesis.AccountMeta{Owner: banker}).ActorMeta(),
},
},
MinerAddrs: []address.Address{maddr1, maddr2},
Miners: []genesis.Miner{
*genm1,
*genm2,
},
NetworkName: "",
Timestamp: uint64(time.Now().Add(-500 * time.Duration(build.BlockDelaySecs) * time.Second).Unix()),
}
sys := vm.Syscalls(sectorbuilder.ProofVerifier)
genb, err := MakeGenesisBlock(bs, sys, map[address.Address]types.BigInt{
mk1: types.FromFil(40000),
mk2: types.FromFil(40000),
banker: types.FromFil(50000),
}, minercfg, 100000)
genb, err := genesis2.MakeGenesisBlock(context.TODO(), bs, sys, tpl)
if err != nil {
return nil, xerrors.Errorf("make genesis block failed: %w", err)
}
@@ -193,27 +213,32 @@ func NewGenerator() (*ChainGen, error) {
return nil, xerrors.Errorf("set genesis failed: %w", err)
}
if len(minercfg.MinerAddrs) == 0 {
return nil, xerrors.Errorf("MakeGenesisBlock failed to set miner address")
}
mgen := make(map[address.Address]ElectionPoStProver)
for _, m := range minercfg.MinerAddrs {
mgen[m] = &eppProvider{}
mgen := make(map[address.Address]WinningPoStProver)
for i := range tpl.Miners {
mgen[genesis2.MinerAddress(uint64(i))] = &wppProvider{}
}
sm := stmgr.NewStateManager(cs)
miners := []address.Address{maddr1, maddr2}
beac := beacon.NewMockBeacon(time.Second)
//beac, err := drand.NewDrandBeacon(tpl.Timestamp, build.BlockDelaySecs)
//if err != nil {
//return nil, xerrors.Errorf("creating drand beacon: %w", err)
//}
gen := &ChainGen{
bs: bs,
cs: cs,
sm: sm,
msgsPerBlock: msgsPerBlock,
genesis: genb.Genesis,
beacon: beac,
w: w,
GetMessages: getRandomMessages,
Miners: minercfg.MinerAddrs,
Miners: miners,
eppProvs: mgen,
banker: banker,
receivers: receievers,
@@ -227,6 +252,10 @@ func NewGenerator() (*ChainGen, error) {
return gen, nil
}
func NewGenerator() (*ChainGen, error) {
return NewGeneratorWithSectors(1)
}
func (cg *ChainGen) SetStateManager(sm *stmgr.StateManager) {
cg.sm = sm
}
@@ -246,46 +275,76 @@ func (cg *ChainGen) GenesisCar() ([]byte, error) {
out := new(bytes.Buffer)
if err := car.WriteCar(context.TODO(), dserv, []cid.Cid{cg.Genesis().Cid()}, out); err != nil {
if err := car.WriteCarWithWalker(context.TODO(), dserv, []cid.Cid{cg.Genesis().Cid()}, out, CarWalkFunc); err != nil {
return nil, xerrors.Errorf("genesis car write car failed: %w", err)
}
return out.Bytes(), nil
}
func (cg *ChainGen) nextBlockProof(ctx context.Context, pts *types.TipSet, m address.Address, round int64) (*types.EPostProof, *types.Ticket, error) {
func CarWalkFunc(nd format.Node) (out []*format.Link, err error) {
for _, link := range nd.Links() {
if link.Cid.Prefix().MhType == uint64(commcid.FC_SEALED_V1) || link.Cid.Prefix().MhType == uint64(commcid.FC_UNSEALED_V1) {
continue
}
out = append(out, link)
}
lastTicket := pts.MinTicket()
return out, nil
}
func (cg *ChainGen) nextBlockProof(ctx context.Context, pts *types.TipSet, m address.Address, round abi.ChainEpoch) ([]types.BeaconEntry, *types.ElectionProof, *types.Ticket, error) {
mc := &mca{w: cg.w, sm: cg.sm, pv: ffiwrapper.ProofVerifier, bcn: cg.beacon}
mbi, err := mc.MinerGetBaseInfo(ctx, m, round, pts.Key())
if err != nil {
return nil, nil, nil, xerrors.Errorf("get miner base info: %w", err)
}
prev := mbi.PrevBeaconEntry
entries, err := beacon.BeaconEntriesForBlock(ctx, cg.beacon, round, prev)
if err != nil {
return nil, nil, nil, xerrors.Errorf("get beacon entries for block: %w", err)
}
rbase := prev
if len(entries) > 0 {
rbase = entries[len(entries)-1]
}
eproof, err := IsRoundWinner(ctx, pts, round, m, rbase, mbi, mc)
if err != nil {
return nil, nil, nil, xerrors.Errorf("checking round winner failed: %w", err)
}
buf := new(bytes.Buffer)
if err := m.MarshalCBOR(buf); err != nil {
return nil, nil, nil, xerrors.Errorf("failed to cbor marshal address: %w", err)
}
if len(entries) == 0 {
buf.Write(pts.MinTicket().VRFProof)
}
ticketRand, err := store.DrawRandomness(rbase.Data, crypto.DomainSeparationTag_TicketProduction, round-build.TicketRandomnessLookback, buf.Bytes())
if err != nil {
return nil, nil, nil, err
}
st := pts.ParentState()
worker, err := stmgr.GetMinerWorkerRaw(ctx, cg.sm, st, m)
if err != nil {
return nil, nil, xerrors.Errorf("get miner worker: %w", err)
return nil, nil, nil, xerrors.Errorf("get miner worker: %w", err)
}
vrfout, err := ComputeVRF(ctx, cg.w.Sign, worker, m, DSepTicket, lastTicket.VRFProof)
vrfout, err := ComputeVRF(ctx, cg.w.Sign, worker, ticketRand)
if err != nil {
return nil, nil, xerrors.Errorf("compute VRF: %w", err)
return nil, nil, nil, xerrors.Errorf("compute VRF: %w", err)
}
tick := &types.Ticket{
VRFProof: vrfout,
}
eproofin, err := IsRoundWinner(ctx, pts, round, m, cg.eppProvs[m], &mca{w: cg.w, sm: cg.sm})
if err != nil {
return nil, nil, xerrors.Errorf("checking round winner failed: %w", err)
}
if eproofin == nil {
return nil, tick, nil
}
eproof, err := ComputeProof(ctx, cg.eppProvs[m], eproofin)
if err != nil {
return nil, nil, xerrors.Errorf("computing proof: %w", err)
}
return eproof, tick, nil
return entries, eproof, &types.Ticket{VRFProof: vrfout}, nil
}
type MinedTipSet struct {
@@ -311,15 +370,21 @@ func (cg *ChainGen) NextTipSetFromMiners(base *types.TipSet, miners []address.Ad
return nil, xerrors.Errorf("get random messages: %w", err)
}
for round := int64(base.Height() + 1); len(blks) == 0; round++ {
for round := base.Height() + 1; len(blks) == 0; round++ {
for _, m := range miners {
proof, t, err := cg.nextBlockProof(context.TODO(), base, m, round)
bvals, et, ticket, err := cg.nextBlockProof(context.TODO(), base, m, round)
if err != nil {
return nil, xerrors.Errorf("next block proof: %w", err)
}
if proof != nil {
fblk, err := cg.makeBlock(base, m, proof, t, uint64(round), msgs)
if et != nil {
// TODO: maybe think about passing in more real parameters to this?
wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil)
if err != nil {
return nil, err
}
fblk, err := cg.makeBlock(base, m, ticket, et, bvals, round, wpost, msgs)
if err != nil {
return nil, xerrors.Errorf("making a block for next tipset failed: %w", err)
}
@@ -341,16 +406,28 @@ func (cg *ChainGen) NextTipSetFromMiners(base *types.TipSet, miners []address.Ad
}, nil
}
func (cg *ChainGen) makeBlock(parents *types.TipSet, m address.Address, eproof *types.EPostProof, ticket *types.Ticket, height uint64, msgs []*types.SignedMessage) (*types.FullBlock, error) {
func (cg *ChainGen) makeBlock(parents *types.TipSet, m address.Address, vrfticket *types.Ticket,
eticket *types.ElectionProof, bvals []types.BeaconEntry, height abi.ChainEpoch,
wpost []abi.PoStProof, msgs []*types.SignedMessage) (*types.FullBlock, error) {
var ts uint64
if cg.Timestamper != nil {
ts = cg.Timestamper(parents, height-parents.Height())
} else {
ts = parents.MinTimestamp() + ((height - parents.Height()) * build.BlockDelay)
ts = parents.MinTimestamp() + uint64(height-parents.Height())*build.BlockDelaySecs
}
fblk, err := MinerCreateBlock(context.TODO(), cg.sm, cg.w, m, parents, ticket, eproof, msgs, height, ts)
fblk, err := MinerCreateBlock(context.TODO(), cg.sm, cg.w, &api.BlockTemplate{
Miner: m,
Parents: parents.Key(),
Ticket: vrfticket,
Eproof: eticket,
BeaconValues: bvals,
Messages: msgs,
Epoch: height,
Timestamp: ts,
WinningPoStProof: wpost,
})
if err != nil {
return nil, err
}
@@ -358,7 +435,7 @@ func (cg *ChainGen) makeBlock(parents *types.TipSet, m address.Address, eproof *
return fblk, err
}
// This function is awkward. It's used to deal with messages made when
// ResyncBankerNonce is used for dealing with messages made when
// simulating forks
func (cg *ChainGen) ResyncBankerNonce(ts *types.TipSet) error {
act, err := cg.sm.GetActor(cg.banker, ts)
@@ -391,7 +468,7 @@ func getRandomMessages(cg *ChainGen) ([]*types.SignedMessage, error) {
Method: 0,
GasLimit: types.NewInt(10000),
GasLimit: 10000,
GasPrice: types.NewInt(0),
}
@@ -417,232 +494,86 @@ func (cg *ChainGen) YieldRepo() (repo.Repo, error) {
}
type MiningCheckAPI interface {
ChainGetRandomness(context.Context, types.TipSetKey, int64) ([]byte, error)
ChainGetRandomness(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error)
StateMinerPower(context.Context, address.Address, types.TipSetKey) (api.MinerPower, error)
MinerGetBaseInfo(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error)
StateMinerWorker(context.Context, address.Address, types.TipSetKey) (address.Address, error)
StateMinerSectorSize(context.Context, address.Address, types.TipSetKey) (uint64, error)
StateMinerProvingSet(context.Context, address.Address, types.TipSetKey) ([]*api.ChainSectorInfo, error)
WalletSign(context.Context, address.Address, []byte) (*types.Signature, error)
WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error)
}
type mca struct {
w *wallet.Wallet
sm *stmgr.StateManager
w *wallet.Wallet
sm *stmgr.StateManager
pv ffiwrapper.Verifier
bcn beacon.RandomBeacon
}
func (mca mca) ChainGetRandomness(ctx context.Context, pts types.TipSetKey, lb int64) ([]byte, error) {
return mca.sm.ChainStore().GetRandomness(ctx, pts.Cids(), int64(lb))
}
func (mca mca) StateMinerPower(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (api.MinerPower, error) {
ts, err := mca.sm.ChainStore().LoadTipSet(tsk)
func (mca mca) ChainGetRandomness(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) {
pts, err := mca.sm.ChainStore().LoadTipSet(tsk)
if err != nil {
return api.MinerPower{}, xerrors.Errorf("loading tipset %s: %w", tsk, err)
}
mpow, tpow, err := stmgr.GetPower(ctx, mca.sm, ts, maddr)
if err != nil {
return api.MinerPower{}, err
return nil, xerrors.Errorf("loading tipset key: %w", err)
}
return api.MinerPower{
MinerPower: mpow,
TotalPower: tpow,
}, err
return mca.sm.ChainStore().GetRandomness(ctx, pts.Cids(), personalization, randEpoch, entropy)
}
func (mca mca) StateMinerWorker(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (address.Address, error) {
ts, err := mca.sm.ChainStore().LoadTipSet(tsk)
if err != nil {
return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err)
}
return stmgr.GetMinerWorkerRaw(ctx, mca.sm, ts.ParentState(), maddr)
func (mca mca) MinerGetBaseInfo(ctx context.Context, maddr address.Address, epoch abi.ChainEpoch, tsk types.TipSetKey) (*api.MiningBaseInfo, error) {
return stmgr.MinerGetBaseInfo(ctx, mca.sm, mca.bcn, tsk, epoch, maddr, mca.pv)
}
func (mca mca) StateMinerSectorSize(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (uint64, error) {
ts, err := mca.sm.ChainStore().LoadTipSet(tsk)
if err != nil {
return 0, xerrors.Errorf("loading tipset %s: %w", tsk, err)
}
return stmgr.GetMinerSectorSize(ctx, mca.sm, ts, maddr)
}
func (mca mca) StateMinerProvingSet(ctx context.Context, maddr address.Address, tsk types.TipSetKey) ([]*api.ChainSectorInfo, error) {
ts, err := mca.sm.ChainStore().LoadTipSet(tsk)
if err != nil {
return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err)
}
return stmgr.GetMinerProvingSet(ctx, mca.sm, ts, maddr)
}
func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*types.Signature, error) {
func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*crypto.Signature, error) {
return mca.w.Sign(ctx, a, v)
}
type ElectionPoStProver interface {
GenerateCandidates(context.Context, sectorbuilder.SortedPublicSectorInfo, []byte) ([]sectorbuilder.EPostCandidate, error)
ComputeProof(context.Context, sectorbuilder.SortedPublicSectorInfo, []byte, []sectorbuilder.EPostCandidate) ([]byte, error)
type WinningPoStProver interface {
GenerateCandidates(context.Context, abi.PoStRandomness, uint64) ([]uint64, error)
ComputeProof(context.Context, []abi.SectorInfo, abi.PoStRandomness) ([]abi.PoStProof, error)
}
type eppProvider struct{}
type wppProvider struct{}
func (epp *eppProvider) GenerateCandidates(ctx context.Context, _ sectorbuilder.SortedPublicSectorInfo, eprand []byte) ([]sectorbuilder.EPostCandidate, error) {
return []sectorbuilder.EPostCandidate{
{
SectorID: 1,
PartialTicket: [32]byte{},
Ticket: [32]byte{},
SectorChallengeIndex: 1,
},
}, nil
func (wpp *wppProvider) GenerateCandidates(ctx context.Context, _ abi.PoStRandomness, _ uint64) ([]uint64, error) {
return []uint64{0}, nil
}
func (epp *eppProvider) ComputeProof(ctx context.Context, _ sectorbuilder.SortedPublicSectorInfo, eprand []byte, winners []sectorbuilder.EPostCandidate) ([]byte, error) {
return []byte("valid proof"), nil
func (wpp *wppProvider) ComputeProof(context.Context, []abi.SectorInfo, abi.PoStRandomness) ([]abi.PoStProof, error) {
return ValidWpostForTesting, nil
}
type ProofInput struct {
sectors sectorbuilder.SortedPublicSectorInfo
hvrf []byte
winners []sectorbuilder.EPostCandidate
vrfout []byte
}
func IsRoundWinner(ctx context.Context, ts *types.TipSet, round abi.ChainEpoch,
miner address.Address, brand types.BeaconEntry, mbi *api.MiningBaseInfo, a MiningCheckAPI) (*types.ElectionProof, error) {
func IsRoundWinner(ctx context.Context, ts *types.TipSet, round int64, miner address.Address, epp ElectionPoStProver, a MiningCheckAPI) (*ProofInput, error) {
r, err := a.ChainGetRandomness(ctx, ts.Key(), round-build.EcRandomnessLookback)
if err != nil {
return nil, xerrors.Errorf("chain get randomness: %w", err)
buf := new(bytes.Buffer)
if err := miner.MarshalCBOR(buf); err != nil {
return nil, xerrors.Errorf("failed to cbor marshal address: %w")
}
mworker, err := a.StateMinerWorker(ctx, miner, ts.Key())
electionRand, err := store.DrawRandomness(brand.Data, crypto.DomainSeparationTag_ElectionProofProduction, round, buf.Bytes())
if err != nil {
return nil, xerrors.Errorf("failed to get miner worker: %w", err)
return nil, xerrors.Errorf("failed to draw randomness: %w", err)
}
vrfout, err := ComputeVRF(ctx, a.WalletSign, mworker, miner, DSepElectionPost, r)
vrfout, err := ComputeVRF(ctx, a.WalletSign, mbi.WorkerKey, electionRand)
if err != nil {
return nil, xerrors.Errorf("failed to compute VRF: %w", err)
}
pset, err := a.StateMinerProvingSet(ctx, miner, ts.Key())
if err != nil {
return nil, xerrors.Errorf("failed to load proving set for miner: %w", err)
}
if len(pset) == 0 {
// TODO: wire in real power
if !types.IsTicketWinner(vrfout, mbi.MinerPower, mbi.NetworkPower) {
return nil, nil
}
var sinfos []ffi.PublicSectorInfo
for _, s := range pset {
var commRa [32]byte
copy(commRa[:], s.CommR)
sinfos = append(sinfos, ffi.PublicSectorInfo{
SectorID: s.SectorID,
CommR: commRa,
})
}
sectors := sectorbuilder.NewSortedPublicSectorInfo(sinfos)
hvrf := sha256.Sum256(vrfout)
candidates, err := epp.GenerateCandidates(ctx, sectors, hvrf[:])
if err != nil {
return nil, xerrors.Errorf("failed to generate electionPoSt candidates: %w", err)
}
pow, err := a.StateMinerPower(ctx, miner, ts.Key())
if err != nil {
return nil, xerrors.Errorf("failed to check power: %w", err)
}
ssize, err := a.StateMinerSectorSize(ctx, miner, ts.Key())
if err != nil {
return nil, xerrors.Errorf("failed to look up miners sector size: %w", err)
}
var winners []sectorbuilder.EPostCandidate
for _, c := range candidates {
if types.IsTicketWinner(c.PartialTicket[:], ssize, uint64(len(sinfos)), pow.TotalPower) {
winners = append(winners, c)
}
}
// no winners, sad
if len(winners) == 0 {
return nil, nil
}
return &ProofInput{
sectors: sectors,
hvrf: hvrf[:],
winners: winners,
vrfout: vrfout,
}, nil
return &types.ElectionProof{VRFProof: vrfout}, nil
}
func ComputeProof(ctx context.Context, epp ElectionPoStProver, pi *ProofInput) (*types.EPostProof, error) {
proof, err := epp.ComputeProof(ctx, pi.sectors, pi.hvrf, pi.winners)
if err != nil {
return nil, xerrors.Errorf("failed to compute snark for election proof: %w", err)
}
type SignFunc func(context.Context, address.Address, []byte) (*crypto.Signature, error)
ept := types.EPostProof{
Proof: proof,
PostRand: pi.vrfout,
}
for _, win := range pi.winners {
part := make([]byte, 32)
copy(part, win.PartialTicket[:])
ept.Candidates = append(ept.Candidates, types.EPostTicket{
Partial: part,
SectorID: win.SectorID,
ChallengeIndex: win.SectorChallengeIndex,
})
}
return &ept, nil
}
type SignFunc func(context.Context, address.Address, []byte) (*types.Signature, error)
const (
DSepTicket = 1
DSepElectionPost = 2
)
func hashVRFBase(personalization uint64, miner address.Address, input []byte) ([]byte, error) {
if miner.Protocol() != address.ID {
return nil, xerrors.Errorf("miner address for compute VRF must be an ID address")
}
var persbuf [8]byte
binary.LittleEndian.PutUint64(persbuf[:], personalization)
h := sha256.New()
h.Write(persbuf[:])
h.Write([]byte{0})
h.Write(input)
h.Write([]byte{0})
h.Write(miner.Bytes())
return h.Sum(nil), nil
}
func VerifyVRF(ctx context.Context, worker, miner address.Address, p uint64, input, vrfproof []byte) error {
func VerifyVRF(ctx context.Context, worker address.Address, vrfBase, vrfproof []byte) error {
_, span := trace.StartSpan(ctx, "VerifyVRF")
defer span.End()
vrfBase, err := hashVRFBase(p, miner, input)
if err != nil {
return xerrors.Errorf("computing vrf base failed: %w", err)
}
sig := &types.Signature{
Type: types.KTBLS,
sig := &crypto.Signature{
Type: crypto.SigTypeBLS,
Data: vrfproof,
}
@@ -653,20 +584,35 @@ func VerifyVRF(ctx context.Context, worker, miner address.Address, p uint64, inp
return nil
}
func ComputeVRF(ctx context.Context, sign SignFunc, worker, miner address.Address, p uint64, input []byte) ([]byte, error) {
sigInput, err := hashVRFBase(p, miner, input)
if err != nil {
return nil, err
}
func ComputeVRF(ctx context.Context, sign SignFunc, worker address.Address, sigInput []byte) ([]byte, error) {
sig, err := sign(ctx, worker, sigInput)
if err != nil {
return nil, err
}
if sig.Type != types.KTBLS {
if sig.Type != crypto.SigTypeBLS {
return nil, fmt.Errorf("miner worker address was not a BLS key")
}
return sig.Data, nil
}
type genFakeVerifier struct{}
var _ ffiwrapper.Verifier = (*genFakeVerifier)(nil)
func (m genFakeVerifier) VerifySeal(svi abi.SealVerifyInfo) (bool, error) {
return true, nil
}
func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info abi.WinningPoStVerifyInfo) (bool, error) {
panic("not supported")
}
func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info abi.WindowPoStVerifyInfo) (bool, error) {
panic("not supported")
}
func (m genFakeVerifier) GenerateWinningPoStSectorChallenge(ctx context.Context, proof abi.RegisteredPoStProof, id abi.ActorID, randomness abi.PoStRandomness, u uint64) ([]uint64, error) {
panic("not supported")
}
+21 -12
View File
@@ -3,20 +3,28 @@ package gen
import (
"testing"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
_ "github.com/filecoin-project/lotus/lib/sigs/bls"
_ "github.com/filecoin-project/lotus/lib/sigs/secp"
)
func init() {
build.SectorSizes = []uint64{1024}
build.MinimumMinerPower = 1024
miner.SupportedProofTypes = map[abi.RegisteredSealProof]struct{}{
abi.RegisteredSealProof_StackedDrg2KiBV1: {},
}
power.ConsensusMinerMinPower = big.NewInt(2048)
verifreg.MinVerifiedDealSize = big.NewInt(256)
}
func testGeneration(t testing.TB, n int, msgs int) {
g, err := NewGenerator()
func testGeneration(t testing.TB, n int, msgs int, sectors int) {
g, err := NewGeneratorWithSectors(sectors)
if err != nil {
t.Fatal(err)
t.Fatalf("%+v", err)
}
g.msgsPerBlock = msgs
@@ -24,30 +32,31 @@ func testGeneration(t testing.TB, n int, msgs int) {
for i := 0; i < n; i++ {
mts, err := g.NextTipSet()
if err != nil {
t.Fatalf("error at H:%d, %s", i, err)
t.Fatalf("error at H:%d, %+v", i, err)
}
_ = mts
}
}
func TestChainGeneration(t *testing.T) {
testGeneration(t, 10, 20)
testGeneration(t, 10, 20, 1)
testGeneration(t, 10, 20, 25)
}
func BenchmarkChainGeneration(b *testing.B) {
b.Run("0-messages", func(b *testing.B) {
testGeneration(b, b.N, 0)
testGeneration(b, b.N, 0, 1)
})
b.Run("10-messages", func(b *testing.B) {
testGeneration(b, b.N, 10)
testGeneration(b, b.N, 10, 1)
})
b.Run("100-messages", func(b *testing.B) {
testGeneration(b, b.N, 100)
testGeneration(b, b.N, 100, 1)
})
b.Run("1000-messages", func(b *testing.B) {
testGeneration(b, b.N, 1000)
testGeneration(b, b.N, 1000, 1)
})
}
+370
View File
@@ -0,0 +1,370 @@
package genesis
import (
"context"
"encoding/json"
"github.com/filecoin-project/go-amt-ipld/v2"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/account"
"github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
"github.com/filecoin-project/specs-actors/actors/runtime"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-datastore"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
logging "github.com/ipfs/go-log/v2"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
"github.com/filecoin-project/lotus/genesis"
)
const AccountStart = 100
const MinerStart = 1000
const MaxAccounts = MinerStart - AccountStart
var log = logging.Logger("genesis")
type GenesisBootstrap struct {
Genesis *types.BlockHeader
}
/*
From a list of parameters, create a genesis block / initial state
The process:
- Bootstrap state (MakeInitialStateTree)
- Create empty state
- Create system actor
- Make init actor
- Create accounts mappings
- Set NextID to MinerStart
- Setup Reward (1.4B fil)
- Setup Cron
- Create empty power actor
- Create empty market
- Create verified registry
- Setup burnt fund address
- Initialize account / msig balances
- Instantiate early vm with genesis syscalls
- Create miners
- Each:
- power.CreateMiner, set msg value to PowerBalance
- market.AddFunds with correct value
- market.PublishDeals for related sectors
- Set precommits
- Commit presealed sectors
Data Types:
PreSeal :{
CommR CID
CommD CID
SectorID SectorNumber
Deal market.DealProposal # Start at 0, self-deal!
}
Genesis: {
Accounts: [ # non-miner, non-singleton actors, max len = MaxAccounts
{
Type: "account" / "multisig",
Value: "attofil",
[Meta: {msig settings, account key..}]
},...
],
Miners: [
{
Owner, Worker Addr # ID
MarketBalance, PowerBalance TokenAmount
SectorSize uint64
PreSeals []PreSeal
},...
],
}
*/
func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template genesis.Template) (*state.StateTree, error) {
// Create empty state tree
cst := cbor.NewCborStore(bs)
_, err := cst.Put(context.TODO(), []struct{}{})
if err != nil {
return nil, xerrors.Errorf("putting empty object: %w", err)
}
state, err := state.NewStateTree(cst)
if err != nil {
return nil, xerrors.Errorf("making new state tree: %w", err)
}
emptyobject, err := cst.Put(context.TODO(), []struct{}{})
if err != nil {
return nil, xerrors.Errorf("failed putting empty object: %w", err)
}
// Create system actor
sysact, err := SetupSystemActor(bs)
if err != nil {
return nil, xerrors.Errorf("setup init actor: %w", err)
}
if err := state.SetActor(builtin.SystemActorAddr, sysact); err != nil {
return nil, xerrors.Errorf("set init actor: %w", err)
}
// Create init actor
initact, err := SetupInitActor(bs, template.NetworkName, template.Accounts)
if err != nil {
return nil, xerrors.Errorf("setup init actor: %w", err)
}
if err := state.SetActor(builtin.InitActorAddr, initact); err != nil {
return nil, xerrors.Errorf("set init actor: %w", err)
}
// Setup reward
rewact, err := SetupRewardActor(bs)
if err != nil {
return nil, xerrors.Errorf("setup init actor: %w", err)
}
err = state.SetActor(builtin.RewardActorAddr, rewact)
if err != nil {
return nil, xerrors.Errorf("set network account actor: %w", err)
}
// Setup cron
cronact, err := SetupCronActor(bs)
if err != nil {
return nil, xerrors.Errorf("setup cron actor: %w", err)
}
if err := state.SetActor(builtin.CronActorAddr, cronact); err != nil {
return nil, xerrors.Errorf("set cron actor: %w", err)
}
// Create empty power actor
spact, err := SetupStoragePowerActor(bs)
if err != nil {
return nil, xerrors.Errorf("setup storage market actor: %w", err)
}
if err := state.SetActor(builtin.StoragePowerActorAddr, spact); err != nil {
return nil, xerrors.Errorf("set storage market actor: %w", err)
}
// Create empty market actor
marketact, err := SetupStorageMarketActor(bs)
if err != nil {
return nil, xerrors.Errorf("setup storage market actor: %w", err)
}
if err := state.SetActor(builtin.StorageMarketActorAddr, marketact); err != nil {
return nil, xerrors.Errorf("set market actor: %w", err)
}
// Create verified registry
verifact, err := SetupVerifiedRegistryActor(bs)
if err != nil {
return nil, xerrors.Errorf("setup storage market actor: %w", err)
}
if err := state.SetActor(builtin.VerifiedRegistryActorAddr, verifact); err != nil {
return nil, xerrors.Errorf("set market actor: %w", err)
}
// Setup burnt-funds
err = state.SetActor(builtin.BurntFundsActorAddr, &types.Actor{
Code: builtin.AccountActorCodeID,
Balance: types.NewInt(0),
Head: emptyobject,
})
if err != nil {
return nil, xerrors.Errorf("set burnt funds account actor: %w", err)
}
// Create accounts
for id, info := range template.Accounts {
if info.Type != genesis.TAccount {
return nil, xerrors.New("unsupported account type") // TODO: msigs
}
ida, err := address.NewIDAddress(uint64(AccountStart + id))
if err != nil {
return nil, err
}
var ainfo genesis.AccountMeta
if err := json.Unmarshal(info.Meta, &ainfo); err != nil {
return nil, xerrors.Errorf("unmarshaling account meta: %w", err)
}
st, err := cst.Put(ctx, &account.State{Address: ainfo.Owner})
if err != nil {
return nil, err
}
err = state.SetActor(ida, &types.Actor{
Code: builtin.AccountActorCodeID,
Balance: info.Balance,
Head: st,
})
if err != nil {
return nil, xerrors.Errorf("setting account from actmap: %w", err)
}
}
vregroot, err := address.NewIDAddress(80)
if err != nil {
return nil, err
}
vrst, err := cst.Put(ctx, &account.State{Address: RootVerifierAddr})
if err != nil {
return nil, err
}
err = state.SetActor(vregroot, &types.Actor{
Code: builtin.AccountActorCodeID,
Balance: types.NewInt(0),
Head: vrst,
})
if err != nil {
return nil, xerrors.Errorf("setting account from actmap: %w", err)
}
return state, nil
}
func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, stateroot cid.Cid, template genesis.Template) (cid.Cid, error) {
verifNeeds := make(map[address.Address]abi.PaddedPieceSize)
var sum abi.PaddedPieceSize
for _, m := range template.Miners {
for _, s := range m.Sectors {
amt := s.Deal.PieceSize
verifNeeds[s.Deal.Client] += amt
sum += amt
}
}
verifier, err := address.NewIDAddress(80)
if err != nil {
return cid.Undef, err
}
vm, err := vm.NewVM(stateroot, 0, &fakeRand{}, cs.Blockstore(), &fakedSigSyscalls{cs.VMSys()})
if err != nil {
return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err)
}
_, err = doExecValue(ctx, vm, builtin.VerifiedRegistryActorAddr, RootVerifierAddr, types.NewInt(0), builtin.MethodsVerifiedRegistry.AddVerifier, mustEnc(&verifreg.AddVerifierParams{
Address: verifier,
Allowance: abi.NewStoragePower(int64(sum)), // eh, close enough
}))
if err != nil {
return cid.Undef, xerrors.Errorf("failed to failed to create verifier: %w", err)
}
for c, amt := range verifNeeds {
_, err := doExecValue(ctx, vm, builtin.VerifiedRegistryActorAddr, verifier, types.NewInt(0), builtin.MethodsVerifiedRegistry.AddVerifiedClient, mustEnc(&verifreg.AddVerifiedClientParams{
Address: c,
Allowance: abi.NewStoragePower(int64(amt)),
}))
if err != nil {
return cid.Undef, xerrors.Errorf("failed to add verified client: %w", err)
}
}
return vm.Flush(ctx)
}
func MakeGenesisBlock(ctx context.Context, bs bstore.Blockstore, sys runtime.Syscalls, template genesis.Template) (*GenesisBootstrap, error) {
st, err := MakeInitialStateTree(ctx, bs, template)
if err != nil {
return nil, xerrors.Errorf("make initial state tree failed: %w", err)
}
stateroot, err := st.Flush(ctx)
if err != nil {
return nil, xerrors.Errorf("flush state tree failed: %w", err)
}
// temp chainstore
cs := store.NewChainStore(bs, datastore.NewMapDatastore(), sys)
// Verify PreSealed Data
stateroot, err = VerifyPreSealedData(ctx, cs, stateroot, template)
if err != nil {
return nil, xerrors.Errorf("failed to verify presealed data: %w", err)
}
stateroot, err = SetupStorageMiners(ctx, cs, stateroot, template.Miners)
if err != nil {
return nil, xerrors.Errorf("setup storage miners failed: %w", err)
}
cst := cbor.NewCborStore(bs)
emptyroot, err := amt.FromArray(ctx, cst, nil)
if err != nil {
return nil, xerrors.Errorf("amt build failed: %w", err)
}
mm := &types.MsgMeta{
BlsMessages: emptyroot,
SecpkMessages: emptyroot,
}
mmb, err := mm.ToStorageBlock()
if err != nil {
return nil, xerrors.Errorf("serializing msgmeta failed: %w", err)
}
if err := bs.Put(mmb); err != nil {
return nil, xerrors.Errorf("putting msgmeta block to blockstore: %w", err)
}
log.Infof("Empty Genesis root: %s", emptyroot)
genesisticket := &types.Ticket{
VRFProof: []byte("vrf proof0000000vrf proof0000000"),
}
b := &types.BlockHeader{
Miner: builtin.SystemActorAddr,
Ticket: genesisticket,
Parents: []cid.Cid{},
Height: 0,
ParentWeight: types.NewInt(0),
ParentStateRoot: stateroot,
Messages: mmb.Cid(),
ParentMessageReceipts: emptyroot,
BLSAggregate: nil,
BlockSig: nil,
Timestamp: template.Timestamp,
ElectionProof: new(types.ElectionProof),
BeaconEntries: []types.BeaconEntry{
{
Round: 0,
Data: make([]byte, 32),
},
},
}
sb, err := b.ToStorageBlock()
if err != nil {
return nil, xerrors.Errorf("serializing block header failed: %w", err)
}
if err := bs.Put(sb); err != nil {
return nil, xerrors.Errorf("putting header to blockstore: %w", err)
}
return &GenesisBootstrap{
Genesis: b,
}, nil
}
+263
View File
@@ -0,0 +1,263 @@
package genesis
import (
"bytes"
"context"
"fmt"
"math/rand"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/sector-storage/ffiwrapper"
"github.com/filecoin-project/specs-actors/actors/abi"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/market"
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/crypto"
"github.com/filecoin-project/specs-actors/actors/runtime"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
"github.com/filecoin-project/lotus/genesis"
)
func MinerAddress(genesisIndex uint64) address.Address {
maddr, err := address.NewIDAddress(MinerStart + genesisIndex)
if err != nil {
panic(err)
}
return maddr
}
type fakedSigSyscalls struct {
runtime.Syscalls
}
func (fss *fakedSigSyscalls) VerifySignature(signature crypto.Signature, signer address.Address, plaintext []byte) error {
return nil
}
func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sroot cid.Cid, miners []genesis.Miner) (cid.Cid, error) {
vm, err := vm.NewVM(sroot, 0, &fakeRand{}, cs.Blockstore(), &fakedSigSyscalls{cs.VMSys()})
if err != nil {
return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err)
}
if len(miners) == 0 {
return cid.Undef, xerrors.New("no genesis miners")
}
for i, m := range miners {
// Create miner through power actor
i := i
m := m
spt, err := ffiwrapper.SealProofTypeFromSectorSize(m.SectorSize)
if err != nil {
return cid.Undef, err
}
var maddr address.Address
{
constructorParams := &power.CreateMinerParams{
Owner: m.Worker,
Worker: m.Worker,
Peer: []byte(m.PeerId),
SealProofType: spt,
}
params := mustEnc(constructorParams)
rval, err := doExecValue(ctx, vm, builtin.StoragePowerActorAddr, m.Owner, m.PowerBalance, builtin.MethodsPower.CreateMiner, params)
if err != nil {
return cid.Undef, xerrors.Errorf("failed to create genesis miner: %w", err)
}
var ma power.CreateMinerReturn
if err := ma.UnmarshalCBOR(bytes.NewReader(rval)); err != nil {
return cid.Undef, xerrors.Errorf("unmarshaling CreateMinerReturn: %w", err)
}
expma := MinerAddress(uint64(i))
if ma.IDAddress != expma {
return cid.Undef, xerrors.Errorf("miner assigned wrong address: %s != %s", ma.IDAddress, expma)
}
maddr = ma.IDAddress
}
// Add market funds
{
params := mustEnc(&maddr)
_, err := doExecValue(ctx, vm, builtin.StorageMarketActorAddr, m.Worker, m.MarketBalance, builtin.MethodsMarket.AddBalance, params)
if err != nil {
return cid.Undef, xerrors.Errorf("failed to create genesis miner: %w", err)
}
}
{
params := mustEnc(&m.Worker)
_, err := doExecValue(ctx, vm, builtin.StorageMarketActorAddr, m.Worker, big.Zero(), builtin.MethodsMarket.AddBalance, params)
if err != nil {
return cid.Undef, xerrors.Errorf("failed to create genesis miner: %w", err)
}
}
// Publish preseal deals
var dealIDs []abi.DealID
{
publish := func(params *market.PublishStorageDealsParams) error {
fmt.Printf("publishing %d storage deals on miner %s with worker %s\n", len(params.Deals), params.Deals[0].Proposal.Provider, m.Worker)
ret, err := doExecValue(ctx, vm, builtin.StorageMarketActorAddr, m.Worker, big.Zero(), builtin.MethodsMarket.PublishStorageDeals, mustEnc(params))
if err != nil {
return xerrors.Errorf("failed to create genesis miner: %w", err)
}
var ids market.PublishStorageDealsReturn
if err := ids.UnmarshalCBOR(bytes.NewReader(ret)); err != nil {
return xerrors.Errorf("unmarsahling publishStorageDeals result: %w", err)
}
dealIDs = append(dealIDs, ids.IDs...)
return nil
}
params := &market.PublishStorageDealsParams{}
for _, preseal := range m.Sectors {
preseal.Deal.VerifiedDeal = true
params.Deals = append(params.Deals, market.ClientDealProposal{
Proposal: preseal.Deal,
ClientSignature: crypto.Signature{Type: crypto.SigTypeBLS}, // TODO: do we want to sign these? Or do we want to fake signatures for genesis setup?
})
if len(params.Deals) == cbg.MaxLength {
if err := publish(params); err != nil {
return cid.Undef, err
}
params = &market.PublishStorageDealsParams{}
}
}
if len(params.Deals) > 0 {
if err := publish(params); err != nil {
return cid.Undef, err
}
}
}
// Commit sectors
for pi, preseal := range m.Sectors {
preseal := preseal
// TODO: Maybe check seal (Can just be snark inputs, doesn't go into the genesis file)
// check deals, get dealWeight
var dealWeight market.VerifyDealsOnSectorProveCommitReturn
{
params := &market.VerifyDealsOnSectorProveCommitParams{
DealIDs: []abi.DealID{dealIDs[pi]},
SectorExpiry: preseal.Deal.EndEpoch,
}
ret, err := doExecValue(ctx, vm, builtin.StorageMarketActorAddr, maddr, big.Zero(), builtin.MethodsMarket.VerifyDealsOnSectorProveCommit, mustEnc(params))
if err != nil {
return cid.Undef, xerrors.Errorf("failed to verify preseal deals miner: %w", err)
}
if err := dealWeight.UnmarshalCBOR(bytes.NewReader(ret)); err != nil {
return cid.Undef, xerrors.Errorf("unmarshaling market onProveCommit result: %w", err)
}
}
// update power claims
{
err = vm.MutateState(ctx, builtin.StoragePowerActorAddr, func(cst cbor.IpldStore, st *power.State) error {
weight := &power.SectorStorageWeightDesc{
SectorSize: m.SectorSize,
Duration: preseal.Deal.Duration(),
DealWeight: dealWeight.DealWeight,
VerifiedDealWeight: dealWeight.VerifiedDealWeight,
}
qapower := power.QAPowerForWeight(weight)
err := st.AddToClaim(&state.AdtStore{cst}, maddr, types.NewInt(uint64(weight.SectorSize)), qapower)
if err != nil {
return xerrors.Errorf("add to claim: %w", err)
}
fmt.Println("Added weight to claim: ", st.TotalRawBytePower, st.TotalQualityAdjPower)
return nil
})
if err != nil {
return cid.Undef, xerrors.Errorf("register power claim in power actor: %w", err)
}
}
// Put sectors to miner sector sets
{
newSectorInfo := &miner.SectorOnChainInfo{
Info: miner.SectorPreCommitInfo{
SealProof: preseal.ProofType,
SectorNumber: preseal.SectorID,
SealedCID: preseal.CommR,
SealRandEpoch: 0,
DealIDs: []abi.DealID{dealIDs[pi]},
Expiration: preseal.Deal.EndEpoch,
},
ActivationEpoch: 0,
DealWeight: dealWeight.DealWeight,
VerifiedDealWeight: dealWeight.VerifiedDealWeight,
}
err = vm.MutateState(ctx, maddr, func(cst cbor.IpldStore, st *miner.State) error {
store := &state.AdtStore{cst}
if err = st.PutSector(store, newSectorInfo); err != nil {
return xerrors.Errorf("failed to put sector: %v", err)
}
if err := st.AddNewSectors(newSectorInfo.Info.SectorNumber); err != nil {
return xerrors.Errorf("failed to add NewSector: %w", err)
}
return nil
})
if err != nil {
return cid.Cid{}, xerrors.Errorf("put to sset: %w", err)
}
}
}
}
// TODO: to avoid division by zero, we set the initial power actor power to 1, this adjusts that back down so the accounting is accurate.
err = vm.MutateState(ctx, builtin.StoragePowerActorAddr, func(cst cbor.IpldStore, st *power.State) error {
st.TotalQualityAdjPower = big.Sub(st.TotalQualityAdjPower, big.NewInt(1))
return nil
})
if err != nil {
return cid.Undef, xerrors.Errorf("mutating state: %w", err)
}
c, err := vm.Flush(ctx)
if err != nil {
return cid.Undef, xerrors.Errorf("flushing vm: %w", err)
}
return c, nil
}
// TODO: copied from actors test harness, deduplicate or remove from here
type fakeRand struct{}
func (fr *fakeRand) GetRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) {
out := make([]byte, 32)
_, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out)
return out, nil
}
+29
View File
@@ -0,0 +1,29 @@
package genesis
import (
"context"
"github.com/filecoin-project/specs-actors/actors/builtin/system"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/builtin"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
)
func SetupSystemActor(bs bstore.Blockstore) (*types.Actor, error) {
var st system.State
cst := cbor.NewCborStore(bs)
statecid, err := cst.Put(context.TODO(), &st)
if err != nil {
return nil, err
}
act := &types.Actor{
Code: builtin.SystemActorCodeID,
Head: statecid,
}
return act, nil
}
+74
View File
@@ -0,0 +1,74 @@
package genesis
import (
"context"
"encoding/json"
"fmt"
"github.com/filecoin-project/specs-actors/actors/builtin"
init_ "github.com/filecoin-project/specs-actors/actors/builtin/init"
"github.com/ipfs/go-hamt-ipld"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/genesis"
)
func SetupInitActor(bs bstore.Blockstore, netname string, initialActors []genesis.Actor) (*types.Actor, error) {
if len(initialActors) > MaxAccounts {
return nil, xerrors.New("too many initial actors")
}
var ias init_.State
ias.NextID = MinerStart
ias.NetworkName = netname
cst := cbor.NewCborStore(bs)
amap := hamt.NewNode(cst, hamt.UseTreeBitWidth(5)) // TODO: use spec adt map
for i, a := range initialActors {
if a.Type != genesis.TAccount {
return nil, xerrors.Errorf("unsupported account type: %s", a.Type) // TODO: Support msig (skip here)
}
var ainfo genesis.AccountMeta
if err := json.Unmarshal(a.Meta, &ainfo); err != nil {
return nil, xerrors.Errorf("unmarshaling account meta: %w", err)
}
fmt.Printf("init set %s t0%d\n", ainfo.Owner, AccountStart+uint64(i))
if err := amap.Set(context.TODO(), string(ainfo.Owner.Bytes()), AccountStart+uint64(i)); err != nil {
return nil, err
}
}
if err := amap.Set(context.TODO(), string(RootVerifierAddr.Bytes()), 80); err != nil {
return nil, err
}
if err := amap.Flush(context.TODO()); err != nil {
return nil, err
}
amapcid, err := cst.Put(context.TODO(), amap)
if err != nil {
return nil, err
}
ias.AddressMap = amapcid
statecid, err := cst.Put(context.TODO(), &ias)
if err != nil {
return nil, err
}
act := &types.Actor{
Code: builtin.InitActorCodeID,
Head: statecid,
}
return act, nil
}
+30
View File
@@ -0,0 +1,30 @@
package genesis
import (
"context"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/reward"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
)
func SetupRewardActor(bs bstore.Blockstore) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
st := reward.ConstructState()
st.LastPerEpochReward = types.FromFil(100)
hcid, err := cst.Put(context.TODO(), st)
if err != nil {
return nil, err
}
return &types.Actor{
Code: builtin.RewardActorCodeID,
Balance: types.BigInt{Int: build.InitialRewardBalance},
Head: hcid,
}, nil
}
+29
View File
@@ -0,0 +1,29 @@
package genesis
import (
"context"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/cron"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/lotus/chain/types"
)
func SetupCronActor(bs bstore.Blockstore) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
cas := cron.ConstructState(cron.BuiltInEntries())
stcid, err := cst.Put(context.TODO(), cas)
if err != nil {
return nil, err
}
return &types.Actor{
Code: builtin.CronActorCodeID,
Head: stcid,
Nonce: 0,
Balance: types.NewInt(0),
}, nil
}
+47
View File
@@ -0,0 +1,47 @@
package genesis
import (
"context"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/abi/big"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/ipfs/go-hamt-ipld"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/lotus/chain/types"
)
func SetupStoragePowerActor(bs bstore.Blockstore) (*types.Actor, error) {
ctx := context.TODO()
cst := cbor.NewCborStore(bs)
nd := hamt.NewNode(cst, hamt.UseTreeBitWidth(5))
emptyhamt, err := cst.Put(ctx, nd)
if err != nil {
return nil, err
}
sms := &power.State{
TotalRawBytePower: big.NewInt(0),
TotalQualityAdjPower: big.NewInt(1), // TODO: has to be 1 initially to avoid div by zero. Kinda annoying, should find a way to fix
TotalPledgeCollateral: big.NewInt(0),
MinerCount: 0,
CronEventQueue: emptyhamt,
LastEpochTick: 0,
Claims: emptyhamt,
NumMinersMeetingMinPower: 0,
}
stcid, err := cst.Put(ctx, sms)
if err != nil {
return nil, err
}
return &types.Actor{
Code: builtin.StoragePowerActorCodeID,
Head: stcid,
Nonce: 0,
Balance: types.NewInt(0),
}, nil
}
+42
View File
@@ -0,0 +1,42 @@
package genesis
import (
"context"
"github.com/ipfs/go-hamt-ipld"
"github.com/filecoin-project/go-amt-ipld/v2"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/market"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/lotus/chain/types"
)
func SetupStorageMarketActor(bs bstore.Blockstore) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
a, err := amt.NewAMT(cst).Flush(context.TODO())
if err != nil {
return nil, err
}
h, err := cst.Put(context.TODO(), hamt.NewNode(cst, hamt.UseTreeBitWidth(5)))
if err != nil {
return nil, err
}
sms := market.ConstructState(a, h, h)
stcid, err := cst.Put(context.TODO(), sms)
if err != nil {
return nil, err
}
act := &types.Actor{
Code: builtin.StorageMarketActorCodeID,
Head: stcid,
Balance: types.NewInt(0),
}
return act, nil
}
+59
View File
@@ -0,0 +1,59 @@
package genesis
import (
"context"
"github.com/filecoin-project/go-address"
"github.com/ipfs/go-hamt-ipld"
bstore "github.com/ipfs/go-ipfs-blockstore"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
"github.com/filecoin-project/lotus/chain/types"
)
var RootVerifierAddr address.Address
var RootVerifierID address.Address
func init() {
k, err := address.NewFromString("t3qfoulel6fy6gn3hjmbhpdpf6fs5aqjb5fkurhtwvgssizq4jey5nw4ptq5up6h7jk7frdvvobv52qzmgjinq")
if err != nil {
panic(err)
}
RootVerifierAddr = k
idk, err := address.NewFromString("t080")
if err != nil {
panic(err)
}
RootVerifierID = idk
}
func SetupVerifiedRegistryActor(bs bstore.Blockstore) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
h, err := cst.Put(context.TODO(), hamt.NewNode(cst, hamt.UseTreeBitWidth(5)))
if err != nil {
return nil, err
}
sms := verifreg.ConstructState(h, RootVerifierID)
stcid, err := cst.Put(context.TODO(), sms)
if err != nil {
return nil, err
}
act := &types.Actor{
Code: builtin.VerifiedRegistryActorCodeID,
Head: stcid,
Balance: types.NewInt(0),
}
return act, nil
}
+53
View File
@@ -0,0 +1,53 @@
package genesis
import (
"context"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/specs-actors/actors/abi"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
)
func mustEnc(i cbg.CBORMarshaler) []byte {
enc, err := actors.SerializeParams(i)
if err != nil {
panic(err) // ok
}
return enc
}
func doExec(ctx context.Context, vm *vm.VM, to, from address.Address, method abi.MethodNum, params []byte) ([]byte, error) {
return doExecValue(ctx, vm, to, from, types.NewInt(0), method, params)
}
func doExecValue(ctx context.Context, vm *vm.VM, to, from address.Address, value types.BigInt, method abi.MethodNum, params []byte) ([]byte, error) {
act, err := vm.StateTree().GetActor(from)
if err != nil {
return nil, xerrors.Errorf("doExec failed to get from actor: %w", err)
}
ret, err := vm.ApplyImplicitMessage(ctx, &types.Message{
To: to,
From: from,
Method: method,
Params: params,
GasLimit: 1_000_000_000_000_000,
GasPrice: types.NewInt(0),
Value: value,
Nonce: act.Nonce,
})
if err != nil {
return nil, xerrors.Errorf("doExec apply message failed: %w", err)
}
if ret.ExitCode != 0 {
return nil, xerrors.Errorf("failed to call method: %w", ret.ActorErr)
}
return ret.Return, nil
}
+45 -24
View File
@@ -4,13 +4,14 @@ import (
"context"
bls "github.com/filecoin-project/filecoin-ffi"
amt "github.com/filecoin-project/go-amt-ipld"
amt "github.com/filecoin-project/go-amt-ipld/v2"
"github.com/filecoin-project/specs-actors/actors/crypto"
cid "github.com/ipfs/go-cid"
hamt "github.com/ipfs/go-hamt-ipld"
cbor "github.com/ipfs/go-ipld-cbor"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/types"
@@ -18,24 +19,33 @@ import (
"github.com/filecoin-project/lotus/chain/wallet"
)
func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wallet, miner address.Address, parents *types.TipSet, ticket *types.Ticket, proof *types.EPostProof, msgs []*types.SignedMessage, height, timestamp uint64) (*types.FullBlock, error) {
st, recpts, err := sm.TipSetState(ctx, parents)
func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wallet, bt *api.BlockTemplate) (*types.FullBlock, error) {
pts, err := sm.ChainStore().LoadTipSet(bt.Parents)
if err != nil {
return nil, xerrors.Errorf("failed to load parent tipset: %w", err)
}
st, recpts, err := sm.TipSetState(ctx, pts)
if err != nil {
return nil, xerrors.Errorf("failed to load tipset state: %w", err)
}
worker, err := stmgr.GetMinerWorkerRaw(ctx, sm, st, miner)
worker, err := stmgr.GetMinerWorkerRaw(ctx, sm, st, bt.Miner)
if err != nil {
return nil, xerrors.Errorf("failed to get miner worker: %w", err)
}
next := &types.BlockHeader{
Miner: miner,
Parents: parents.Cids(),
Ticket: ticket,
Height: height,
Timestamp: timestamp,
EPostProof: *proof,
Miner: bt.Miner,
Parents: bt.Parents.Cids(),
Ticket: bt.Ticket,
ElectionProof: bt.Eproof,
BeaconEntries: bt.BeaconValues,
Height: bt.Epoch,
Timestamp: bt.Timestamp,
WinPoStProof: bt.WinningPoStProof,
ParentStateRoot: st,
ParentMessageReceipts: recpts,
}
@@ -44,9 +54,9 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wal
var secpkMessages []*types.SignedMessage
var blsMsgCids, secpkMsgCids []cid.Cid
var blsSigs []types.Signature
for _, msg := range msgs {
if msg.Signature.TypeCode() == types.IKTBLS {
var blsSigs []crypto.Signature
for _, msg := range bt.Messages {
if msg.Signature.Type == crypto.SigTypeBLS {
blsSigs = append(blsSigs, msg.Signature)
blsMessages = append(blsMessages, &msg.Message)
@@ -68,17 +78,17 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wal
}
}
bs := amt.WrapBlockstore(sm.ChainStore().Blockstore())
blsmsgroot, err := amt.FromArray(bs, toIfArr(blsMsgCids))
bs := cbor.NewCborStore(sm.ChainStore().Blockstore())
blsmsgroot, err := amt.FromArray(ctx, bs, toIfArr(blsMsgCids))
if err != nil {
return nil, xerrors.Errorf("building bls amt: %w", err)
}
secpkmsgroot, err := amt.FromArray(bs, toIfArr(secpkMsgCids))
secpkmsgroot, err := amt.FromArray(ctx, bs, toIfArr(secpkMsgCids))
if err != nil {
return nil, xerrors.Errorf("building secpk amt: %w", err)
}
mmcid, err := bs.Put(&types.MsgMeta{
mmcid, err := bs.Put(ctx, &types.MsgMeta{
BlsMessages: blsmsgroot,
SecpkMessages: secpkmsgroot,
})
@@ -93,13 +103,13 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wal
}
next.BLSAggregate = aggSig
pweight, err := sm.ChainStore().Weight(ctx, parents)
pweight, err := sm.ChainStore().Weight(ctx, pts)
if err != nil {
return nil, err
}
next.ParentWeight = pweight
cst := hamt.CSTFromBstore(sm.ChainStore().Blockstore())
cst := cbor.NewCborStore(sm.ChainStore().Blockstore())
tree, err := state.LoadStateTree(cst, st)
if err != nil {
return nil, xerrors.Errorf("failed to load state tree: %w", err)
@@ -131,7 +141,7 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w *wallet.Wal
return fullBlock, nil
}
func aggregateSignatures(sigs []types.Signature) (types.Signature, error) {
func aggregateSignatures(sigs []crypto.Signature) (*crypto.Signature, error) {
var blsSigs []bls.Signature
for _, s := range sigs {
var bsig bls.Signature
@@ -140,8 +150,19 @@ func aggregateSignatures(sigs []types.Signature) (types.Signature, error) {
}
aggSig := bls.Aggregate(blsSigs)
return types.Signature{
Type: types.KTBLS,
if aggSig == nil {
if len(sigs) > 0 {
return nil, xerrors.Errorf("bls.Aggregate returned nil with %d signatures", len(sigs))
}
return &crypto.Signature{
Type: crypto.SigTypeBLS,
Data: new(bls.Signature)[:],
}, nil
}
return &crypto.Signature{
Type: crypto.SigTypeBLS,
Data: aggSig[:],
}, nil
}

Some files were not shown because too many files have changed in this diff Show More