零知識證明:區塊鏈隱私保護的變革力量

🧑 博主簡介:CSDN博客專家歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/literature?__c=1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編程高并發設計Springboot和微服務,熟悉LinuxESXI虛擬化以及云原生Docker和K8s,熱衷于探索科技的邊界,并將理論知識轉化為實際應用。保持對新技術的好奇心,樂于分享所學,希望通過我的實踐經歷和見解,啟發他人的創新思維。在這里,我希望能與志同道合的朋友交流探討,共同進步,一起在技術的世界里不斷學習成長。
技術合作請加本人wx(注明來自csdn):foreast_sea

在這里插入圖片描述


在這里插入圖片描述

零知識證明:區塊鏈隱私保護的變革力量

一、引言

在當今數字化時代,數據隱私和安全已成為人們日益關注的焦點。隨著區塊鏈技術的廣泛應用,其在數據存儲和傳輸過程中的安全性和透明度備受贊譽,但同時也面臨著隱私泄露的潛在風險。在區塊鏈網絡中,交易信息通常是公開可見的,這雖然保證了交易的可追溯性和不可篡改性,但也可能暴露用戶的敏感信息,如交易金額、交易雙方身份等。

為了解決這一問題,一種名為零知識證明的“黑科技”應運而生零知識證明允許一方(證明者)向另一方(驗證者)證明某個陳述是真實的,而無需透露除了該陳述為真之外的任何額外信息。這一概念在區塊鏈領域的應用具有深遠的意義,它能夠在不影響區塊鏈核心特性(如去中心化、透明度和安全性)的前提下,為用戶提供強大的隱私保護。

例如,在加密貨幣交易中,用戶可以使用零知識證明向區塊鏈網絡證明自己擁有足夠的資金進行交易,而無需透露具體的賬戶余額或交易歷史。這不僅保護了用戶的隱私,還能確保交易的合法性和有效性。此外,零知識證明還可以應用于身份驗證、供應鏈管理、醫療保健等眾多領域,為這些領域的數據隱私保護提供創新的解決方案。

在本文中,我們將深入探討區塊鏈技術的基本概念原理特性和應用場景,詳細介紹零知識證明的工作原理及其在區塊鏈中的應用方式,并通過實際代碼示例展示其具體實現過程。通過對這些內容的深入理解,我們將能夠清晰地看到零知識證明如何正在改變并將繼續改變區塊鏈技術的未來發展方向,為構建更加安全、私密和高效的數字世界奠定堅實的基礎。

二、區塊鏈概述

在這里插入圖片描述

2.1 區塊鏈的概念

區塊鏈是一種分布式賬本技術,它將數據以區塊的形式進行存儲,并通過密碼學算法確保這些區塊之間的鏈接安全可靠。每個區塊包含了一批交易信息以及指向前一個區塊的哈希指針,形成了一條從創世區塊開始的鏈式結構。

這種分布式賬本的獨特之處在于它不依賴于單一的中心化機構來維護,而是由眾多的節點(參與者)共同參與維護。每個節點都擁有整個區塊鏈的副本,并且通過特定的共識機制來達成對新交易和區塊的一致性認可。

例如,比特幣就是基于區塊鏈技術構建的一種數字貨幣系統。在比特幣網絡中,全球各地的計算機節點共同維護著一個公共的區塊鏈賬本,記錄著所有比特幣的交易歷史。當一筆新的比特幣交易發生時,它會被廣播到網絡中的各個節點,經過節點的驗證和確認后,被打包進一個新的區塊,并添加到區塊鏈中。

