關於SigHashForkid 的處理

2021-09-24 07:31:17 字數 1246 閱讀 5776

sig_hash_type 是位元幣交易中每個簽名之後乙個位元組的值。有如下型別:

- all 0b00000001

- none 0b00000010

- single 0b00000011

- anyonecanpay 0b10000000

- 31 它的二進位制是 0b11111, 十六進製制是 0x1f

- 128 它的二進位制是 0b10000000, 十六進製制是 0x80

那麼就有以下幾種特殊的位運算:

- x &&& 31 : 取二進位制的x的最低 5 位

- x &&& 128 : 如果二進位制的x的從右往左第8位等於1, 則結果等於128. 反之等於0

而在沒有forkid的情況下,也就是bch分叉之前的位元幣中,sighash的型別是這樣劃分的:

設二進位制的x為某筆交易中的sighash:

x 的最低5位 等於 0b10 -> none

x 的最低5位 等於 0b11 -> single

x 是其它情況 -> all

x 的從右往左第 8 位等於1 -> sig_hash_anyonecanpay

注意到最後乙個情況和之前的3個是可以疊加的。

所以我們可以這樣判斷乙個 sig_hash 位元組的型別:

base(x) when x &&& 31 == 2 -> none;

base(x) when x &&& 31 == 3 -> single;

base(x) -> all.

anyone(x) when x &&& 128 === 128 -> anyonecanpy;

anyone(x) -> false.

其實乙個byte就可以表示256種狀態,位元幣這樣做是出於什麼原因,不得而知。

那麼forkid又是怎麼一回事?forkid的目的是讓之前方法的簽名全部不能通過新的驗證,同時新的驗證方式要保有所有的sig hash 型別。

以forkid = 0x40 為例。 設x為原本的sig hash。

首先看以下幾種特殊的位運算:

- x ||| (0x40 <<< 8) : 一共16位,前8位是forkid,後8位是x

這樣,得到了乙個數作為新的 sighash, 同時不改變之前的型別判斷規則。而且由於這個 sighash 的值改變了,所以簽名結果也改變了。從而實現了隔離的目的。

複製**

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...