-
Notifications
You must be signed in to change notification settings - Fork 1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PeerDAS: Re-enable full node joining the main fork #14475
Conversation
Reason: `Join` makes a carriage return. The log is quite unreadable.
ef8a305
to
46a1839
Compare
Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks.
…tead of `struct{}`.
46a1839
to
a256e4a
Compare
Reason: This prevent the log to hold on one line, and it is not really useful to debug.
a256e4a
to
bc3e035
Compare
beacon-chain/sync/subscriber.go
Outdated
@@ -334,7 +332,6 @@ func (s *Service) wrapAndReportValidation(topic string, v wrappedVal) (string, p | |||
"topic": topic, | |||
"multiaddress": multiAddr(pid, s.cfg.p2p.Peers()), | |||
"peerID": pid.String(), | |||
"agent": agentString(pid, s.cfg.p2p.Host()), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why is this removed ? its very useful on mainnet to catch misbehaving clients
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The reason of removal is written in the corresponding commit message.
I removed it because it was quite useless on devnet, since we know who is who.
But yes, on mainnet/testnet, it makes sense.
Fixed in 0cf7d4f.
This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
* `columnErrBuilder`: Uses `Wrap` instead of `Join`. Reason: `Join` makes a carriage return. The log is quite unreadable. * `validateDataColumn`: Improve log. * `areDataColumnsAvailable`: Improve log. * `SendDataColumnSidecarByRoot` ==> `SendDataColumnSidecarsByRootRequest`. * `handleDA`: Refactor error message. * `sendRecentBeaconBlocksRequest` ==> `sendBeaconBlocksRequest`. Reason: There is no notion at all of "recent" in the function. If the caller decides to call this function only with "recent" blocks, that's fine. However, the function itself will know nothing about the "recentness" of these blocks. * `sendBatchRootRequest`: Improve comments. * `sendBeaconBlocksRequest`: Avoid `else` usage and use map of bool instead of `struct{}`. * `wrapAndReportValidation`: Remove `agent` from log. Reason: This prevent the log to hold on one line, and it is not really useful to debug. * `validateAggregateAndProof`: Add comments. * `GetValidCustodyPeers`: Fix typo. * `GetValidCustodyPeers` ==> `DataColumnsAdmissibleCustodyPeers`. * `CustodyHandler` ==> `DataColumnsHandler`. * `CustodyCountFromRemotePeer` ==> `DataColumnsCustodyCountFromRemotePeer`. * Implement `DataColumnsAdmissibleSubnetSamplingPeers`. * Use `SubnetSamplingSize` instead of `CustodySubnetCount` where needed. * Revert "`wrapAndReportValidation`: Remove `agent` from log." This reverts commit 55db351.
Please read commit by commit. Important commits are the two last ones.
Before this pull request, if, for example, a data column was not received by a full node peer, then this full node peer was unable to re-join the main fork.
Why?
Because, in order to consider a block as available, the full node peer needs the 4 custody columns + the 4 extra subnet sampling columns.
However, before this PR, when requesting data columns by root, the node was requesting only the 4 custody columns.
This PR fixes that.
In the following example,
4-geth-prysm
ignores all incoming data columns for slots 10 and 20.Depending how close the next block proposal is (if the node had time to rejoin), then we see a fork.
However, each time, it rejoins the main fork (slots 15 and 25 are not orphaned.)