2.2 區塊鏈的原理

  • 交易與區塊:在區塊鏈中,交易是最基本的操作單元。用戶發起的交易包含了發送方地址、接收方地址、交易金額等信息。這些交易被收集起來,組成一個區塊。一個區塊通常還包含一個區塊頭和區塊體。區塊頭中存儲了區塊的元信息,如前一區塊的哈希值、時間戳、難度目標等,區塊體則包含了該區塊內的所有交易信息。
  • 哈希算法:哈希算法在區塊鏈中起著至關重要的作用。它將任意長度的數據轉換為固定長度的哈希值。例如,比特幣使用的 SHA-256 哈希算法,無論輸入的數據有多長,輸出的哈希值都是 256 位。哈希算法具有單向性,即從哈希值很難反推出原始數據;同時,它還具有抗碰撞性,即很難找到兩個不同的數據產生相同的哈希值。通過將區塊頭進行哈希運算,得到的哈希值作為該區塊的唯一標識,并且由于前一區塊的哈希值包含在當前區塊頭中,使得區塊鏈的區塊之間形成了緊密的鏈接關系。
  • 共識機制:為了確保區塊鏈網絡中的各個節點能夠對交易和區塊達成一致,需要一種共識機制。常見的共識機制有工作量證明(Proof of Work,PoW)、權益證明(Proof of Stake,PoS)等。以工作量證明為例,節點需要通過不斷地嘗試計算一個滿足特定難度要求的哈希值(稱為挖礦),來競爭創建新的區塊的權利。第一個找到符合要求哈希值的節點將其創建的區塊廣播到網絡中,其他節點在接收到區塊后,會驗證區塊的有效性,如果驗證通過,則將該區塊添加到自己維護的區塊鏈副本中,從而實現了整個網絡對區塊的一致性認可。

2.3 區塊鏈的特性

  • 去中心化:區塊鏈不存在一個中心化的控制機構,而是由眾多的節點共同參與管理。這意味著沒有單個實體能夠完全掌控整個區塊鏈的運行。例如,在比特幣網絡中,沒有銀行或政府機構來決定誰可以進行交易或控制貨幣的發行。去中心化的特性使得區塊鏈具有更高的抗審查性和可靠性,因為即使部分節點遭受攻擊或出現故障,整個網絡仍然能夠正常運行。
  • 透明度:區塊鏈上的交易信息是公開透明的,所有的節點都可以查看區塊鏈上的歷史交易記錄。這種透明度有助于建立信任,因為任何人都可以驗證交易的真實性和合法性。例如,在供應鏈管理中,消費者可以通過區塊鏈查看產品的生產、運輸和銷售等各個環節的信息,確保產品的質量和來源可靠。
  • 安全性:區塊鏈采用了多種密碼學技術來確保其安全性。哈希算法保證了區塊數據的完整性,使得數據一旦被記錄在區塊鏈上就難以被篡改。同時,數字簽名技術用于驗證交易的發起者身份,防止交易被偽造。此外,由于區塊鏈的分布式存儲特性,攻擊者需要控制大量的節點才能對區塊鏈進行有效的攻擊,這大大增加了攻擊的難度和成本。

2.4 區塊鏈的應用場景

  • 數字貨幣:如比特幣、以太坊等加密貨幣是區塊鏈最著名的應用。它們允許用戶在無需第三方中介的情況下進行安全、快速的價值轉移。
  • 供應鏈管理:通過在區塊鏈上記錄產品的生產、加工、運輸等信息,可以實現供應鏈的全程追溯,提高供應鏈的透明度和效率,降低假冒偽劣產品的風險。
  • 金融服務:區塊鏈可以用于跨境支付、證券交易結算、信貸征信等金融領域。例如,跨境支付可以通過區塊鏈實現更快、更便宜的資金轉移,減少中間銀行的手續費和處理時間。
  • 智能合約:以太坊等區塊鏈平臺支持智能合約的運行。智能合約是一種自動執行的合約條款,以代碼的形式部署在區塊鏈上。例如,在房地產交易中,可以通過智能合約實現自動的產權轉移和資金交割,減少人為錯誤和欺詐風險。
  • 醫療保健:患者的醫療記錄可以存儲在區塊鏈上,實現醫療數據的安全共享和隱私保護。不同的醫療機構可以在患者授權的情況下訪問和更新這些數據,提高醫療診斷的準確性和效率。

三、零知識證明基礎

在這里插入圖片描述

3.1 零知識證明的概念

零知識證明是一種密碼學技術,它允許證明者向驗證者證明某個陳述是真實的,而無需透露陳述本身之外的任何其他信息。簡單來說,就是證明者能夠讓驗證者相信某個事實,卻不泄露關于這個事實的具體細節。

例如,假設有一個迷宮,證明者知道從入口到出口的路徑,但不想直接告訴驗證者這條路徑。通過零知識證明,證明者可以以一種交互的方式向驗證者證明自己知道路徑,而驗證者在這個過程中無法得知路徑的具體走向。

