主頁 > 後端開發 > 波場共識機制 DPoS

波場共識機制 DPoS

2020-10-11 19:00:42 後端開發

概況

區塊鏈是一個分布式的記賬系統,在一個區塊鏈系統中可以有成千上萬的節點,他們各自獨立保存一份相同的賬本,而新的交易資料想要被寫入帳本,需要獲得這些節點的認可,在不可信的分布式環境中實作這一目標是一個很復雜的系統工程,區塊鏈系統正常運行,即區塊鏈中各節點總能保存同一份賬本,前提是系統中絕大部分的節點是誠實可靠的,為了保證誠實可靠的節點能夠共同監督交易資料寫入賬本,每個區塊鏈系統都需要構建自己的共識,共識就相當于區塊鏈的憲法,共識保證了即便是在不可信的分布式環境下,只要絕大多數節點遵守共識的規定,就一定能獲得確定可信結果,因此共識的意義在于,區塊鏈中的誠信節點可以最終達成賬本的一致只要他們嚴格遵守這份共識,
共識有多種型別,目前使用最多的是POW、POS、DPOS,當然不同的區塊鏈系統中都會有一些特有的具體實作上的不同,本文主要介紹波場的共識就是基于DPOS的,同時向大家說明一下DPOS中的基本組件和機制,

記賬流程

區塊鏈系統的記賬人,他們收集區塊鏈網路中新產生的交易,并對這些交易的合法性進行驗證,然后把這些交易打包在一個區塊中,作為新的一頁賬記錄在賬本上,然后將賬頁在整個區塊鏈網路中進行廣播,其他的節點收到新的賬頁,也會驗證賬頁中交易資料的合法性,并添加到自己的賬本中,記賬人一直重復這個程序,這樣只要區塊鏈系統中新的交易資料都會記錄在賬本里面

DPOS概述

共識的作用是在區塊鏈系統中選出記賬人,記賬人驗證交易資料并進行記賬,進而向區塊鏈網路中的其他節點廣播新的賬目,并獲得其他節點對于新賬目的認可,DPOS作為共識的一類特定實作是這樣的:
DPOS共識在區塊鏈系統中根據節點獲取選票的多少確定出部分節點作為記賬,首先區塊鏈系統開始啟動運行的時候,會發行一定數量的通證,然后將通證分給區塊鏈系統中的節點,節點可以憑借一部分通證申請成為這個區塊鏈系統記賬人的候選人,區塊鏈系統中任何持有通證的節點都可以為這些候選人進行投票,每經過一段時間t會統計所有候選人獲得的選票數量,選票數量排在前面的N個節點會成為下一段時間t內的記賬人,再經過t的時間,又會重新統計一遍新的記賬人,以此類推回圈往復,

定義

波場

指波場的區塊鏈網路,本文不區分波場、波場區塊鏈、波場區塊鏈系統等概念,

波場幣

指由波場區塊鏈系統發行并在系統中流轉的權益通證,代號是TRX,

記賬候選人

指波場中有成為記賬人資格的節點,

記賬人

指波場中獲得記賬資格的節點,通常DPOS共識中將記賬人稱為witness,波場也將記賬人稱為super node(簡稱SR),波場設定記賬人的數量是27個,下文不區分記賬人、witness、supernode、SR等概念,

記賬

指驗證交易并將交易記錄成賬目的程序,由于波場中的賬目是用區塊承載的,因此記賬的程序也被稱為生產區塊,下文不區分記賬和生產區塊,

記賬順序

即出塊順序,按照27個記賬人得票多少的降序作為記賬順序,

區塊時間

波場中設定一個區塊時間是3秒鐘,即每3秒會生產出一個區塊,

槽位

每一個區塊生產出來可以放到一個槽位,被稱為slot,每當一個區塊生產出來就會占用一個槽位,例如,1分鐘有20個slot,當1個區塊時間內有1個區塊生產出來,對應的slot會被填滿,如果沒有區塊被生產出來,那么對應的slot就是空的,下個區塊生產出來的時候會填充到新的對應的slot中,

出塊輪

