近期FUSION項(xiàng)目宣布通過(guò)DCRM技術(shù)實(shí)現(xiàn)了世界上第一筆分布式簽名的跨鏈交易。
交易地址:https://etherscan.io/tx/0x72584366019dfefb80c5f52becf7c4545c160537e5bf257b4cab809e8dc99884
我們看到這筆交易是在以太坊上的:
塊高度:5986859
時(shí)間:Jul-18-2018 02:31:39 PM +UTC
轉(zhuǎn)賬:0.123456789 Ether
交易數(shù)據(jù)記錄:Powered by FUSION DCRM: The world's first decentralized signature transaction. https://github.com/FUSIONFoundation/dcrm
交易是真實(shí)的,但還是會(huì)有疑問(wèn):這是真的嗎?什么是分布式簽名交易?和普通交易有什么區(qū)別?這筆交易是怎么實(shí)現(xiàn)的?為什么說(shuō)是世界上第一筆分布式簽名跨鏈交易?
1. 什么是分布式簽名
FUSION項(xiàng)目實(shí)現(xiàn)的DCRM分布式簽名技術(shù)使得用戶可以把擁有的數(shù)字資產(chǎn)跨鏈Lock-in至同一區(qū)塊鏈平臺(tái),也可以隨時(shí)跨鏈Lock-out至指定賬戶。該技術(shù)支持所有和比特幣一樣加密算法控制的數(shù)字資產(chǎn),包括90%以上的主流加密數(shù)字資產(chǎn):BTC、ETH、USTD和ERC-20 Token等。
分布式簽名基于區(qū)塊鏈最核?的密碼相關(guān)技術(shù),從最底層密碼算法解決跨鏈去中心化信任問(wèn)題,綜合采用了分布式密鑰生成、秘密共享、門限簽名、承諾方案、同態(tài)加密和零知識(shí)證明等密碼學(xué)算法,這些算法經(jīng)過(guò)證明安全,就像比特幣加密算法一樣。Lock-in后的數(shù)字資產(chǎn)是由FUSION區(qū)塊鏈網(wǎng)絡(luò)分布在全球的成千上萬(wàn)個(gè)非中心化節(jié)點(diǎn)以分布式密鑰算法進(jìn)行管理,資產(chǎn)賬本是公開(kāi)記錄在區(qū)塊鏈上并且無(wú)法篡改的,用戶可以放心的信任開(kāi)源代碼和加密算法。

