@@ -158,6 +158,23 @@ inline std::vector<unsigned char> compute_gentx_before_refhash()
158158 return result;
159159}
160160
161+ // ── check_share_target_valid (Dash v16) ─────────────────────────────
162+ // Conformance with p2pool-dash oracle data.py Share.__init__:
163+ // if self.target > net.MAX_TARGET: raise PeerMisbehavingError('share target invalid')
164+ // The claimed share target must be no easier than the network share-diff floor
165+ // (params.max_target == net.MAX_TARGET); a zero target is likewise invalid. This is
166+ // a structural validity guard on share_info['bits'], independent of the PoW check.
167+ // v36 3-bucket: the GUARD is v36-native SHARED validation (Bucket 2 — cross-coin
168+ // identical); only the per-coin max_target constant differs (a consensus param, not
169+ // an isolation primitive).
170+ inline void check_share_target_valid (const uint256& target, const core::CoinParams& params)
171+ {
172+ if (target.IsNull ())
173+ throw std::invalid_argument (" share target is zero" );
174+ if (target > params.max_target )
175+ throw std::invalid_argument (" share target invalid" );
176+ }
177+
161178// ── share_init_verify (Dash v16) ─────────────────────────────────────────────
162179// Verifies PoW, hash_link, merkle_link. Returns share hash (SHA256d of header).
163180inline uint256 share_init_verify (const DashShare& share,
@@ -167,6 +184,10 @@ inline uint256 share_init_verify(const DashShare& share,
167184 if (share.m_coinbase .m_data .size () < 2 || share.m_coinbase .m_data .size () > 100 )
168185 throw std::invalid_argument (" bad coinbase size" );
169186
187+ // ── Share target validity (oracle: target > MAX_TARGET → "share target invalid") ──
188+ // Unconditional — NOT gated by check_pow, matching p2pool-dash Share.__init__.
189+ check_share_target_valid (chain::bits_to_target (share.m_bits ), params);
190+
170191 // ── Compute ref_hash ──
171192 PackStream ref_stream;
172193 {
@@ -269,9 +290,6 @@ inline uint256 share_init_verify(const DashShare& share,
269290 if (check_pow)
270291 {
271292 uint256 target = chain::bits_to_target (share.m_bits );
272- if (target.IsNull ())
273- throw std::invalid_argument (" share target is zero" );
274-
275293 if (share_hash > target)
276294 throw std::invalid_argument (" share PoW hash does not meet target" );
277295 }
0 commit comments