波場設定每6個小時作為一個出塊輪,稱為一個Epoch,每個出塊輪最后的2個出塊時間是一個維護期,每個出塊輪的維護期決定下一個出塊輪的出塊順序,

維護期

波場設定是2個區塊時間,即6秒鐘,這段時間用于統計候選人得票數,因為24個小時有4個出塊輪,自然就有4個維護期,維護期中不進行區塊生產,主要用來確定下個出塊輪的出塊順序,

選舉機制

選票

波場中設定擁有一個TRX就可以擁有一張選票的權利,

投票程序

波場中設定對候選人的投票程序是一筆特殊型別的交易,節點可以通過生成一筆投票交易對候選人進行投票,

統計票

每個維護期內,統計一次候選人的票數,將獲得票數最多的27個候選人作為下一個出塊周期的記賬人,

產塊機制

在一個出塊輪中,27個記賬人按照記賬順序依次生產區塊,每個記賬人只能在輪到自己產塊時進行區塊生產,記賬人將多筆驗證合法的交易資料打包到每個區塊之中,同時每個區塊都會將上個區塊的哈希值(hash)作為本區塊的父哈希值(parentHash)填入區塊中,同時用自己的私鑰對本區塊的資料進行簽名,將簽名結果(witness_signature)也填入區塊中,同時被填入區塊的還有記賬人的地址,區塊高度,區塊生成的時刻等資料,
通過每個區塊保存了上個區塊hash值的方式,從而在邏輯上將區塊相互關聯了起來,最后組成了一條鏈的結構

理想情況下,采用DPOS共識的區塊鏈系統的記賬程序就是按照事先計算好的記賬順序,由witness輪流依序產塊,但實際情況下,區塊鏈網路是一個分布式的、不可信的復雜系統,體現在
1)由于網路鏈路環境不佳導致witness生產的區塊并不會在有效時間內被其他的witness收到;
2)并不能保證某個witness運行始終正常;
3)某些witness惡意生產分叉的區塊企圖將鏈分叉,


前文已經提到區塊鏈系統正常運行的基礎是系統中絕大部分的節點是誠實可靠的,再進一步探討這個問題,區塊鏈系統安全的首要保證的是賬本的安全,賬本既不能被惡意寫入不合法的資料,賬本在各個節點上保存的副本也應該是一致的,如果從DPOS共識的角度上來看,記賬程序是由witness完成,因此波場的安全取決于大部分witness的可靠性,波場設定了不可逆轉區塊,也稱為固化塊,同時為了抵抗少部分記賬節點的惡意行為,波場采用基于最長鏈的原則確認為主鏈

固化塊原則

剛生產出來的區塊處于未確認狀態,只有被27個Witness中70%以上(即27 * 70% = 18, 向下取整)的witness"認可"的區塊才被認為是不可逆區塊,一般稱為固化塊,此時固化塊中包含的交易已經被整個區塊鏈網路確認,此處對未確認狀態區塊"認可"的方式是Witness在其之后生產后繼區塊,如圖d中Witness C生產的第103塊,Witness E在第103塊的基礎上生產了104‘,Witness G、A、B分別生產的第105‘、106’、107‘實質上也是103塊的后繼區塊,故也是對C生產的第103塊的認可,可知,當高度為121的區塊被生產出來的時候,第103塊就成為固化塊,因為此時103區塊已經有了18個后繼區塊,此處需要強調的一點是:生產這18個區塊的Witness互不相同,并且和生產第103個區塊的Witness也不同

最長鏈原則

當區塊鏈產生分叉之后,誠實的witness總是選擇在當前最長的那個分叉鏈上繼續生產區塊

激勵模型

為了保證區塊鏈系統安全高效地運行,波場設定激勵模型用于鼓勵更多的節點加入到波場網路中,從而擴大網路規模,對于記賬人當他們完成出塊任務,給予相應的TRX獎勵,波場設定witness每生產一個被固化的區塊,就會獲得32個TRX的獎勵;對于所有記賬人(包括記賬候選人)的得票在前127名的,每個Epoch的維護期會依據得票率的多少分配固定的獎勵.

超級代表