不管是比特幣還是以太坊,普通交易是由用戶通過(guò)錢包用私鑰進(jìn)行簽名完成,而分布式簽名交易則是由區(qū)塊鏈網(wǎng)絡(luò)里去中心化的節(jié)點(diǎn)共同簽名完成。更詳細(xì)的信息請(qǐng)參考筆者的另一篇文章:FUSION:DCRM分布式簽名技術(shù)
2. 這筆交易如何實(shí)現(xiàn)
這筆交易是通過(guò)FUSION的DCRM技術(shù)實(shí)現(xiàn)的,代碼位于FUSION項(xiàng)目的github官方地址:https://github.com/FUSIONFoundation/dcrm DCRM程序核心功能是生成分布式私鑰和公鑰,以及完成分布式簽名。
為了完成和以太坊的交易,還需要交易程序,筆者實(shí)現(xiàn)的go語(yǔ)言測(cè)試代碼位于:https://github.com/zhaojun-sh/dcrm-test 交易程序的主要功能是構(gòu)造一筆交易數(shù)據(jù)并且發(fā)送至以太坊網(wǎng)絡(luò)。
由于目前DCRM還處于測(cè)試階段,還沒(méi)有錢包支持分布式簽名交易,所以通過(guò)上述代碼來(lái)演示實(shí)現(xiàn)流程:
A. 生成分布式私鑰控制的DCRM地址
運(yùn)行DCRM的代碼得到如下結(jié)果,這代表著4個(gè)節(jié)點(diǎn)分布式生成了4個(gè)私鑰和一個(gè)公鑰,通過(guò)公鑰可以生成地址(一臺(tái)服務(wù)器上模擬4個(gè)節(jié)點(diǎn))。
--Info: User 0 generate Private Key Share
PrivateKey Share: 84985294175903376931445795015467894006937990435985966931354507719444581255012
--Info: User 1 generate Private Key Share
PrivateKey Share: 84940305801941904466664650218833612629672900930983791755864604768328058215142
--Info: User 2 generate Private Key Share
PrivateKey Share: 48301921624326365388572144770320542374756243070409113696101196017150962650950
--Info: User 3 generate Private Key Share
PrivateKey Share: 74476474800750184490014153736266688989328133924980580120573080366704112843538
--Info: Calculate the Encrypted Private Key
EncPrivateKey: 173329730713759195632158208048813204114677455921675775304258144252371179815430961141231018602754919847223671130038851235770493934212281874570018195132877748444798739739795821227577726293248811650538740502822576453171345141334474759008820338548050683359877810788469256044058927828890465419699614086485143919938663088234744802312667115166497698717611200939616006150333960967798774705098678363760859206718107587099802390681427713171866933375406933443101361557556923318129027997214648941448667715701871121536023557498580309841607312020839799234252343853295268206102175564188138151785998492090757135839568614767948113549479344169054960239235128852314494413754249563707980651899522410043787232916922313334490261299518909453339384085251688068082587884795809168467783742478303912915276925432140041395031792470836030833153327906657603100987211750311974883361669839719389126905701251147103644438573352551485776981716454187236792466740625455113592376164739273665716111784053089429116637141064039346004344920260636335713841450769486173791590749468963530444491755779006306793557058495300565853675068369925243102714680350161348688564986745843917723099482239970825667470784248735260412087349787452160933767617900074467470922767255036695841661683158
--Info: Calculate the Public Key
PublicKey:(69569e08f0a701b880002b6437bd7ec73248d7487c04afc0698fe1bdcf6184a9,ac288eceaf75478ff73d325447f3791a5c5ef3d8979cb5b6e02bebb9e6802c6,cf3a739c665c0c242ebee6cf7d15aeddd7612934ad91090d0aabb7ec08fae58a,0)
B. 用戶手動(dòng)轉(zhuǎn)賬ETH至此地址
新生成的DCRM地址需要用戶轉(zhuǎn)賬一些ETH至此賬戶以便測(cè)試。
address := common.BytesToAddress(crypto.Keccak256([]byte(PublicKey)[1:])[12:]).Hex()
C. 構(gòu)造一筆以太坊交易
代碼設(shè)置好轉(zhuǎn)賬金額,接收地址,GAS等。生成交易的RLPHash值,作為分布式簽名sign接口的輸入。
tx := types.NewTransaction(
0x00, // nonce
toAccDef.Address, // to address
big.NewInt(123456789000000000), // amount
48000, // gasLimit
big.NewInt(41000000000), // gasPrice
[]byte(`Powered by FUSION DCRM: The world's first decentralized signature transaction. https://github.com/FUSIONFoundation/dcrm`)) // data
chainID := big.NewInt(CHAIN_ID)
signer := types.NewEIP155Signer(chainID)
fmt.Printf("\nTXRLPhash = %s\n", signer.Hash(tx).String())
D. 基于上述交易的RLPHash值生成分布式簽名
DCRM程序基于交易R(shí)LP編碼后的Hash值生成分布式簽名,返回簽名結(jié)果(r, s, v),程序輸出如下:
--Info: User 0 calculate Commitment in round ONE
--Info: User 1 calculate Commitment in round ONE
--Info: User 2 calculate Commitment in round ONE
--Info: User 3 calculate Commitment in round ONE
--Info: User 0 calculate Zero-Knowledge in round TWO
--Info: User 1 calculate Zero-Knowledge in round TWO
--Info: User 2 calculate Zero-Knowledge in round TWO
--Info: User 3 calculate Zero-Knowledge in round TWO
--Info: Calculate the Encrypted Inner-Data u
u: 167882359539886460048672619095828037061329111643251414745211676555428948869232440666993336977554455944749312838261828269611379656662747270604335155510053737439694060600175435654617636403570309241082173612461012385412871482000968630329958949747092238963343539553972464230870111689727913939449238726449418403624095461570530731215530389374555841571129241692283069383096529494928462050236524655282283479738815745614056876328008527820339125620700724624295715039619903333868218155414893965716176564083809246867219944012760926266318004479811080636392068335287726957388592780877629676856719834808475838730841766110186047441502561711792459932145160777456548648462898370195989630954234978571371738985874822299588167695819261041508809865700472042096436851414380083964739632606368746160280493610841023504556898359908030182848043200363247450190212548224843198166212889465101734451385712493515867912739500885843691192416531433016410863483024184820255204692445426438925971829336332531506448000443974817920771646138893722435351052784089752197408232159855783922480181236131999029818676956056127785614058713557924713028456600255438479426572676251661606059111273440879922793674450519127333020764139110858182639803194122265515956079210346616503357996922
--Info: Calculate the Encrypted Inner-Data v
v: 43465092970691280177698029052618202245685056078947565258101642474160140120330407540175248109690298751814275288454451703773305398185741509852185753150306215984026194016795048194292317711716498211056640649812712851811583007983934212925522905825230004432919497004800896478391331349601388652338760855963317479893596047986417467512421107413879236844183678061499306134562947874452838302811993238059650516185893382623169866263586880164875796032537251995404050449676952957522230734182562856668281738120905795883140513149233553121946217324114869450657562640649071494968909608872146784625143501512145250847930664801143415684445192237834850321262634109554786191930174373507528166033406771214738179630188278351066612645106813192221127592374072217685221726914676421786289281702308836886410623077704304522860395353949085231176541619841708178598143120275005207320150415983577863011613509160587541722536363196385474690882347244294109285484239898306425471091538772546854713952181335787575480882625984694267881042494174010792578406096295045583314468029897776242938665057266633595931199265482356492137672931651515904604223498371308263284434895375425787587483487242768548342536093049416490701618826030117126617905118358594260198292678629414498346977607
--Info: User 0 calculate Commitment in round THREE
--Info: User 1 calculate Commitment in round THREE
--Info: User 2 calculate Commitment in round THREE
--Info: User 3 calculate Commitment in round THREE
--Info: User 0 calculate Zero-Knowledge in round FOUR
--Info: User 1 calculate Zero-Knowledge in round FOUR
--Info: User 2 calculate Zero-Knowledge in round FOUR
--Info: User 3 calculate Zero-Knowledge in round FOUR
--Info: Calculate the Encrypted Inner-Data w
w: 83591876179609340873284393652413787577577167385447697152280364830516779412455088062430761227327283437259436387545074973844930547615611299109190377905543063958627565061651648250749587460210544598115956580268139947669635934075861271746001310600688324767190444375813148912090836014443738013857915976485223368672559743127070788514735925763668141504958086921799969022899004948710278687797175451724780989955076012470449632980491259906269114678140596441717658184589490890327625841500912897878583581040590938340628018072475093196174438980348397122367115476691030480215429360943866482635921531318482228793190377125439768391249529511786123141798917101097679523311041632438281496991251745875755447150403039292069095002136343754428656340296166126548132344165211793798353374110488748694821584516513694683099062644952278575639611473134033919580998156082572307230433000457538426766787372044884086413551545050461141965194342408022557722658456921045064021802921500506055772163605132866276649315316478224428858277242890544963276346429078702709179841885083155300789764508519788457669265733403331033732365753561162022458795715460332097719193106353949250850520889967461271664966101030769199155060788492462427503919048384499601064062134834083423512259217
--Info: Calculate the Encrypted Inner-Data R
R: (84379c5b1d0d1fd295ddc42e5853d120c4e81f6b874ecec87d475a61a7b167bf,bdac131359a69dfd613c80a561244d58ab79d03b9159a390d4e012ffa14b4f89,a62229e25ad7ff2651d2191cf219cd29304f59c5808e5f8d340c85362c348ca2,0)
--Info: Calculate the ECDSA Signature in round FIVE
Real DCRM ECDSA Signature is (r,s,v):
(3647f23d3a6d8407862336e8536dcb8276facf7c5a69749b44dc65d2e467c2fe,64894b2469992357e3dbfcdc64ab5c31983a97531dbdb5a54787f49cb777ecb6,1)
獲得分布式簽名結(jié)果后在交易程序中生成完整交易數(shù)據(jù)結(jié)構(gòu)RawTransaction。
//附加簽名結(jié)果至交易數(shù)據(jù)結(jié)構(gòu)
message, merr := hex.DecodeString(signature)
if merr != nil {
fmt.Println("Decode signature error:")
panic(merr)
}
sigTx, signErr := tx.WithSignature(signer, message)
if signErr != nil {
fmt.Println("signer with signature error:")
panic(signErr)
}
//恢復(fù)公鑰
recoverpkey, perr := crypto.Ecrecover(signer.Hash(tx).Bytes(), message)
if perr != nil {
fmt.Println("recover signature error:")
panic(perr)
}
fmt.Printf("\nrecover publickey = %s\n", hex.EncodeToString(recoverpkey))
//恢復(fù)地址
recoveraddress := common.BytesToAddress(crypto.Keccak256(recoverpkey[1:])[12:]).Hex()
fmt.Printf("\nrecover address = %s\n", recoveraddress)
//生成完成交易數(shù)據(jù)結(jié)構(gòu)RawTransaction
txdata, txerr := rlp.EncodeToBytes(sigTx)
if txerr != nil {
panic(txerr)
}
fmt.Printf("\nRawTransaction = %+v\n\n", common.ToHex(txdata))
E. 發(fā)送交易至以太坊網(wǎng)絡(luò)
生成完成的分布式簽名交易數(shù)據(jù)后,通過(guò)以太坊geth的JSON-RPC接口發(fā)送至以太坊網(wǎng)絡(luò),由礦工進(jìn)行打包交易,交易發(fā)送成功后會(huì)返回交易的hashID供查詢交易狀態(tài)。
// 本地運(yùn)行g(shù)eth連接ethereum網(wǎng)絡(luò)發(fā)送交易: ./geth --rpc console
client, err := ethclient.Dial("http://127.0.0.1:8545") // 8545=geth RPC port
if err != nil {
fmt.Println("client connection error:")
panic(err)
}
fmt.Println("\nHTTP-RPC client connected")
fmt.Println()
//發(fā)送交易到網(wǎng)絡(luò)
ctx := context.Background()
txErr := client.SendTransaction(ctx, sigTx)
if txErr != nil {
fmt.Println("send tx error:")
panic(txErr)
}
fmt.Printf("send success tx.hash = %s\n", sigTx.Hash().String())
至此完成了一筆分布式簽名交易,目前所有DCRM代碼開(kāi)源在github平臺(tái)上,開(kāi)發(fā)者可以隨時(shí)測(cè)試或?qū)彶?,F(xiàn)USION應(yīng)該非常歡迎開(kāi)發(fā)者提交反饋和更新。最后建議開(kāi)發(fā)者設(shè)置chainID=4在測(cè)試網(wǎng)絡(luò)上進(jìn)行分布式簽名交易測(cè)試,避免不熟悉交易代碼導(dǎo)致賬戶資金損失。
3. 為什么說(shuō)是第一筆
FUSION的DCRM分布式簽名技術(shù)繼承比特幣以加密算法解決去中心化信任問(wèn)題的思路,基于最核心的密碼算法,通過(guò)DKG技術(shù)生成分布式私鑰,通過(guò)commitment算法防止惡意攻擊,通過(guò)同態(tài)加密實(shí)現(xiàn)密文處理,通過(guò)零知識(shí)證明實(shí)現(xiàn)隱私驗(yàn)證,通過(guò)門限簽名實(shí)現(xiàn)節(jié)點(diǎn)冗余,最終實(shí)現(xiàn)去中心化的分布式簽名算法。該技術(shù)超越了目前常用的私鑰簽名和多重簽名等技術(shù),具有一定的創(chuàng)新性,F(xiàn)USION基金會(huì)已經(jīng)申請(qǐng)了PCT國(guó)際專利。
未來(lái)
完成了第一筆去中心化分布式簽名交易意味著FUSION的DCRM技術(shù)實(shí)現(xiàn)了核心技術(shù)上的突破,但是這僅僅是個(gè)開(kāi)始,未來(lái)FUSION主網(wǎng)上線后,DCRM將要在全世界成千上萬(wàn)個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)上迎接挑戰(zhàn)形成共識(shí),DCRM將鏈接所有區(qū)塊鏈網(wǎng)絡(luò),迎接未來(lái)的價(jià)值互聯(lián)網(wǎng)!