3.2 零知識證明的原理

在這里插入圖片描述

零知識證明通常基于一些復雜的數學假設和密碼學算法來實現。其中一個常見的原理是基于離散對數問題或橢圓曲線離散對數問題。

以離散對數問題為例,假設有一個大素數 (p) 和一個生成元 (g),對于給定的 (y = g^x \bmod p),計算 (x) 是非常困難的(離散對數問題)。證明者知道 (x),要向驗證者證明自己知道 (x) 且不透露 (x) 的值。證明者可以通過以下步驟進行零知識證明:

  1. 證明者選擇一個隨機數 (r),計算 (a = g^r \bmod p),并將 (a) 發送給驗證者。
  2. 驗證者選擇一個隨機挑戰 (c)(通常是 0 或 1),并將 (c) 發送給證明者。
  3. 如果 (c = 0),證明者計算 (z = r);如果 (c = 1),證明者計算 (z = r + x \bmod (p - 1)),然后將 (z) 發送給驗證者。
  4. 驗證者收到 (z) 后,如果 (c = 0),則驗證 (a = g^z \bmod p);如果 (c = 1),則驗證 (a \cdot y = g^z \bmod p)。如果驗證通過,則證明者的證明有效。

在這個過程中,驗證者每次只能得到一個與 (x) 相關的部分信息(通過 (z)),但由于隨機挑戰 (c) 的存在,驗證者無法通過多次交互拼湊出 (x) 的完整值,從而實現了零知識證明。

3.3 零知識證明的類型

  • 交互式零知識證明:如上述迷宮例子和離散對數問題的證明過程,證明者和驗證者需要進行多輪的交互,驗證者通過隨機挑戰來逐步驗證證明者的陳述。這種類型的零知識證明在早期研究中較為常見,但由于需要交互,在一些應用場景中可能存在效率和可擴展性問題。
  • 非交互式零知識證明:為了克服交互式零知識證明的局限性,非交互式零知識證明應運而生。它通過使用一些可信的公共隨機源(如區塊鏈上的哈希值)來替代驗證者的隨機挑戰,使得證明者可以一次性生成證明,驗證者可以在任何時候獨立地驗證證明的有效性。非交互式零知識證明在區塊鏈應用中更為實用,因為它可以減少網絡通信開銷,提高系統的效率和可擴展性。

四、零知識證明在區塊鏈中的應用

4.1 隱私保護交易

在區塊鏈數字貨幣交易中,零知識證明可以用于隱藏交易的金額、發送方和接收方的具體信息。例如,在 Zcash 這種隱私加密貨幣中,采用了零知識證明技術(具體為 zk - SNARKs)來實現隱私保護交易。

當用戶進行交易時,交易信息會被加密處理,并且通過零知識證明向區塊鏈網絡證明交易的合法性,如證明發送方有足夠的資金進行交易、交易金額未被篡改等,而無需透露交易的具體細節。這樣,區塊鏈上的其他節點只能看到交易是合法的,但無法得知交易的具體內容,從而保護了用戶的隱私。

4.2 身份驗證與授權

在區塊鏈的身份驗證和授權場景中,零知識證明可以讓用戶證明自己擁有某些身份屬性或權限,而無需暴露具體的身份信息。

例如,在一個基于區塊鏈的訪問控制系統中,用戶可以使用零知識證明向系統證明自己滿足特定的訪問條件,如年齡超過 18 歲、是某個組織的成員等,而無需提供身份證號碼、組織成員證號等敏感信息。系統只需要驗證零知識證明的有效性,就可以決定是否給予用戶訪問權限。

4.3 智能合約隱私

智能合約在區塊鏈上運行時,其代碼和執行結果通常是公開可見的。零知識證明可以用于保護智能合約中的敏感數據和邏輯。

例如,一個涉及商業機密的智能合約,如企業之間的合作協議智能合約,合約中的某些關鍵條款(如價格、利潤分配等)可以通過零知識證明進行加密處理。在合約執行過程中,只有參與方能夠通過零知識證明驗證合約條款的執行情況,而外部觀察者無法得知合約的具體內容,從而保護了企業的商業機密。

五、零知識證明代碼示例與注釋

5.1 基于Java的代碼示例