TRON網路中有27個出塊者,即超級代表,
任何賬戶都可以申請成為超級代表候選人,每個賬戶都可以投票給超級代表候選人,獲取投票數最高的27個候選人就是超級代表,第28~127名為超級合伙人,超級代表會有出塊和打包交易的義務,同時也會獲得相應的投票和出塊獎勵,并且有權力參與波場網路動態引數提議的投票,100名超級合伙人可以獲得投票獎勵,

超級代表和激勵機制

選舉超級代表

用戶需要獲得投票權來給超級代表投票,即TRON Power(TP),TP的數量取決于選民的凍結資產(TRX),1 TP = 凍結1TRX,
在釋放(解凍)之后,會失去對應的TP,同時正在進行的和對于未來的投票都將失效,
TRON網路只記錄最近一次的投票,之前的投票會被覆寫,
投票統計每6小時統計一次,超級代表和超級合伙人也就每6個小時變更一次,票數排名前27位為超級代表,排名28-127為超級合伙人,排名128以后為超級代表候選人,
根據TRON網路的規則,申請成為超級代表需要燃燒9999個TRX,以此來預防惡意的行為,

獎勵

超級代表獎勵: 波場網路每3秒生成一個區塊,每個塊將16個TRX授予出塊的超級代表,
投票獎勵:波場網路每生成一個區塊, 127名超級代表和合伙人將按斬訓得的投票比例瓜分160TRX,每6小時共產生獎勵1152000TRX, 每年投票的總獎勵額約為 1,681,920,000 TRX,超級代表和合伙人獲得的投票獎勵也會根據傭金比例扣除后按照選民投票比例分配給選民,
在2021年1月1日之前,TRON網路將不會出現通貨膨脹,TRON基金會將在該日期之前提供100%的區塊獎勵和候選人獎勵,
每當超級代表完成出塊時,獎勵將會打到超級賬本中的子賬戶, 超級代表可以查看,但不能直接使用此資產, 可以每24小時取款,把獎勵從子帳戶轉移到超級代表的帳戶,

獎勵計算
獎勵總額=投票獎勵 x (傭金比例) +出塊獎勵 x (傭金比例)

超級代表傭金
默認比例20%,另外80%分發給選民,超級代表可通過介面修改該數值,

投票獎勵
每個區塊給予160個TRX作為投票獎勵,
投票統計資料每6小時計算一次,超級代表根據投票結果而變化,
對于所有127名超級代表候選人,每日共投票獎勵:
160(TRX /塊)x 7200(塊/選舉)x 4(選舉 /天)= 4608,000(TRX /天)1,
對于每位候選人,每日投票獎勵= 4,608,000 x(SR獲得的投票/全網總票數)x 20%
由于可能的丟塊,Reward 可能會小于理論數.

出塊獎勵
SR逐個出塊,出塊獎勵為每個區塊16個TRX,
對于所有27位超級代表,每日共出塊獎勵:
16(TRX /塊)x 7200(塊/選舉)x 4(選舉 /天)= 460,800(TRX /天)
對于每位超級代表,每日出塊獎勵=460,800 / 27 x 20%= 3413 TRX

選民獎勵
以默認的超級代表或超級合伙人傭金比例計算,80%的獎勵分發給了選民,每個投票對應每6小時的獎勵= 80% x 7200(塊/選舉) x 160 /total votes + 80% x 7200(塊/選舉) x 16 / 27 / sr votes),total votes為全網總投票數,sr votes為超級代表獲得的投票數,因此每個選民需要知道超級代表傭金率、全網總投票數和sr獲得的投票數就可以計算獎勵,此資料會對所有人開放,

基于提案對引數進行調整

DPOS的一個重要的特性是任何系統引數的調整都可以通過鏈上的提案發起,記賬人通過對提案的投票來決定提案是否生效,這樣的好處是在鏈上新增加一些特性不需要進行硬分叉升級,波場目前能夠支持的系統引數調整有:

