比特币从无到有--第1部分

2020-07-04 07:44:09

理解比特币的基本构建块(😉)可能会让一些开发人员望而却步。如果不知道所有东西是如何组合在一起的,我发现很难有意义地理解一个系统。

完成这一过程的一个好方法是制定一套系统运行的过程,尽管这是很初级的过程。因此,本指南的目的是通过简单的代码片段来解释比特币是如何工作的。

注:目的不是创建比特币协议的真正实现。它的目的也不是解释每一个概念。如果您发现一个概念需要浏览,请查找嵌入的链接。

希望在本系列结束时,我们应该有一个任何人都可以运行的类似比特币的协议。

让keypair=crypto::KeyPair::New();让keypair2=crypto::KeyPair::New();让tx1=create_sign_tx(&;keypair,keypair2.public_key,123);让tx2=create_sign_tx(&;keypair2,keypair.public_key,75);让txs=vec![TX1,TX2];让PROVED_BLOCK=BLOCK。设block=proposed_block.mine(3);//难度3,即hash必须以";000";println!(";挖掘块:{:#?}";,block);

需要密钥作为实现所有权的一种手段。也就是说,消费一定数量的比特币需要有钥匙。

你的钥匙实际上由两部分组成。私钥和公钥。公钥可以与世界共享,并用于接收比特币,而私钥是您保持安全的东西,因为它可以用来花费您的比特币。有关公钥密码术的更多信息。

在比特币中,椭圆曲线用于公钥加密-具体地说是secp256k1。在Esense中,使用(Psuedo)随机数,我们可以生成一对密钥,可以将其视为用户的钱包。

让mut rand=rand::OsRng::new().unwire();让SECP=Secp256k1::new();let(private_key,public_key)=secp.Generate_keypair(&;mut rand);KeyPair{SECP,public_key,private_key,}。

交易是比特币系统中最小的单位。交易是对从A到B的x个比特币的支付进行编码的数据结构。

那么,是什么阻止了任何人代表他人进行转移呢?公钥密码术。要成为有效的交易并被其他人接受进入网络,交易需要用`from`公钥进行";签名";。

实施密钥对{pub FN sign(&;self,message:&;[U8])->;签名{.。self.secp.sign(&;Message,&;self.private_key);}}。

如前所述,私钥对多个比特币进行控制。A';的私钥用于签署交易,这样任何人都可以验证从A到B的交易实际上是由A授权的。

让tx=Transaction::Transaction{From:keypair.public_key,To,Amount,};让sig=keypair.sign(&;tx.hash());Return Transaction::SignedTransaction{Transaction:tx,sig:sig.to_string(),};

块是事务的集合。这些交易应该签字,因此是有效的。

让TX1=CREATE_SIGNED_TX(&;keypair,keypair2.public_key,123);让TX2=CREATE_SIGNED_TX(&;keypair2,keypair.public_key,75);让txs=vec![TX1,TX2];让PROVED_BLOCK=BLOCK::ProposedBlock{Transaction:txs,};

事实上,在比特币网络上,唯一可以跨块复制的数据。该块的目的是有效地将其包含的事务写入历史。它通过采矿实现了这一点。

挖掘的过程就是做一个计算,以确保有一些东西处于危险之中。换句话说,矿工必须证明他们做了一些工作--工作证明。

如果散列以特定数量的0开始,则POW就足够了。所需的0分称为难度。难度越大-需要的0越多。

让mut随机数:u32=0;让mut BLOCK_HASH:STRING=String::NEW();让BLOCK_STRING=self.Serialize();而!block_hash.starts_with(&;";0";.repeat(difficulty)){LET BLOCK=FORMAT!(";{}{}";,BLOCK_STRING,NONCE);BLOCK_HASH=十六进制::Encode(Crypto::sha256(block.clone();NONCE+=1;}返回块{hash:block_hash,Nonce,Transaction:self.Transaction}。

你现在应该有希望看到这一切是如何结合在一起的。概括一下最初介绍的高级代码:

最后,运行此程序将生成一个包含签名事务的块。记下散列。它以";000";开头,因此当难度设置为3时,它是有效的块。

挖掘块:块{HASH:";000cc7b72695c1ab8b7969cb400f73d763bce1cafa866b0aab59fe762eb7fbed";,Nonce:96,事务:[签名事务{Transaction{From:PublicKey(bf9d4f6c8142956ac683f73ef009369b43aec7d765e18c6ac3b48341bf14ebd9e0a06bec8897e392725dae273eaa51400320130cba64143e61c1f61b3bc4f324,),To:PublicKey(c1c6bd81ff1a657ae4053149682502c749fbc4b638e047d36c4bdf637ebcd0e93d0f987638c248c099deef8ec76199c1818f3b387e232a2d8da5de5ca91cf13b,),Amount:123,},sig:";304402206fb0e6ab4a6acfcc0725f048c7fbfed734accc0a4bad864ac161302410ed3f94022035ef86194f8de575658b7e4b3bae2aee193c507d78fe8ba4e43e22bce948271a";,},SignedTransaction{Transaction:Transaction{From:PublicKey(c1c6bd81ff1a657ae4053149682502c749fbc4b638e047d36c4bdf637ebcd0e93d0f987638c248c099deef8ec76199c1818f3b387e232a2d8da5de5ca91cf13b,),To:PublicKey(bf9d4f6c8142956ac683f73ef009369b43aec7d765e18c6ac3b48341bf14ebd9e0a06bec8897e392725dae273eaa51400320130cba64143e61c1f61b3bc4f324,),Amount:75,},SignedTransaction{Transaction{From:PublicKey(bf9d4f6c8142956ac683f73ef009369b43aec7d765e18c6ac3b48341bf14ebd9e0a06bec8897e392725dae273eaa51400320130cba64143e61c1f61b3bc4f324,),Amount:75,},SignedTransaction{Transaction{From:PublicKey(bf9d4f6c8142956ac683f73ef009369b43aec7d765e18c6ac3b48341bf14ebd9e0a06bec8897e392725dae273eaa51400320130cba64143e61c1f61b3bc4f324,),Amount:75,},SignedTransaction:";30440220752b3ea25bd2ab2b29d44659af665caddd7ce9b54144c41e6adcdfde7ef807fa022066682bdb49666a91fd28e14c05cf8229d668c061f404f218bb62619e4604eb59";,},],}