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