#CommandValue
0getMaintenanceTimeInterval
(修改超級代表調整時間間隔)
6 Hours
[3 27, 24 3600] s
1getAccountUpgradeCost
(修改賬戶升級為超級代表的費用)
9999 TRX
[0, 100000000000] TRX
2getCreateAccountFee
(修改創建賬戶費用)
0.1 TRX
[0, 100000000000] TRX
3getTransactionFee
(修改TRX抵扣帶寬的費用)
10 Sun/Byte
[0, 100000000000] TRX
4getAssetIssueFee
(修改資產發行費用)
1024 TRX
[0, 100000000000] TRX
5getWitnessPayPerBlock
(修改超級代表出塊獎勵)
16 TRX
[0, 100000000000] TRX
6getWitnessStandbyAllowance
(修改分給前127名超級代表候選人的獎勵)
115200 TRX
[0, 100000000000] TRX
7getCreateNewAccountFeeInSystemContract
(修改系統創建賬戶的費用)
0 TRX
8getCreateNewAccountBandwidthRate
(提議7、8,組合使用,用于修改創建賬戶時對資源或TRX的消耗)
1 Bandwith/Byte
9getAllowCreationOfContracts
(控制虛擬機功能的開啟 )
1
{0, 1}
10getRemoveThePowerOfTheGr
(用于清除GR的創世票數)
1
{0, 1}
11getEnergyFee
(修改能量費用)
10 Sun
[0, 100000000000] TRX
12getExchangeCreateFee
(修改創建交易對的費用)
1024 TRX
[0, 100000000000] TRX
13getMaxCpuTimeOfOneTx
(修改交易最長執行時間)
50 ms
[0, 1000] ms
14getAllowUpdateAccountName
(允許用戶更改昵稱以及昵稱同名)
0
{0, 1}
15getAllowSameTokenName
(允許創建相同名稱的token)
1
{0, 1}
16getAllowDelegateResource
(控制資源代理功能的開啟)
1
{0, 1}
18getAllowTvmTransferTrc10
(允許智能合約呼叫TRC10 token的介面)
1
{0, 1}
19getTotalEnergyCurrentLimit
(修改ENERGY總量)
50000000000
20getAllowMultiSign
(允許開啟多重簽名)
1
{0, 1}
21getAllowAdaptiveEnergy
(允許ENERGY總量自適應調整)
0
{0, 1}
22getUpdateAccountPermissionFee
(修改賬戶權限費用)
100 TRX
23getMultiSignFee
(修改賬戶權限費用)
1 TRX
24getAllowProtoFilterNum
(允許更新protobuf的數字)
0
{0, 1}
26getAllowTvmConstantinople
(允許TVM支持君士坦丁堡更新)
1
{0, 1}
27getAllowShieldedTransaction
(允許匿名交易開啟)
0
{0, 1}
28getShieldedTransactionFee
(修改匿名交易手續費)
10 TRX
[0, 10000] TRX
29getAdaptiveResourceLimitMultiplier
(用于修改動態能量最大值)
1000
[1, 10000]
30getChangeDelegation
(修改更換委托機制)
1
{0, 1}
31getWitness127PayPerBlock
(修改票數排名獎勵)
160TRX
[0, 100000000000] TRX
32getAllowTvmSolidity059
(允許虛擬機支持0.5.9版本的Solidity編譯器)
0
{0, 1}
33getAdaptiveResourceLimitTargetRatio
(修改能量目標值)
10
[1, 1000]

帶寬和能量機制

資源模型

TRON網路中的資源有4種:帶寬,CPU,存盤和記憶體,得益于波場獨有的記憶體模型,TRON網路中的記憶體資源幾乎是無限的,
TRON網路引入了Bandwidth Point 和 Energy 兩種資源概念,其中Bandwidth Point表示帶寬資源,Energy表示CPU和存盤資源,
注意:
系統交易僅消耗Bandwidth Point
智能合約的操作不僅要消耗Bandwidth Point,還會消耗Energy

帶寬

交易以位元組陣列的形式在網路中傳輸及存盤,一條交易消耗的Bandwidth Points = 交易位元組數 * Bandwidth Point費率,當前Bandwidth Point費率 = 1,
如一條交易的位元組陣列長度為200,那么該交易需要消耗200 Bandwidth Points,
注意: 由于網路中總凍結資金以及賬戶的凍結資金隨時可能發生變化,因此賬戶擁有的Bandwidth Points不是固定值,

