I created a second version of forcenet with more experimental features and
stopped my forcenet1 node.
1. It has a new header format: Height (4), BIP9 signalling field (4), hardfork
signalling field (2), Hash TMR (32), Hash WMR (32), Merkle sum root (32),
number of tx (4), prev hash (32), timestamp (4), nBits (4), nonce1 (4), nonce2
(4), nonce3 (compactSize + variable), merkle branches leading to header C
(compactSize + 32 bit hashes)
2. Anti-tx-replay. If, after masking the highest byte, the tx nVersion is >=3,
the sighash for both segwit and non-segwit outputs is calculated with BIP143,
except 0x2000000 is added to the nHashType. Such signatures are invalid for
legacy nodes. But since they are non-std due the nVersion, they won’t be
relayed nor validated by legacy nodes. This also removes the O(n^2) sighash
problem when spending non-segwit outputs. (anti-replay is a long story and I
will discuss in a separate post/BIP)
3. Block sighashlimit
(https://github.com/jl2012/bips/blob/sighash/bip-sighash.mediawiki
<https://github.com/jl2012/bips/blob/sighash/bip-sighash.mediawiki>). Due to
point 2, SigHashSize is counted only for legacy non-segwit inputs (with masked
tx nVersion < 3). We have to support legacy signature to make sure time-locked
txs made before the hard fork are still valid.
4. A totally new way to define tx weight. Tx weight is the maximum of the
following metrics:
a. SigHashSize (see the bip in point 3)
b. Witness serialised size * 2 * 90
c. Adjusted size * 90. Adjusted size = tx weight (BIP141) + (number of
non-OP_RETURN outputs - number of inputs) * 41 * 4
d. nSigOps * 50 * 90. All SigOps are equal (no witness scaling). For non-segwit
txs, the sigops in output scriptPubKey are not counted, while the sigops in
input scriptPubKey are counted.
90 is the scaling factor for SigHashSize, to maintain the 1:90 ratio (see the
BIP in point 3)
50 is the scaling factor for nSigOps, maintaining the 1:50 ratio in BIP141
Rationale for adjusted size: 4 is witness scaling factor. 41 is the minimum
size for an input (32 hash + 4 index + 4 nSequence + 1 scriptSig). This
requires people to pre-pay majority of the fee of spending an UTXO. It makes
creation of UTXO more expensive, while spending of UTXO cheaper, creates a
strong incentive to limit the growth of UTXO set.
Rationale for taking the maximum of different metrics: this indirectly set an
upper block resources for _every_ metrics, while making the tx fee estimation a
linear function. Currently, there are 2 block resources limits: block weight
and nSigOp cost (BIP141). However, since users do not know what the other txs
are included in the next block, it is difficult to determine whether tx weight
of nSigOp cost is a more important factor in determining the tx fee. (This is
not a real problem now, because weight is more important in most cases). With
an unified definition of tx weight, the fee estimation becomes a linear problem.
Translating to new metric, the current BIP141 limit is 360,000,000. This is
equivalent to 360MB of sighashing, 2MB of serialised size, 4MB of adjusted
size, or 80000 nSigOp.
Any new block-level limit metrics could be added to tx weight using soft forks.
5. Smooth halving: the reward of the last 2016 blocks in a halving cycle will
be reduced by 25%, which is contributed to the first 2016 blocks of the new
halving cycle. (different parameters for forcenet) This makes a more graceful
transition but we will lose some fun around halving.
6. A new coinbase tx format. BIP34 is removed. Coinbase tx may have more than 1
input. The prevout hash of first input must be the hash of previous block, and
index must be 0xffffffff. The other inputs (if any) must come from UTXOs with
valid signatures. Spending of previous coinbase outputs in a coinbase tx is
exempted from the 100 block maturity requirement. Therefore, miners of an
earlier block may pay other miners to convince them to confirm their blocks.
7. Merkle sum tree: it allows generating of fraud-proof for fee and weight. A
special softfork (bit 15) is defined. When this softfork is activated, the full
node will not validate the sum tree. This is needed because when the definition
of tx weight is changed through a softfork (e.g. a new script version
introducing new sigop), olds nodes won’t know the new rules and will find the
sum tree invalid. Disabling the sum tree validation won’t degrade the security
of a full node by more than an usual softfork, because the full node would
still validate all other known rules.
However, it is still not possible to create fraud proof for spending of
non-existing UTXO. This requires commitment of the block height of inputs, and
the tx index in the block. I’m not quire sure how this could be implemented
because a re-org may change such info (I think validation is easy but mining is
more tricky)
How to join: codes at https://github.com/jl2012/bitcoin/tree/forcenet2
<https://github.com/jl2012/bitcoin/tree/forcenet2> , start with "bitcoind
—forcenet" .
Connection: I’m running a node at 8333.info <http://8333.info/> with default
port (39901)
Mining: there is only basic internal mining support. To use the internal miner,
writeup a shell script to repeatedly call “bitcoin-cli —forcenet generate 1”
jl2012
_______________________________________________
bitcoin-dev mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev