主頁 > 後端開發 > 【超詳細】區塊鏈技識訓礎知識梳理與位元幣介紹

【超詳細】區塊鏈技識訓礎知識梳理與位元幣介紹

2020-10-11 19:12:16 後端開發

區塊鏈基礎知識梳理(1)

寫在前面

筆者查詢、借鑒了一些資料,看過不少介紹區塊鏈的文章,發現很多文章雖然寫得不錯,但不或多或少會不太適合小白初步了解區塊鏈和位元幣的相關原理,本文旨在通過對位元幣相關機制的介紹,詳細說明區塊鏈的原理和基礎內容,當然,筆者也是剛剛接觸區塊鏈不久,難免會有一些錯誤的理解,還望讀者斧正,全文共計7500字,通過提問和舉例的方式詳細地介紹了位元幣和區塊鏈的相關機制,希望能給大家帶來幫助,

引入:(位元幣)

有個與世隔絕的村子,村子里沒有流通的紙幣,大家通過記賬的方式進行交易,一開始村民進行交易的時候都會把這筆交易記錄下來,當做憑證,村子里的每個人都會在賬目上記錄村子中每條交易資訊,但這么一來,每個人的賬本上都會有除了自己的交易資訊以外的大量其他與自己無關的交易資訊,同時大家也不太愿意花費自己的時間精力和存盤空間記錄他人的賬目,為了減輕大家的作業量,大家決定暫且由村長擔任記賬先生對村子里產生的每一筆交易資訊進行記錄,按照日期每天生成一個賬本,每個賬本都記錄著當天內產生的交易的相關資訊,村長記錄后每天定時定點公布賬單,供大家核對和檢查,村民們核對無誤以后,每個人都會將當日的賬本抄一份自己保留,

顯然,這很像中心化的管理,類似于我們銀行的操作模式,

(1)然而,新的問題來了,村長一直花時間和精力給大家記賬,沒有收益怎么辦?

村民們想了個好辦法,在每次產生交易的程序中,需要為此次交易支付一定的手續費(假設為1元),這個手續費將給予村里的記賬人,

(2)隨著村子的發展,村子的日交易數量逐漸變多,記賬人的收益越來越多,其他人發現記賬有利可圖,認為一直讓一個人記賬不公平,也想參與記賬作業,那要怎么選取記賬人呢?

為了公平地選取記賬人,村民們每天早上擲骰子,根據點數決定誰來記當天的賬,其他人只要核對一下,沒問題就抄寫下來,此處村民們選取記賬人的規則就稱為“共識機制”,確保每個人都有參與記賬的機會,同時,村子里每天會產生一個賬單,每天的賬單其實就是一個區塊,區塊中記錄著當天的交易資訊,而每天的賬單末尾會記錄當天每個村民的交易結余(即每個人還剩多少錢),前一天的交易結余在新一天的賬本中將會作為當日的交易數額(即你有多少錢),通過前一天的交易結余和當天的交易數額以及相鄰的日期等關系就可以串聯起各個賬單(區塊),即為“鏈”,

(3)如果這時候有人想要挪用村里的公款,雖然他不用直接篡改賬本上的資訊(因為大家都會確認賬本上的資訊),但是可以燒掉賬本中的一部分內容,這樣別人就查不出來了,回頭只要告訴大家這是不小心碰到蠟燭,別人也沒什么辦法,如何防止這種事情的發生?

是每個人都擁有一本自己的賬本,任何一個人改動了賬本都必須要告知所有其他人,其他人會在自己的賬本上同樣地記上一筆,如果有人發現新改動的賬目不對,可以拒絕接受,到了最后,以大多數人都一致的賬目表示為準,所以即便是有人真的不小心損壞了一部分賬本的內容,只要找到其他的人去重新復制一份來就行了,

(4)有些村民離賬本公布的地點比較遠或者當天沒時間去核對賬本該怎么辦?

相鄰的村民可以互相抄寫當天的賬本(即鄰居之間相互抄寫賬本),也叫做區塊鏈的路由,此處的村民的相互抄寫可以看作是點對點交流,而村民可以看作一個普通節點,