以下是一個簡單的基于Java的區塊鏈零知識證明示例代碼,這里以簡化的離散對數問題場景來展示零知識證明的基本原理。示例代碼實現了證明者向驗證者證明自己知道某個離散對數問題的解,同時不泄露具體解的值。

import java.math.BigInteger;
import java.security.SecureRandom;public class ZeroKnowledgeProofExample {// 大素數pprivate static final BigInteger P = new BigInteger("23");// 生成元gprivate static final BigInteger G = new BigInteger("5");// 證明者知道的秘密值xprivate static final BigInteger X = new BigInteger("3");// 證明者選擇隨機數r的方法private static BigInteger proverChooseRandom() {SecureRandom random = new SecureRandom();// 生成一個在1到P - 1之間的隨機數return new BigInteger(P.bitLength() - 1, random).add(BigInteger.ONE);}// 證明者生成a = g^r mod p的方法private static BigInteger proverGenerateA(BigInteger r) {return G.modPow(r, P);}// 驗證者生成隨機挑戰c(0或1)的方法private static int verifierGenerateChallenge() {SecureRandom random = new SecureRandom();return random.nextInt(2);}// 證明者根據挑戰c生成z的方法private static BigInteger proverGenerateZ(BigInteger r, int c) {if (c == 0) {return r;} else {return r.add(X).mod(P.subtract(BigInteger.ONE));}}// 驗證者驗證證明的方法private static boolean verifierVerify(BigInteger a, int c, BigInteger z) {if (c == 0) {return G.modPow(z, P).equals(a);} else {BigInteger gToZ = G.modPow(z, P);BigInteger gToX = G.modPow(X, P);return gToZ.multiply(gToX).mod(P).equals(a);}}// 主函數進行零知識證明過程public static void main(String[] args) {// 證明者選擇隨機數rBigInteger r = proverChooseRandom();// 證明者生成aBigInteger a = proverGenerateA(r);// 驗證者生成挑戰cint c = verifierGenerateChallenge();// 證明者生成zBigInteger z = proverGenerateZ(r, c);// 驗證者驗證證明boolean result = verifierVerify(a, c, z);if (result) {System.out.println("零知識證明成功!");} else {System.out.println("零知識證明失敗!");}}
}

以下是對上述代碼的詳細注釋:

  1. 定義常量部分
// 大素數p
private static final BigInteger P = new BigInteger("23");
// 生成元g
private static final BigInteger G = new BigInteger("5");// 證明者知道的秘密值x
private static final BigInteger X = new BigInteger("3");

這里定義了零知識證明示例所基于的離散對數問題的相關參數。P是一個大素數,G是對應的生成元,X是證明者所知道的秘密值(在實際場景中,這個值是不對外公開的,但在示例中為了演示方便先進行了定義)。

  1. 證明者選擇隨機數 r 的方法
// 證明者選擇隨機數r的方法
private static BigInteger proverChooseRandom() {SecureRandom random = new SecureRandom();// 生成一個在1到P - 1之間的隨機數return new BigInteger(P.bitLength() - 1, random).add(BigInteger.ONE);
}

這個方法用于讓證明者選擇一個隨機數r。通過SecureRandom類來生成一個在1P - 1之間的隨機數,以滿足離散對數問題的計算要求。

  1. 證明者生成 a = g^r mod p 的方法
// 證明者生成a = g^r mod p的方法
private static BigInteger proverGenerateA(BigInteger r) {return G.modPow(r, P);
}

根據證明者選擇的隨機數r,使用modPow方法計算Gr次冪對P取模的結果,即得到a的值。

  1. 驗證者生成隨機挑戰 c01)的方法
// 驗證者生成隨機挑戰c(0或1)的方法
private static int verifierGenerateChallenge() {SecureRandom random = new SecureRandom();return random.nextInt(2);
}

驗證者通過SecureRandom類生成一個隨機的整數,范圍是01,作為對證明者的隨機挑戰c

  1. 證明者根據挑戰 c 生成 z 的方法
// 證明者根據挑戰c生成z的方法
private static BigInteger proverGenerateZ(BigInteger r, int c) {if (c == 0) {return r;} else {return r.add(X).mod(P.subtract(BigInteger.ONE));}
}

