在上一篇文章中,我們介紹了一種以最小信任訪問塊和其中的交易的方法,
本文中, 我們將其擴展為在包含多個區塊,使用該技術,我們基于區塊時間開發了一個簡單的投注合約,我們還展示了另一種阻止偽造塊的方法,

多個區塊組成的序列
如下所示,isBlockHeaderValid() 驗證一個區塊序列,而不是我們在上一篇文章中所做的單個區塊,我們在第 8 行重用現有代碼中的函式 isBlockHeaderValid() 來驗證每個單獨的塊,此外,我們在第 12 行對區塊頭進行哈希處理,并確保哈希與第 14 行的下一個區塊頭中的 prevBlockHash 欄位匹配,
// is a chain of block headers valid
static function isBlockHeaderChainValid(static const int N, BlockHeader[N] headers, int blockchainTarget) : bool {
bool res = true;
loop (N) : i {
if (res) {
// each block is valid
if (!isBlockHeaderValid(headers[i], blockchainTarget))
res = false;
if (i > 0) {
Sha256 prevBlockHash = blockHeaderHash(headers[i - 1]);
// blocks are chained
if (prevBlockHash != headers[i].prevBlockHash)
res = false;
}
}
}
return res;
}
也就是說,驗證了這兩個塊是鏈接在一起的,
案例研究:押注出塊時間
平均而言,在位元幣上產生一個區塊需要 10 分鐘,Alice 和 Bob 想打賭挖掘特定區塊需要多長時間,他們每個人都在一個包含了以下智能合約的交易中鎖定了一些 BSV,交易廣播后,將被處理打包進一個區塊,如果該區塊的產生時間少于 10 分鐘,則 Alice 獲勝并拿走所有鎖定的 BSV;否則,鮑勃獲勝,我們使用塊的時間戳(標頭中的第 4 個欄位)與其前一個塊的時間戳之間的差異作為出塊時間1,
// bet on block time: how long it takes to mine the block containing the bet transaction
contract BlockTimeBet {
// only 2 is needed; 7 means the transaction has 6 confirmations
static const int N = 7;
// 10 minutes in seconds
static const int AVG_BLOCK_TIME = 600;
// maximal target for any block to be considered valid
int blockchainTarget;
PubKey alice;
PubKey bob;
// header[1] is the block containing the contract tx
public function main(BlockHeader[N] headers, MerkleProof merkleproof, Sig sig, SigHashPreimage txPreimage) {
require(Tx.checkPreimage(txPreimage));
// get id of previous tx
Sha256 prevTxid = Sha256(SigHash.outpoint(txPreimage)[:32]);
// validate a chain of block headers
require(Blockchain.isBlockHeaderChainValid(N, headers, this.blockchainTarget));
// verify previous tx is in block with index 1
require(Blockchain.txInBlock(prevTxid, headers[1], merkleproof));
// block time is the time difference between this block and last
int blockTime = headers[1].time - headers[0].time;
// Alice wins if block is mined within 10 mins; otherwise Bob wins
PubKey winner = blockTime < AVG_BLOCK_TIME ? this.alice : this.bob;
require(checkSig(sig, winner));
}
}
與上一篇文章的 BlockchainPRNG 合約一樣,我們使用 OP_PUSH_TX 技術 來獲取包含投注合約的交易的 txid ,第 20 行驗證區塊頭鏈是否合法,第 23 行驗證投注交易在其中,第 26 行計算出塊時間,用于在第 29 行確定獲勝者,
鑒別假塊
在上一篇文章中,我們引入了 blockchainTarget 引數來控制可接受的區塊頭的難度,我們還可以要求在一個區塊之上構建多個區塊,從而使匯入假的區塊資料變得更加困難,要求的區塊越多,偽造它的成本就越高,這類似于使用位元幣購買商品時所需的 6 次確認,在上面的投注合約中,我們只需要將 N 改為 7 即可確保包含該合約的交易有 6 個確認,
附錄
[1]: 位元幣區塊時間戳不精確,通常不能用于衡量 10 分鐘的時間間隔,但只要它是隨機且難以預測的,投注合約就可以,因為它依賴于區塊時間的隨機性,而不是其精度,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/382945.html
標籤:區塊鏈
下一篇:元宇宙鏈游 西安鏈游開發