通過上述描述,我們可以知道區塊鏈有以下特點:

1.難以篡改 2.P2P 3.每個節點都有打包的權利(共識機制) 4.去中心化

進一步說明:

更進一步說明區塊鏈,首先以位元幣舉例,假設有A、B、C、D四個節點,每個節點都會在賬本上記錄四個節點間發生的交易的相關資訊,

同理,會引出以下問題:

(1)為什么每個節點都要記賬?

因為記賬有獎勵,每筆交易需要繳納手續費(比銀行低得多),同時每次記賬打包的人,都會獲得一定的位元幣獎勵(打包獎勵),

2018年,中本聰在一開始發明這個機制的時候,設定的是每10分鐘產生一次區塊,即會每十分鐘會選取一個記賬人,并將這10分鐘產生的交易內手續費和50個位元幣用于獎勵打包的人(記賬人),獎勵的打包費(50個位元幣每四年減少一半,即到2012年以后打包費變為25位元幣,2016年以后打包費變為12.5,以此類推,總計會產生2100萬個位元幣作為打包費,在打包費無限接近0以后,將通過收取手續費獎勵打包人)

(2)這么多節點都記錄了賬單,以誰的賬單為準?

這就涉及我們之前所說的記賬人選取機制,即“共識機制”,只不過此處的共識機制會比較復雜,在位元幣中,各個節點需要通過做“數學題”的方式爭奪記賬權,即為Pow(作業量證明的方式)我們將做題的程序稱為挖礦,誰先做出這道“數學題”,誰就有權利記賬,同時我們把挖礦的人叫做礦工,

“數學題”原理:

此處的“數學題”需要用到哈希函式的知識,以哈希函式中的SHA256為例說明,我們可以將任何字串(小到幾kb的字串,大到10G的電影)輸入SHA256函式中,其輸出結果為唯一的256位的二進制序列(比如輸入為LR即SHA(LR),其輸出即為10001000.....等32位數的唯一的二進制數,當稍微改變輸入值,輸入位LR1即(LR1),其輸出將會有很大變動,即稍微改變輸入的值,將會使得輸出值有巨大變化

哈希函式正向計算容易,反向計算困難,即為單向函式,舉個例子,對于下面的函式:

Y=Sin x+x^{^{3}}+tanx+lnx

知道X未知數,求Y很容易,但知道Y,要求X就很困難,實際上哈希函式還要比所舉例子復雜得多(感興趣可以去看看密碼學相關資料了解具體操作程序,此處僅需知道無論大小如何的字串輸入至哈希函式以后,輸出會得到獨一無二的長度固定的二進制字串

回到我們之前說的數學題,首先我們得了解區塊的結構,如圖所示,區塊包括區塊頭和區塊體,此處暫且不需要理會區塊體內的具體內容,我們先看到區塊頭,我們的數學題很大一部分來自于區塊頭,

區塊結構體

此處的數學題為每個節點有一個字串,字串內容為:

字串=前一個區塊的塊頭+賬單(默克爾根)+時間戳+……(此處僅列舉一部分)+亂數

數學題要求輸入為SHA256(SHA256(字串)),輸出結果為前n位為0的二進制數(序列),即

Hash=SHA256(SHA256(字串))=前n位為0的二進制序列

由字串的組成可知,僅有亂數可以改變,其他部分的內容都是確定的,而因為哈希函式的單向性,很難從輸出結果推算出輸入結果,因此僅能通過改變亂數的數值,逐個暴力計算(盲猜),使輸出滿足所需條件,雖然不同的節點的時間戳、默克爾根(賬單)等資訊可能不同,但總的來說,計算能力越強,也有能力算出所需的二進制序列

此外,可以通過調整難度,即改變n的值以此確保每10分鐘內必定會產生一個區塊,位元幣一開始設定的n=66,當然會隨著礦機數量的增多(單位時間內運算總數增多)而適當調高題目難度,保證在指定時間內能產生區塊,

(3)如何防偽?(如何證明某個交易資訊說由某個人發起的,某條轉賬新的付款人是A而不是B,如何確保交易資訊不被偽造)

傳統的方式身份認證方式是以簽字(看字跡),指紋,瞳孔(獨一無二的生物特征)等方式進行身份認證,然而,在互聯網中,這些都可以直接進行復制偽造,此時我們需要引入“數字簽名”的概念,

而在計算機世界中,保證數字簽名不被偽造是通過數字摘要和非對稱加密實作的,舉個位元幣中交易的例子:假如現在A發起一筆位元幣轉賬,需要先將該交易進行數字摘要,縮短成一段字串,然后用自己的私鑰對摘要進行加密,形成數字簽名,完成后,需要將交易資訊(包括收款方的地址)和數字簽名一起廣播給記錄“賬本的人”也就是礦工,礦工用A的公鑰進行驗證,如果驗證成功,說明該筆交易確實是A發出的,且資訊未被更改,是完整的,

此處涉及數字簽名需要運用到數字摘要和非對稱加密的知識,現在逐一介紹:

數字摘要

技術用于對所要傳輸的資料進行運算生成資訊摘要,它并不是一種加密機制,但卻能產生資訊的數字”指紋”,它的目的是確保資料沒有被修改或變化,保證資訊的完整性不被破壞,說直白點就是將資料進行hash編碼,它在數字簽名中的作用就是增加被偽造的難度,就好比有些人故意把字要寫的龍鳳鳳舞,目的就是很難讓他人偽造,

在介紹非對稱加密前需要首先介紹對稱加密,

對稱加密

舉個例子:現在A(未成年)想跟他的朋友B想聊一個比較敏感的話題,但是他怕他的老媽會翻看他的手機,要是讓她知道自己跟別人聊這種話題肯定會挨罵,于是A就和朋友B約定好A將中文先翻譯成英文再發過去,然后他那邊可以使用微信翻譯將英文翻譯成中文,這樣即使老媽看到了也無所謂,因為她根本看不懂英語,于是A跟他的朋友B便聊了起來,當A將中文通過翻譯軟體轉換成英文后,發給B,他的朋友B再利用翻譯軟體將英文轉化為中文即可正常讀取你發送的資訊即如圖所示:

A與B資訊傳遞程序(對稱加密)

如圖所示,無論加密(A將中文資訊翻譯成英文)還是解謎(B將英文資訊翻譯成中文)都運用到了翻譯工具(即一方通過密鑰將資訊加密以后,把密文傳給另一方,另一方通過這個相同的密鑰對密文進行解密)

對稱加密是比較好理解的,將一個密鑰通過加密演算法對明文進行運算得到一個密文,使用同樣的密鑰作為解密演算法的輸入對密文進行解密即可得到原文,如下圖所示:

在這里插入圖片描述
對稱加密示意圖

從這里我們可以看出對稱加密有幾個要素,分別是明文、加密演算法、密鑰、密文以及解密演算法,明文即原始資料,密鑰與明文一起作為加密演算法的輸入,是將明文進行打亂的規則,當然它也是跟密文一起作為解密演算法的輸入,密文自然就是加密演算法得到的結果,

但這么做有缺陷,如果A的老媽使用了微信翻譯將發送出去的英文翻譯成中文她不就看懂了嗎?對的,這就是對稱加密的缺陷,一旦被人拿到了密鑰(在對稱加密中,密鑰就是加解密的規則),那么A發送出去的密文將輕而易舉被人破解,那么有什么方法做到即使一個人的密鑰被盜竊了,最起碼保證A發給其他人發送密文不被破解?就是說即使A的老媽獲取到了你的密鑰,但她仍然無法破解你發送出去的資訊,只有他的朋友B才能查看A發送給他的資訊,這個就是我們要講的非對稱加密,

非對稱加密

在非對稱加密中,不管是資訊的發送方還是資訊的接收方都有一對屬于自己的公鑰和密鑰,公鑰顧名思義就是可以公開,而私鑰就是只能自己看,不能給別人拿到,接著發送方會將資訊進行數字摘要并使用接收方的公鑰進行加密,然后再使用自己的私鑰對數字摘要進行加密,接收方收到加密后的資訊跟加密串,用 發送方的公鑰(因為公鑰是公開的)來解密加密串,得到原始的數字摘要,然后對使用自己的私鑰進行解密的資訊進行摘要后的結果進行比對,如果一致,說明該檔案確實是該發送方發過來的,并且檔案內容沒有被修改過,

非對稱加密如何運用到身份認證中呢?

還是以A給B發資訊為例:A使用他的朋友B的公鑰對你的資訊進行加密,并且對資訊進行數字摘要,然后使用A自己的私鑰對摘要進行加密,即數字簽名,然后將數字簽名和加密后的資訊一起發送給B,B接收到資訊后,先使用A的公鑰對數字簽名進行解密,證明該資訊確實是A發送過來的而不是別人發送過來的(因為可以成功用A的公鑰解密,所以可以說明是A發來的資訊),然后再使用自己的私鑰(B的私鑰)對加密后的資訊進行解密(注意這里只有B的私鑰才能解密資訊,其他人都不可以,即使是A本人也不能解密,所以就算是A的老媽拿到了A的私鑰也沒辦法破解該資訊),然后對該資訊使用同樣的演算法進行數字摘要,如果得到的摘要跟A發送過來的摘要一致,則說明資訊在傳遞的程序中沒有被修改過,(詳情如圖)

身份認證程序

回到區塊鏈的防偽:

還是以A要給B發資訊為例,此處A要給B轉100個BTC(位元幣),首先A先將此條交易進行哈希運算處理得到一穿256位的二進制序列,此處稱為數字摘要1,之后再利用A的私鑰對數字摘要1進行加密,稱為密文1,之后將加密以后的密文1以及A的公鑰、A給B轉100個BTC的資訊廣播于其他節點,其他節點收到資訊后,使用A的公鑰對密文1進行解密,得到數字摘要1,同時對“A給B轉100個BTC”這條資訊進行哈希運算,得到數字摘要2,對比數字摘要1和數字摘要2,如果兩個數字摘要完全相同,即可說明此條資訊是A發出的,“A給B轉100個BTC”這條資訊真實完整且未被篡改,(詳情如圖)

區塊鏈中的身份認證

此時我們已經做到了防偽造,那么如何防止雙重支付呢

(雙重支付:即壞人拿一份錢當兩分錢使用,即A只有10個BTC,但A同一時間向全網廣播向C和B分別轉了10個BTC,因為網路延時,其他的節點收到這兩條資訊的時間可能不同,我們該如何防止不同節點確認了不同的交易資訊而產生雙重支付問題呢?)

此處首先要說明位元幣的交易程序:

1.付款人簽署交易單

付款人需要輸入自己的位元幣地址以及收款方的位元幣地址,還要輸入轉賬位元幣的個數,如5個位元幣,然后付款方會發送一個請求給收款方(以P2P的形式發送),在發送這個請求之前付款人會先加上收款人的公鑰和交易資訊,然后再用自己的私鑰加密整個請求,并把自己的公鑰標記在這個請求上,這里需要注意的是付款人不僅要將這個請求發給收款方,還需要以P2P的方式廣播出去告訴其他網路節點,讓所有節點都接收到這個請求, 舉個例子Alice要給Bob轉賬5個位元幣,那么Alice首先要詢問Bob的標識字串(位元幣地址),例如是“ABCDEFG”,同時Alice也有一個標識字串例如是“HIJKLMN”,然后Alice寫一張單子,內容為“HILKLMN支付5位元幣給ABCDEFG”,然后用自己的保密印章(私鑰)蓋一個章,將這張單子交給Bob,

2.收款人確認單據簽署人

收款人收到這個請求后拿著付款人的公鑰進行解密,如果能解密則說明付款人確實是擁有這個私鑰的,進而說明這筆賬是從付款人轉過來的,還可以得到收款人的公鑰(因為上面已經講了付款人會將收款人的公鑰跟交易資訊進行加密)說明這筆賬確實是轉給收款人的,

3.確認付款人余額

通過上面的步驟是可以確定這筆賬確實是付款人發起的,但是沒辦法有效的確認付款人是否真的有足夠的余額進行轉賬(畢竟現在沒有一個中心機構進行認證),所以這個時候就需要礦工來進行確認,這是因為在位元幣的世界里是沒有余額這個概念的,我們在位元幣錢包里看到的“余額”不是我們所理解的余額,它其實是UTXO(意思是未花費的交易輸出,這個打算在第五篇講),驗證付款方是否有余額這個作業通常由礦工來做,而收款方不需要做這個作業,只需要驗證這個請求是否是付款人發起的即可,

PS:如何檢查余額?

實際上,區塊鏈在創立的程序中,交易資訊被大多數節點接收且成功打包到公鏈后才可確認交易資訊(即確認賬款到賬),在交易程序中,比如A要給B轉10個BTC,其他節點會到公鏈上的區塊中查找有關A的交易資訊,并計算出A的“余額”,如果余額大于等于轉賬值,即接受該交易資訊,反之拒絕該交易資訊,我們把余額檢查的程序叫做“追溯”,交易資訊被其他節點拒絕即無法被記入各個節點的賬本中,那么就沒法被打包加入區塊中,

A同時向其他節點廣播向B和C分別轉賬了10BTC的時候(假設A只有10BTC),這兩條交易資訊可能會因為網路延時被記錄到兩個不同的節點中,但這些節點只有一個節點可以打包記賬,因此一旦一個節點獲得記賬權被打包記賬,那么剩下的節點的區塊則會被丟棄,即接受了另一條交易資訊的區塊則被丟棄,因此只有一條交易資訊會被確認,同時A的余額會被修改(即可A剩余BTC為0),則交易池中的另一個交易資訊會因余額不足而不能被節點接收,

(4)如何防止篡改?

按照之前所說的,我們已經了解了如何防止篡改,即無法偽造他人的交易資訊,但還有一個問題,怎么防止壞人修改(刪減)自己之前在某一區塊的交易資訊呢?

首先引入最長鏈原則,正如前文所說的,礦工們通過挖礦的方式爭取記賬權,如果出現兩個礦工同時挖出一個符合條件的區塊的情況(稱為分叉),該如何處理呢?

在某一時刻有兩個礦工同時算出亂數(即獲得記賬權),那么這個時候便會出現一種情況,即一條主鏈叉開變成兩條叉鏈,每條鏈沿著各自的方向延伸下去,如下圖所示:

分叉示意圖1

之所以會出現這種情況是因為每個礦工在開始挖新的區塊之前都會先把上一個區塊復制過來,然后接上這個區塊進行下一個區塊的挖礦作業,而現在在全網中的同一時刻有兩個符合條件的區塊,同時算出這道“數學題”的兩個礦工會向全網廣播自己解出了題目,那么由于距離的遠近(P2P網路,可以理解成有延時),礦工找到的區塊是不一樣的(雖然這兩個區塊都是符合條件的區塊,但他們可能因為距離解出結點的大小不同而接收到不同的區塊),所以有一些礦工會拿到紅色的區塊進行下面的挖礦作業,而有一些礦工會拿到綠色的區塊進行挖礦作業,這就勢必導致上圖所示的情況,這種情況叫分叉,

位元幣則設定了一種機制,即短鏈服從長鏈首先區塊是由礦工挖出來的,礦工進行挖礦就需要礦機(顯卡),而不同的礦機具有不同的算力(每秒運算多少次),也就是說每個礦工的計算能力是不一樣的,那么,就會出現一種情況,即兩條鏈中會有一條鏈的算力要比另一條鏈大,因此這條鏈的增長速度就會比另一條鏈要快,也就是這條鏈會比另一條鏈長,這時你可能會說那如果兩條鏈的算力一直保持一樣呢?這種情況是不可能會出現的,在短時間內是可能的,但一段時間后這種平衡勢必會被打破,比如有新的礦機出來(新的礦機算力一般都比較高),那么就會有礦工去購買來替換舊的礦機,這就會導致算力不平衡,

但其中一條鏈超過另外一條鏈時,這時全網中就會出現一條最長鏈,那么礦工在進行新的打包區塊作業的時候會把最長鏈全部復制過來,再在這條鏈的基礎上繼續挖礦,當所有礦工都這樣做的時候那么這條鏈就會成為一條主鏈,而另外一條鏈就會被拋棄掉,如下圖所示,紅鏈將會成為主鏈(公鏈),而綠色的鏈將會被廢棄,重新被放入交易池中,等待打包,

分叉示意圖2

其實可以想成“加賽”,如果兩個礦工同一時間挖到礦,其身邊的節點因為網路的延時會對挖出來的區塊進行站隊,站隊后繼續挖礦,誰能挖出下一個礦使得該鏈上的區塊更多(使得該鏈更長),就以誰的鏈為準,當其他礦工發現有比自己所在的鏈還要長的鏈以后,就會放棄自己現在所在的鏈,轉而到較長鏈上站隊,一般而言,6個區塊內即可分出勝負(即可比較出哪條鏈較長,以哪條鏈為準),

如果礦工執意要在那條短鏈上進行挖礦呢?如果這個礦工聰明一點的話他就知道這么做是吃力不討好的,因為一旦他所在的鏈最后沒有成為主鏈的話,他在這條連上挖到的位元幣都會歸零,他之前所做的作業都白費的,所以一般不會去做這種事,

所以,如何篡改交易資訊呢?

如果有個礦工要篡改資訊,他需要擁有比其他所以礦工更多CPU算力(51%攻擊),那么,這個51%攻擊是什么實作的?

假設一個場景,A用100位元幣向B購買一樣商品,步驟如下:

(1)A支付給B 100BTC;

(2)B收到100BTC確認收款后發貨(一般認為6次確認后交易就不可逆轉);

(3)A隨即創建另一筆交易,將同樣的10BTC支付給自己,

51%攻擊(篡改交易資訊)

如圖所示,A想要撤銷第一筆交易,不用花錢就得到B的商品,為了達到這個目的,A進行了雙重支付,將同樣的100BTC支付給B和自己,在正常的位元幣網路中,一旦第一筆交易經過6次確認后就幾乎不可更改,后續的交易資料將繼續打包成新的區塊依次鏈接下去,可是,如果A用戶擁有51%的算力,情況將會發生有趣的變化,A可以實作雙重支付的目的,即該礦工需要擁有比其他人更多的算力,在現有的鏈條上,打包出比現有主鏈更長的分叉,讓全網公認自己的鏈條是主鏈,

51%攻擊能帶來的收益是非常有限的,只能做到:

1、修改自己的交易記錄,如雙重支付 2、阻止確認部分或全部交易

而下面這些即使是51%攻擊也沒法做到的:

1、憑空生成位元幣; 2、修改每個區塊產生的位元幣數量,

然而,當該礦工掌握了全網51%的算力,他將被迫進行選擇,是通過欺詐以偷回其支付的款項(即雙花攻擊),還是通過(獲取)生成的新貨幣,他應當會發現,按照規則行事更加有利可圖,這樣的規則有利于他比其他聯合起來的每一個人獲取更多的新貨幣,亦優于破壞系統以及損害自己擁有財富的有效性,

寫在最后

有關區塊鏈的知識還有很多,包括共識機制、智能合約、簡單支付驗證(SPV)等內容,之后會逐一補充,如有疑問,歡迎交流,

參考資料:

(1)https://blog.csdn.net/weixin_37504041/article/details/92798560

(2)https://blog.csdn.net/weixin_37504041/article/details/79872329

(3)https://zhuanlan.zhihu.com/p/96314968

(4)https://blog.csdn.net/weixin_37504041/article/details/80070410

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/167927.html

標籤:java

上一篇:Ubuntu16golang環境搭建

下一篇:【Flutter Widgets大全】電子書開源

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more