根據驗證者給出的挑戰c的值,如果c0,則z就等于之前選擇的隨機數r;如果c1,則z等于r加上秘密值X后對P - 1取模的結果。

  1. 驗證者驗證證明的方法
// 驗證者驗證證明的方法
private static boolean verifierVerify(BigInteger a, int c, BigInteger z) {if (c == 0) {return G.modPow(z, P).equals(a);} else {BigInteger gToZ = G.modPow(z, P);BigInteger gToX = G.modPow(X, P);return gToZ.multiply(gToX).mod(P).equals(a);}
}

驗證者根據接收到的acz來驗證零知識證明的有效性。如果c0,則驗證Gz次冪對P取模的結果是否等于a;如果c1,則先分別計算Gz次冪和GX次冪對P取模的結果,然后將這兩個結果相乘后對P取模,驗證其是否等于a

  1. 主函數進行零知識證明過程
// 主函數進行零知識證明過程
public static void main(String[] args) {// 證明者選擇隨機數rBigInteger r = proverChooseRandom();// 證明者生成aBigInteger a = proverGenerateA(r);// 驗證者生成挑戰cint c = verifierGenerateChallenge();// 證明者生成zBigInteger z = proverGenerateZ(r, c);// 驗證者驗證證明boolean result = verifierVerify(a, c, z);if (result) {System.out.println("零知識證明成功!");} else {System.out.println("零知識證明失敗!");}
}

在主函數中,按照零知識證明的流程依次調用前面定義的各個方法。首先證明者選擇隨機數r并生成a,然后驗證者生成挑戰c,接著證明者根據c生成z,最后驗證者驗證證明并根據結果輸出相應的提示信息。

請注意,這個示例只是一個非常簡化的零知識證明演示,實際應用中的零知識證明會更加復雜,涉及到更嚴格的數學假設、更高的安全性要求以及更復雜的交互和驗證機制等。

5.2 基于python的代碼示例

以下是一個簡單的基于離散對數問題的零知識證明代碼示例(使用 Python 語言):

# 大素數 p 和生成元 g
p = 23
g = 5# 證明者知道的秘密值 x
x = 3# 證明者選擇隨機數 r
def prover_choose_random():import randomreturn random.randint(1, p - 1)# 證明者生成 a = g^r mod p
def prover_generate_a(r):return (g ** r) % p# 驗證者生成隨機挑戰 c(0 或 1)
def verifier_generate_challenge():import randomreturn random.randint(0, 1)# 證明者根據挑戰 c 生成 z
def prover_generate_z(r, c):if c == 0:return relse:return (r + x) % (p - 1)# 驗證者驗證證明
def verifier_verify(a, c, z):if c == 0:return (g ** z) % p == aelse:return ((g ** z) * (g ** x)) % p == a# 主函數進行零知識證明過程
def zero_knowledge_proof():# 證明者選擇隨機數 rr = prover_choose_random()# 證明者生成 aa = prover_generate_a(r)# 驗證者生成挑戰 cc = verifier_generate_challenge()# 證明者生成 zz = prover_generate_z(r, c)# 驗證者驗證證明return verifier_verify(a, c, z)# 運行零知識證明并輸出結果
if __name__ == "__main__":result = zero_knowledge_proof()if result:print("零知識證明成功!")else:print("零知識證明失敗!")

在上述代碼中:

  • 首先定義了大素數 p 和生成元 g,以及證明者知道的秘密值 x
  • prover_choose_random 函數用于證明者選擇一個隨機數 r
  • prover_generate_a 函數根據隨機數 r 計算 a = g^r mod p
  • verifier_generate_challenge 函數用于驗證者生成隨機挑戰 c
  • prover_generate_z 函數根據挑戰 c 和隨機數 r 以及秘密值 x 計算 z
  • verifier_verify 函數用于驗證者根據接收到的 acz 來驗證零知識證明的有效性。
  • zero_knowledge_proof 函數將整個零知識證明的過程整合起來,最后在主函數中運行并輸出證明結果。

六、總結

零知識證明作為一種強大的密碼學技術,在區塊鏈領域的應用正不斷拓展和深化。它為區塊鏈的隱私保護提供了創新的解決方案,使得區塊鏈能夠在保持去中心化、透明度和安全性等核心特性的同時,更好地保護用戶的隱私信息。通過在隱私保護交易、身份驗證與授權、智能合約隱私等多個方面的應用,零知識證明正在重塑區塊鏈的生態系統,為區塊鏈技術在更多領域的廣泛應用奠定了基礎。