Bandwidth Points的來源

Bandwidth Points的獲取分兩種:

  1. 通過凍結TRX獲取的Bandwidth Point, 額度 = 為獲取Bandwidth Point凍結的TRX / 整個網路為獲取Bandwidth Points凍結的TRX 總額 * 43_200_000_000, 也就是所有用戶按凍結TRX平分固定額度的Bandwidth Points,
  2. 每個賬號每天有固定免費額度的帶寬,為5000,

Bandwidth Points的消耗

除了查詢操作,任何交易都需要消耗bandwidth points,
還有一種情況,如果是轉賬,包括普通轉賬或發行Token轉賬,如果目標賬戶不存在,轉賬操作則會創建賬戶并轉賬,只會扣除創建賬戶消耗的Bandwidth Points,轉賬不會再消耗額外的Bandwidth Points,

Bandwidth Points的計算規則

Bandwidth Points是一個賬戶1天內能夠使用的總位元組數,一定時間內,整個網路能夠處理的Bandwidth為確定值,
如果交易需要創建新賬戶,Bandwidth Points消耗如下:

  1. 嘗試消耗交易發起者凍結獲取的Bandwidth Points,如果交易發起者Bandwidth Points不足,則進入下一步
  2. 嘗試消耗交易發起者的TRX,這部分燒掉0.1TRX

如果交易是Token轉賬,Bandwidth Points消耗如下:

  1. 依次驗證 發行Token資產總的免費Bandwidth Points是否足夠消耗,轉賬發起者的Token剩余免費Bandwidth Points是否足夠消耗,Token發行者凍結TRX獲取Bandwidth Points剩余量是否足夠消耗,如果滿足則扣除Token發行者的Bandwidth Points,任意一個不滿足則進入下一步
  2. 嘗試消耗交易發起者凍結獲取的Bandwidth Points,如果交易發起者Bandwidth Points不足,則進入下一步
  3. 嘗試消耗交易發起者的免費Bandwidth Points,如果免費Bandwidth Points也不足,則進入下一步
  4. 嘗試消耗交易發起者的TRX,交易的位元組數 * 10 sun

如果交易普通交易,Bandwidth Points消耗如下:

  1. 嘗試消耗交易發起者凍結獲取的Bandwidth Points,如果交易發起者Bandwidth Points不足,則進入下一步
  2. 嘗試消耗交易發起者的免費Bandwidth Points,如果免費Bandwidth Points也不足,則進入下一步
  3. 嘗試消耗交易發起者的TRX,交易的位元組數 * 10 sun

帶寬的自動恢復

在網路總鎖定資金以及賬戶鎖定資金不變的情況下,賬戶的帶寬的已使用量隨著時間增加而按比例衰減,24h衰減到0,如時間T1時刻,賬戶帶寬已使用量為U,到T1+12h,賬戶再次使用帶寬u,此時賬戶已使用帶寬為 U/2 + u,具體公式如下:

即可以理解為每24h,用戶已使用的帶寬值重置為0

能量

智能合約運行時執行每一條指令都需要消耗一定的系統資源,資源的多少用Energy的值來衡量,

Energy的獲取

凍結獲取Energy,即將持有的trx鎖定,無法進行交易,作為抵押,并以此獲得免費使用Energy的權利,具體計算與全網所有賬戶凍結有關,可參考相關部分計算,

FreezeBalance 凍結獲得能量
通過凍結TRX獲取的Energy, 額度 = 為獲取Energy凍結的TRX / 整個網路為獲取Energy凍結的TRX 總額 * 50_000_000_000,
也就是所有用戶按凍結TRX平分固定額度的Energy

FreezeBalance 恢復能量
所消耗的能量會在24小時內平滑減少至0,
示例:
在某一時刻A的Energy已使用量為72_000_000 Energy,在沒有其他消耗或凍結的操作下:
一小時后A的Energy已使用量為 72_000_000 - (72_000_000 (6060/606024)) Energy = 69_000_000 Energy
24小時后A的Energy已使用量為 0 Energy,

