最小可行性區(qū)塊鏈設(shè)計(jì)系列:Day 2 交易簽名與驗(yàn)證

前言

《最小可行性區(qū)塊鏈設(shè)計(jì)系列》的第一講(http://www.reibang.com/p/af45d43b9c85) 實(shí)現(xiàn)了賬戶和交易模型雛形,具體設(shè)計(jì)思路與比特幣的UTXO有所區(qū)別衡招,更接近于以太坊的設(shè)計(jì)二驰。本文將討論并實(shí)現(xiàn)區(qū)塊鏈交易的簽名與驗(yàn)證功能。

本文的代碼地址:https://github.com/qikh/mini-block-chain/commit/81524fe1b4b9228a67b8fc3551d971a0aa0eae52 (開發(fā)語(yǔ)言為Kotlin稿静,更簡(jiǎn)潔的Java)

正文

第一講中梭冠,Alice向Bob發(fā)送了一筆轉(zhuǎn)賬交易,金額為100元改备。交易模型Transaction包含了發(fā)送方地址控漠、接收方地址、金額和時(shí)間戳悬钳。區(qū)塊鏈的客戶端節(jié)點(diǎn)盐捷,負(fù)責(zé)將這筆交易記錄登帳,并更新Alice和Bob的賬戶余額(balance)默勾。

但是碉渡,區(qū)塊鏈的客戶端如何確認(rèn)這筆交易確實(shí)是Alice本人發(fā)起的呢?我們需要交易簽名(sign)和驗(yàn)證(verify)機(jī)制來(lái)確認(rèn)交易(Transaction)的合法性母剥。

如果我們把交易看作一張支票滞诺,那么發(fā)送方(Alice)必須在這張支票上簽名形导,并且第三方(區(qū)塊鏈節(jié)點(diǎn))可以很容易地驗(yàn)證簽名的真?zhèn)巍lice的私鑰就是她的簽名章铭段,用私鑰對(duì)交易(Transaction)的內(nèi)容(發(fā)送方骤宣、接收方、金額序愚、時(shí)間戳)進(jìn)行簽名憔披。

    /**
     * 發(fā)送方用私鑰對(duì)交易Transaction進(jìn)行簽名。
     */
    fun signTransaction(trx: Transaction, privateKey: PrivateKey): ByteArray {
      val signer = Signature.getInstance("SHA256withECDSA")
      signer.initSign(privateKey)
      val msgToSign = getTransactionContentToSign(trx)
      signer.update(msgToSign)
      return signer.sign()
    }

交易(Transaction)加入數(shù)字簽名(signature)后爸吮,區(qū)塊鏈節(jié)點(diǎn)可以用Alice的公鑰來(lái)驗(yàn)證交易是不是Alice發(fā)送出來(lái)的芬膝,驗(yàn)證成功后才會(huì)記錄該筆交易。

    /**
     * 驗(yàn)證交易Transaction簽名的有效性形娇。
     */
    fun verifyTransactionSignature(trx: Transaction, signature: ByteArray, publicKey: PublicKey): Boolean {
      val signer = Signature.getInstance("SHA256withECDSA")
      signer.initVerify(publicKey)

      signer.update(getTransactionContentToSign(trx))
      return signer.verify(signature)
    }

注意:簽名的交易內(nèi)容應(yīng)該統(tǒng)一序列化算法锰霜,確保內(nèi)容的二進(jìn)制一致性,這樣不同語(yǔ)言的客戶端軟件才能夠驗(yàn)證簽名有效性桐早。本文的實(shí)現(xiàn)比較簡(jiǎn)單癣缅,發(fā)送方地址和接收方地址的16進(jìn)制字符串+金額(數(shù)字轉(zhuǎn)文本)+時(shí)間戳(數(shù)字表示的系統(tǒng)時(shí)鐘)。

區(qū)塊鏈節(jié)點(diǎn)驗(yàn)證交易簽名需要發(fā)送方的公鑰哄酝,公鑰并沒有標(biāo)準(zhǔn)的發(fā)布方法友存,通常會(huì)把公鑰增加到交易(Transaction)里。比特幣的協(xié)議把簽名+公鑰組成簽名腳本(Signature Script或sigScripts)陶衅,作為交易(Transaction)的組成部分屡立。由于比特幣和以太坊所用的ECDSA算法有一個(gè)很有意思的特性:可以從簽名(signature)推導(dǎo)出公鑰(Public Key),以太坊的交易(Transaction)格式只包含了簽名(signature)搀军,驗(yàn)證交易簽名前先用算法推導(dǎo)出公鑰膨俐,然后再進(jìn)行驗(yàn)簽。

/**
   * 驗(yàn)證交易簽名罩句。
   */
  @Test fun verifyTransactionSignatureTest() {
    // 初始化Alice賬戶
    val kp1 = generateKeyPair() ?: return
    val alice = Account(kp1.public)

    // 初始化Bob賬戶
    val kp2 = generateKeyPair() ?: return
    val bob = Account(kp2.public)

    // Alice向Bob轉(zhuǎn)賬100
    val trx = Transaction(alice.address, bob.address, 100, DateTime(), kp1.public)

    // Alice用私鑰簽名
    val signature = trx.sign(kp1.private)

    // 用Alice的公鑰驗(yàn)證交易簽名
    assert(verifyTransactionSignature(trx, signature))
  }

交易簽名和驗(yàn)證功能完成后焚刺,區(qū)塊鏈的節(jié)點(diǎn)就能夠校驗(yàn)交易(Transaction)的合法性,校驗(yàn)通過(guò)的交易數(shù)據(jù)就能夠加入到區(qū)塊(Block)里门烂。本系列的下一篇將會(huì)討論區(qū)塊鏈的區(qū)塊(Block)設(shè)計(jì)和實(shí)現(xiàn)乳愉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诅福,隨后出現(xiàn)的幾起案子匾委,更是在濱河造成了極大的恐慌拖叙,老刑警劉巖氓润,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薯鳍,居然都是意外死亡咖气,警方通過(guò)查閱死者的電腦和手機(jī)挨措,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崩溪,“玉大人浅役,你說(shuō)我怎么就攤上這事×嫖ǎ” “怎么了觉既?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乳幸。 經(jīng)常有香客問(wèn)我瞪讼,道長(zhǎng),這世上最難降的妖魔是什么粹断? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任符欠,我火速辦了婚禮,結(jié)果婚禮上瓶埋,老公的妹妹穿的比我還像新娘希柿。我一直安慰自己,他們只是感情好养筒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布曾撤。 她就那樣靜靜地躺著,像睡著了一般闽颇。 火紅的嫁衣襯著肌膚如雪盾戴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天兵多,我揣著相機(jī)與錄音尖啡,去河邊找鬼。 笑死剩膘,一個(gè)胖子當(dāng)著我的面吹牛衅斩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怠褐,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼畏梆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了奈懒?” 一聲冷哼從身側(cè)響起奠涌,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磷杏,沒想到半個(gè)月后溜畅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡极祸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年慈格,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浴捆,死狀恐怖蒜田,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情选泻,我是刑警寧澤冲粤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站页眯,受9級(jí)特大地震影響色解,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜餐茵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一科阎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忿族,春花似錦锣笨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隆豹,卻和暖如春椭岩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背璃赡。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工判哥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碉考。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓塌计,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親侯谁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锌仅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容