隨著技術的不斷發展,零知識證明在區塊鏈中的應用將會更加成熟和完善,有望推動區塊鏈技術走向更加安全、私密和高效的未來

七、參考資料文獻

  • [1] 《區塊鏈技術指南》,鄒均,等著,機械工業出版社
  • [2] 《密碼學原理與實踐》,Douglas R. Stinson 著,電子工業出版社
  • [3] 以太坊官方文檔:https://ethereum.org/
  • [4] Zcash 官方網站:https://z.cash/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72748.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【java】集合的基本使用

集合是 Java 中用來存儲一組對象的容器。與數組相比,集合更加靈活和強大,支持動態增刪元素、自動擴容、多種數據結構等特性。下面我會用通俗易懂的語言解釋集合的基本使用。 1. 什么是集合? 集合就像是一個“容器”,可以用來裝很多…

WPF-實現按鈕的動態變化

MVVM 模式基礎 視圖模型(ViewModel):MainViewModel類作為視圖模型,封裝了與視圖相關的屬性和命令。它實現了INotifyPropertyChanged接口,當屬性值發生改變時,通過OnPropertyChanged方法通知視圖進行更新&am…

主流NoSQL數據庫類型及選型分析

在數據庫領域,不同類型的數據庫針對不同場景設計,以下是四類主流NoSQL數據庫的對比分析: 一、核心特性對比 鍵值數據庫(Key-Value) 數據模型:簡單鍵值對存儲 特點:毫秒級讀寫、高并發、無固定…

西門子PLC

西門子PLC與C#通信全解析:從協議選型到實戰開發 一、西門子PLC通信協議概述 西門子PLC支持多種通信協議,需根據設備型號及項目需求選擇: S7協議 西門子私有協議,適用于S7-200/300/400/1200/1500系列PLC特點:直接訪問…

Visual Studio(VS)的 Release 配置中生成程序數據庫(PDB)文件

最近工作中的一個測試工具在測試多臺設備上使用過程中閃退,存了dump,但因為是release版本,沒有pdb,無法根據dump定位代碼哪塊出了問題,很苦惱,查了下怎么加pdb生成,記錄一下。以下是具體的設置步…

★ Linux ★ 進程(上)

Ciallo&#xff5e;(∠?ω< )⌒☆ ~ 今天&#xff0c;我將和大家一起學習 linux 進程~ ????????????????????????????? 澄嵐主頁&#xff1a;椎名澄嵐-CSDN博客 Linux專欄&#xff1a;https://blog.csdn.net/2302_80328146/category_12815302…

JAVA并發-volatile底層原理

volatile相當于是一個輕量級的synchronized&#xff0c;一般作用在變量上&#xff0c;它具有三個特性&#xff1a;可見性、有序性&#xff0c;相比于synchronized&#xff0c;他的執行成本更低。 先來說可見性&#xff0c;java存在共享變量不可見性的原因就是&#xff0c;線程…

Java面試第十一山!《SpringCloud框架》

大家好&#xff0c;我是陳一。如果文章對你有幫助&#xff0c;請留下一個寶貴的三連哦&#xff5e; 萬分感謝&#xff01; 目錄 一、Spring Cloud 是什么? 二、Spring Cloud 核心組件? 1. 服務發現 - Eureka? 2. ?負載均衡 - Ribbon? 3. 斷路器 - Hystrix? ??4. …

Transaction rolled back because it has been marked as rollback-only問題解決

transaction rolled back because it has been marked as rollback-only 簡略總結> 發生場景&#xff1a;try-catch多業務場景 發生原因&#xff1a;業務嵌套&#xff0c;事務管理混亂&#xff0c;外層業務與內層業務拋出異常節點與回滾節點不一致。 解決方式&#xff1a;修…

sql server數據遷移,springboot搭建開發環境遇到的問題及解決方案

最近搭建springboot項目開發環境&#xff0c;數據庫連的是sql server&#xff0c;遇到許多問題在此記錄一下。 1、sql server安裝教程 參考&#xff1a;https://www.bilibili.com/opus/944736210624970769 2、sql server導出、導入數據庫 參考&#xff1a;https://blog.csd…

