與其他加密貨幣不同,Grin不使用地址。要發(fā)送或接收Grin,發(fā)件人和收件人必須在彼此之間來回發(fā)送信息。
方法是通過文件共享。此文件可以在幾秒,幾天,幾年或其他任何時(shí)間段內(nèi)共享。
讓我們深入探究一下這個(gè)Grin事務(wù)文件的內(nèi)容。
探索GRIN事務(wù)文件
假設(shè)你想給Bob發(fā)送10.25個(gè)GRIN,你們兩個(gè)想通過一個(gè)文件交換這個(gè)交易的必要信息。運(yùn)行:
grin wallet send -m file -d my_grin_transaction.tx 10.25
這會(huì)生成一個(gè)名為my_grin_transaction.tx的文件,您需要將該文件發(fā)送給Bob,以便他可以向您提供其響應(yīng)文件。
讓我們打開這個(gè)my_grin_transaction.tx文件。
{
“num_participants”: 2,
“id”: “56709cfe-8584-4a02-b94e-bb7e79cfae66”,
“tx”: {
“offset”: [62, 48, 100, 178, 。。。],
“body”: {
“inputs”: [{
“features”: “Plain”,
“commit”: [8, 95, 99, 251, 。。。]
}],
“outputs”: [{
“features”: “Plain”,
“commit”: [8, 216, 52, 10, 。。。],
“proof”: [13, 107, 82, 188, 。。。]
}],
“kernels”: [{
“features”: “HeightLocked”,
“fee”: 8000000,
“l(fā)ock_height”: 22023,
“excess”: [0, 0, 0, 0, 。。。],
“excess_sig”: [0, 0, 0, 0, 。。。]
}]
}
},
“amount”: 10250000000,
“fee”: 8000000,
“height”: 22023,
“l(fā)ock_height”: 22023,
“participant_data”: [{
“id”: 0,
“public_blind_excess”: [2, 66, 。。。],
“public_nonce”: [2, 102, 。。。],
“part_sig”: null,
“message”: null,
“message_sig”: null
}]
}
按照順序,我們有:
· num_participants:此交易涉及的人數(shù)。 Alice到Bob意味著2個(gè)參與者。 Alice到Bob和Charlie意味著有3個(gè)參與者。
· id:此事務(wù)的唯一標(biāo)識(shí)符。這允許我們?cè)趶腂ob接收文件時(shí)跟蹤事務(wù)。
接下來,我們有一個(gè)tx對(duì)象,簡(jiǎn)稱事務(wù)。這包括:
1. 內(nèi)核偏移量(此處命名為offset)。
2. 一個(gè)body對(duì)象,包含有此事務(wù)中使用的輸入,此事務(wù)的輸出(當(dāng)前,只是我們的更改)和事務(wù)內(nèi)核。
讓我們深入研究這些。
· offset:內(nèi)核偏移量。這是一個(gè)隨機(jī)值,我們選擇從我們的盲目因子中減去,以使任何人更難以在區(qū)塊鏈上跟蹤此交易。
此tx對(duì)象中的下一個(gè)是輸入對(duì)象。此對(duì)象包含有關(guān)我們?cè)诖耸聞?wù)中花費(fèi)的輸出的信息。
“inputs”: [{
“features”: “Plain”,
“commit”: [8, 95, 99, 251, 。。。]
}],
· feature:在此示例中,我們正在花費(fèi)的輸出功能(此事務(wù)的輸入)設(shè)置為“Plain”。此功能變量可以是“Plain”或“Coinbase”。
CoinBase輸出是從挖掘獎(jiǎng)勵(lì)中生成的輸出。一個(gè)普通的輸出僅僅意味著它不是一個(gè)coinbase輸出。
· commit:我們要花費(fèi)的輸出。Grin的輸出是Pedersen承諾。要了解這些是如何工作的,您可以閱讀Grin wiki。
在tx對(duì)象中,我們繼續(xù)到輸出數(shù)組。
“outputs”: [{
“features”: “Plain”,
“commit”: [8, 216, 52, 10, 。。。],
“proof”: [13, 107, 82, 188, 。。。]
}],
你會(huì)注意到這個(gè)輸出數(shù)組已經(jīng)有了我們交易的輸出。如果我們花費(fèi)10.25 Grin,我們?cè)谶@個(gè)事務(wù)中只使用一個(gè)輸入,那么該輸入至少包含10.25 Grin。例如如果此輸入包含20 Grin,則此事務(wù)還需要輸出以將9.75 Grin發(fā)送回給我們!
Grin的獨(dú)特之處在于Bob需要參與任何輸出,但由于我們尚未將此文件發(fā)送給Bob,我們還沒有準(zhǔn)備好創(chuàng)建交易的那部分。我們的更改輸出與Bob無關(guān),這就是為什么我們已經(jīng)能夠計(jì)算我們的更改輸出。
除了feature和commit,此輸出還包含一個(gè)證明。這是一個(gè)輸出的范圍證明,它證明了該輸出中的Grin量是非負(fù)的。范圍證明允許我們以加密方式證明輸出是非負(fù)的,而不會(huì)顯示實(shí)際輸出的內(nèi)容。
此事務(wù)文件的下一部分是內(nèi)核數(shù)組。
“kernels”: [{
“features”: “HeightLocked”,
“fee”: 8000000,
“l(fā)ock_height”: 22023,
“excess”: [0, 0, 0, 0, 。。。],
“excess_sig”: [0, 0, 0, 0, 。。。]
}]
事務(wù)內(nèi)核也從features變量開始。這一部分可能有點(diǎn)令人困惑:正如我前面解釋的,您看到的任何輸出的features變量要么是“plain”,要么是“coinbase”。但在事務(wù)內(nèi)核中,features變量可以是“plain”、“coinbase”或“heightlocked”。
事務(wù)內(nèi)核中的三種不同“特性”:Coinbase,Plain和HeightLocked
“plain”事務(wù)意味著lock_height為0。換句話說,一旦將此事務(wù)廣播到網(wǎng)絡(luò),節(jié)點(diǎn)就可以開始挖掘它。一旦挖掘到任何Grin事務(wù),就可以使用其輸出。相反,HeightLocked事務(wù)意味著在某個(gè)塊編號(hào)之前無法挖掘事務(wù)。
挖掘后的輸出將具有“plain”或“Coinbase”的特征,如上所述,因?yàn)樗谕诰蛑翱赡芤呀?jīng)被HeightLocked。
“outputs”: [{
“features”: “Plain”,
“commit”: [8, 216, 52, 10, 。。。],
“proof”: [13, 107, 82, 188, 。。。]
}],
接下來,事務(wù)內(nèi)核還包含fee和lock_height,內(nèi)核過剩(此處表示為多余)以及事務(wù)的簽名(此處表示為excess_sig)。
當(dāng)我們?cè)谑盏紹ob的響應(yīng)文件之前,我們還不能計(jì)算excess和excess_sig的值。這就是為什么這些數(shù)組都用0填充的原因。
在tx對(duì)象之后,我們有剩下的一些字段:
“amount”: 10250000000,
“fee”: 8000000,
“height”: 22023,
“l(fā)ock_height”: 22023,
“participant_data”: [{
“id”: 0,
“public_blind_excess”: [2, 66, 。。。],
“public_nonce”: [2, 102, 。。。],
“part_sig”: null,
“message”: null,
“message_sig”: null
}]
· amount:轉(zhuǎn)移的Grin量,為原子單位1 nanoGrin的倍數(shù)。nanoGrin是Grin的十億分之一。只有發(fā)送人和接收人才會(huì)看到此金額。
· fee:交易的采礦費(fèi),也是1 nanoGrin的倍數(shù)。
· height:創(chuàng)建此事務(wù)文件的塊編號(hào)。
· lock_height:此事務(wù)的輸出變得可用的塊編號(hào)。在這種情況下,您會(huì)注意到lock_height等于height變量,這意味著可以立即挖掘此事務(wù)。
接下來,我們有一個(gè)participant_data數(shù)組。
“participant_data”: [{
“id”: 0,
“public_blind_excess”: [2, 66, 。。。],
“public_nonce”: [2, 102, 。。。],
“part_sig”: null,
“message”: null,
“message_sig”: null
}]
這包含事務(wù)參與者之間來回傳遞的信息。到目前為止,這只包含我們的數(shù)據(jù),因?yàn)槲覀冞€沒有與Bob共享這個(gè)文件。
· id:此交易中參與者的ID。ID為0對(duì)應(yīng)于交易的發(fā)送人,即我們。
· public_blind_excess:對(duì)我們致盲因素總和的承諾。
· public_nonce:對(duì)我們的隨機(jī)數(shù)的承諾。這用于構(gòu)建事務(wù)簽名。
· part_sig:我們的部分簽名是空的,因?yàn)樵趶腂ob接收到數(shù)據(jù)之前,我們無法創(chuàng)建它。
· message:可以添加到您的交易中的額外“消息”。如果使用-g標(biāo)志創(chuàng)建此文件并在之后添加任意字符串,則此消息將顯示在此處。
注意:當(dāng)人們通常引用Grin交易的“message”時(shí),它們通常表示交易費(fèi)(如果有的話)和lock_height(如果有的話)。這個(gè)額外的“message”字段是完全獨(dú)立的:您可以添加一個(gè)字符串發(fā)送給Bob,反之亦然,它永遠(yuǎn)不會(huì)在鏈上發(fā)布。
· message_sig:我剛才提到的額外“message”字段是由你所有盲目因素的總和簽名的。該簽名放在這里,Bob可以通過使用您對(duì)所有致盲因素總和的承諾來驗(yàn)證該消息。Bob收到此文件后,可以將自己的額外message和message_sig添加到文件中。我們可以用同樣的方式驗(yàn)證他的信息。
我們將此文件發(fā)送給Bob,并等待他的響應(yīng)文件。
Bob的響應(yīng)文件
Bob使用以下命令在他的Grin客戶端中接受此文件:
grin wallet receive -I my_grin_transaction.tx
此命令為Bob生成一個(gè)my_grin_transaction.tx.response文件,Bob將發(fā)送回我們。
讓我們打開這個(gè)文件。
{
“num_participants”: 2,
“id”: “56709cfe-8584-4a02-b94e-bb7e79cfae66”,
“tx”: {
“offset”: [62, 48, 100, 。。。],
“body”: {
“inputs”: [{
“features”: “Plain”,
“commit”: [8, 95, 99, 。。。]
}],
“outputs”: [{
“features”: “Plain”,
“commit”: [8, 206, 65, 。。。],
“proof”: [36, 101, 181, 。。。]
}, {
“features”: “Plain”,
“commit”: [8, 216, 52, 。。。],
“proof”: [13, 107, 82, 。。。]
}],
“kernels”: [{
“features”: “HeightLocked”,
“fee”: 8000000,
“l(fā)ock_height”: 22023,
“excess”: [0, 0, 0, 。。。],
“excess_sig”: [0, 0, 0, 。。。]
}]
}
},
“amount”: 10250000000,
“fee”: 8000000,
“height”: 22023,
“l(fā)ock_height”: 22023,
“participant_data”: [{
“id”: 0,
“public_blind_excess”: [2, 66, 3, 。。。],
“public_nonce”: [2, 102, 201, 。。。],
“part_sig”: null,
“message”: null,
“message_sig”: null
}, {
“id”: 1,
“public_blind_excess”: [3, 99, 72, 。。。],
“public_nonce”: [3, 246, 48, 。。。],
“part_sig”: [90, 35, 157, 。。。],
“message”: null,
“message_sig”: null
}]
}
我們可以看到,這個(gè)文件是我們發(fā)送給Bob的所有內(nèi)容,還有他自己添加的一些數(shù)據(jù)。
在參與者數(shù)據(jù)數(shù)組中,我們看到id為1(Bob)的參與者的新條目。 Bob加上他對(duì)他的盲目因素的承諾,以及他對(duì)他的nonce的承諾,以及最后他的部分簽名。
完成交易
當(dāng)我們收到Bob的響應(yīng)文件時(shí),我們運(yùn)行以下命令來完成事務(wù):
grin wallet finalize -i my_grin_transaction.tx.response
我們實(shí)際上并沒有看到填充的缺失部分 - 相反,我們看到:
現(xiàn)在我們擁有了Bob創(chuàng)建輸出并將其添加到輸出數(shù)組所需的所有信息。在背后,我們的GRIN客戶機(jī)填充丟失的部分(比如excess和excess_signature),將這些數(shù)據(jù)序列化為一個(gè)字節(jié)數(shù)組,并通過GRIN網(wǎng)絡(luò)發(fā)送數(shù)據(jù)以進(jìn)行驗(yàn)證。
很快,這個(gè)GRIN交易將被挖掘,Bob將收到他的10.25 GRIN,我們將收到我們的零錢。
評(píng)論
查看更多