如何填寫feeLimit

在本節范圍內,將合約的開發部署人員,簡稱為“開發者”;將呼叫合約的用戶或者其他合約,簡稱為“呼叫者”,
呼叫合約消耗的Energy能以一定比例折合成trx(或者sun),所以在本節范圍內,指代合約消耗的資源時,并不嚴格區分Energy和 trx;僅在作為 數值的單位時,才區分Energy、trx和sun,
合理設定feeLimit,一方面能盡量保證正常執行;另外一方面,如果合約所需Energy過大,又不會過多消耗呼叫者的trx,在設定feeLimit之前,需要了解幾個概念:

  1. 合法的feeLimit為0 - 10^9 之間的整數值,單位是sun,折合0 - 1000 trx;
  2. 不同復雜度的合約,每次正常執行消耗不同的Energy;相同合約每次消耗的Energy基本相同;執行合約時,逐條指令計算并扣除Energy,如果超過feeLimit的限制,則合約執行失敗,已扣除的Energy不退還;
  3. 目前feeLimit僅指呼叫者愿意承擔的Energy折合的trx;執行合約允許的最大Energy還包括開發者承擔的部分;
  4. 一個惡意合約,如果最終執行超時,或者因bug合約崩潰,則會扣除該合約允許的所有energy;
  5. 開發者可能會承擔一定比例的Energy消耗(比如承擔90%),但是,當開發者賬戶的Energy不足以支付時,剩余部分完全由呼叫者承擔,在feeLimit限制范圍內,如呼叫者的Energy不足,則會燃燒等價值的trx,
    開發者通常會有充足的Energy,以鼓勵低成本呼叫;呼叫者在估算feeLimit時,可以假設開發者能夠承擔其承諾比例的Energy,如果一次呼叫因為feeLimit不足而失敗,可以再適當擴大,

Energy的計算

  1. tron為了懲罰惡意開發者,對于例外合約,如果執行超時(超過50ms),或因bug例外退出(不包含revert),會扣除本次的最大可用Energy,若合約正常執行,或revert,則僅扣除執行相關指令所需的Energy;
  2. 開發者可以設定執行合約時,消耗Energy中自己承擔的比例,該比例后續可修改,一次合約呼叫消耗的Energy,若開發者的Energy不足以支付其承擔的部分,剩余部分全由呼叫者支付;
  3. 目前執行一個合約,可用的Energy總數由 呼叫者呼叫時設定的feeLimit 和 開發者承擔部分共同決定

注意:

  1. 若開發者不確定合約是否正常,請勿將用戶承擔比例設定為0%,否則在被判為惡意執行時,會扣除開發者的所有Energy,
  2. 因此建議開發者設定的用戶承擔的比例為10%~100%,

如果合約執行成功,沒有發生任何例外,則會扣除合約運行實際消耗的Energy,一般都遠遠小于此次呼叫能夠使用的Energy,如果發生了Assert-style例外,則會消耗feeLimit對應的所有的Energy,

注意:
開發者創建合約的時候,consume_user_resource_percent不要設定成0,也就是開發者自己承擔所有資源消耗,
開發者自己承擔所有資源消耗,意味著當發生了Assert-style例外時,會消耗開發者凍結的所有Energy,

資源委托

在TRON中,一個賬戶可以通過凍結TRX來獲取帶寬和能量,同時,也可以把凍結TRX獲取的帶寬或者能量委托(delegate)給其他地址,
此時,主賬號擁有凍結的TRX以及相應的投票權,受委托賬戶擁有凍結獲取的資源(帶寬或者能量),
和普通凍結一樣,委托資源也至少凍結3天,

參考檔案
https://tronprotocol.github.io/documentation-zh/introduction/dpos/
https://cn.developers.tron.network/docs/%E8%B5%84%E6%BA%90%E6%A8%A1%E5%9E%8B

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

標籤:java

上一篇:python初學者-從鍵盤輸入兩個數判斷大小

下一篇:以太坊2.0后,Filecoin異軍突起!

標籤雲
其他(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