【數學建模】灰色關聯分析模型詳解與應用

灰色關聯分析模型詳解與應用 文章目錄 灰色關聯分析模型詳解與應用引言灰色系統理論簡介灰色關聯分析基本原理灰色關聯分析計算步驟1. 確定分析序列2. 數據無量綱化處理3. 計算關聯系數4. 計算關聯度 灰色關聯分析應用實例實例&#xff1a;某企業生產效率影響因素分析 灰色關聯…

Spring配置文件-Bean實例化三種方式

無參構造方法實例化 工廠靜態方法實例化 工廠實例方法實例化

SSL 和 TLS 認證

SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接層&#xff09;認證是一種用于加密網絡通信和驗證服務器身份的安全技術。它是TLS&#xff08;Transport Layer Security&#xff0c;傳輸層安全協議&#xff09;的前身&#xff0c;雖然現在大多數應用使用的是TLS&…

SpringBoot學習(三)SpringBoot整合JSP以及Themeleaf

目錄 Spring Boot 整合 JSP1. 配置依賴2. 創建WEB目錄結構&#xff0c;配置JSP解析路徑3. 創建Controller類4. 修改application.yml5. 添加jstl標簽庫的依賴6. JSP頁面7. 創建啟動類 Spring Boot 整合 Thymeleaf1. 添加Thymeleaf依賴2. Controller3. 修改application.yml配置&a…

普通鼠標的500連擊的工具來了!!!

今天介紹的這款軟件叫&#xff1a;鼠標錄制器&#xff0c;是一款大小只有54K的鼠標連點器&#xff0c;軟件是綠色單文件版。搶票&#xff0c;拍牌&#xff0c;搖號都能用上。文末有分享鏈接 在使用先我們先設置快捷鍵&#xff0c;這樣我們在錄制和停止錄制的時候會更方便。 軟件…

【MySQL】基本查詢(表的增刪查改+聚合函數)

目錄 一、Create1.1 單行數據 全列插入1.2 多行數據 指定列插入1.3 插入否則更新1.4 替換 二、Retrieve2.1 SELECT 列2.1.1 全列查詢2.1.2 指定列查詢2.1.3 查詢字段為表達式2.1.4 為查詢結果指定別名2.1.5 結果去重 2.2 WHERE 條件2.2.1 比較運算符2.2.2 邏輯運算符2.2.3 案…

JAVA中關于圖形化界面的學習(GUI)動作監聽,鼠標監聽,鍵盤監聽

動作監聽&#xff1a; 先創建一個圖形化界面&#xff0c;接著創建一個按鈕對象&#xff0c;設置按鈕的大小。 添加一個addActionListener()&#xff1b; addActionListener() 方法定義在 java.awt.event.ActionListener 接口相關的上下文中&#xff0c;許多支持用戶交互產生…

MySQL 基礎學習文檔

一、MySQL 概述 1.1 核心概念 數據庫 (DB)&#xff1a;存儲數據的結構化倉庫數據庫管理系統 (DBMS)&#xff1a;操作數據庫的軟件&#xff08;如 MySQL、Oracle&#xff09;SQL&#xff1a;操作關系型數據庫的標準語言 1.2 安裝與配置 下載地址&#xff1a;MySQL Installer…

火山引擎(豆包大模型)(抖音平臺)之火山方舟的Prompt的使用測試

前言 在大模型的使用過程當中&#xff0c;Prompt的使用非常的關鍵。原來&#xff0c;我對Prompt的理解不深&#xff0c;覺得Prompt的產生并不是很有必要。但是&#xff0c;自從使用了火山方舟中的“Prompt優解”之后&#xff0c;感受加深了&#xff0c;覺得Prompt是我們和大模型…

SpringBoot入門-(2) Spring IOC機制【附實例代碼】

SpringBoot入門-(2) Spring IOC機制 Spring Spring是一個當前主流的輕量級的框架&#xff0c;發展到形狀已經不僅僅是一個框架&#xff0c;而是形成以Spring為基礎的生態圈&#xff0c;如(Spring Boot,Spring Cloud,Spring Security等) Spring 兩大核心技術 控制反轉(IoC)面…