摘要:有效的數(shù)字簽名使收件人有理由相信該信息是由已知的發(fā)件人認(rèn)證創(chuàng)建的,發(fā)件人不能否認(rèn)已發(fā)送的信息不可否認(rèn),并且信息在傳輸過程中未被更改完整性。當(dāng)我們說簽署交易時(shí),我們實(shí)際上是指簽署序列化交易數(shù)據(jù)的哈希。
特殊交易:合約注冊
有一種特殊的帶有data,沒有value的交易。表示注冊一個(gè)新的合約。合約登記交易被發(fā)送到一個(gè)特殊的目的地地址,即零地址。簡而言之,合約注冊交易中的+to+字段包含地址 0x0。該地址既不代表EOA(沒有相應(yīng)的私人/公共密鑰對(duì))也不代表合約。它永遠(yuǎn)不會(huì)花費(fèi)ether或啟動(dòng)交易。它僅用作目的地,具有“注冊此合約”的特殊含義。
盡管零地址僅用于合約注冊,但它有時(shí)會(huì)收到來自各個(gè)地址的付款。對(duì)此有兩種解釋:無論是偶然的,導(dǎo)致ether的喪失,還是故意的_ ether燃燒_(見[burning_ether])。如果你想進(jìn)行有意識(shí)的ether燃燒,你應(yīng)該向網(wǎng)絡(luò)明確你的意圖,并使用專門指定的燃燒地址:
0x000000000000000000000000000000000000dEaD
Warning
發(fā)送至合約注冊地址 0x0 或指定燃燒地址 0x0 ... dEaD 的任何ether將變得不可消費(fèi)并永遠(yuǎn)丟失。
合約注冊交易不應(yīng)包含ether value,只能包含合約編譯字節(jié)碼的data。此次交易的唯一影響是注冊合約。
作為例子,我們可以發(fā)布 [intro] 中使用的 Faucet.sol。合約需要編譯成二進(jìn)制十六進(jìn)制表示。這可以用Solidiy編譯器完成。
solc --bin Faucet.sol
======= Faucet.sol:Faucet =======
Binary:
6060604052341561000f57600080fd5b60e58061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146041575b005b3415604b57600080fd5b605f60048080359060200190919050506061565b005b67016345785d8a00008111151515607757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151560b657600080fd5b505600a165627a7a72305820d276ffffd56041f7dc2d2eab69f01dd0a0146446562e25236cf4ba5095d2ee802f0029
相同的信息也可以從Remix在線編譯器獲得。 現(xiàn)在我們可以創(chuàng)建交易。src = web3.eth.accounts[0];> faucet_code = "0x6060604052341561000f57600080fd5b60e58061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d146041575b005b3415604b57600080fd5b605f60048080359060200190919050506061565b005b67016345785d8a00008111151515607757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151560b657600080fd5b505600a165627a7a72305820d276ffffd56041f7dc2d2eab69f01dd0a0146446562e25236cf4ba5095d2ee802f0029"> web3.eth.sendTransaction({from: src, data: faucet_code, gas: 113558, gasPrice: 200000000000})"0x7bcc327ae5d369f75b98c0d59037eec41d44dfae75447fd753d9f2db9439124b"
不需要指定+to+參數(shù),將使用默認(rèn)的零地址。你可以指定 gasPrice 和 gas 限制。 一旦合約被開采,我們可以在etherscan區(qū)塊瀏覽器上看到它。
Etherscan showing the contract successully mined
Figure 5. Etherscan showing the contract successully minded
你可以查看交易的接收者以獲取有關(guān)合約的信息。
eth.getTransactionReceipt("0x7bcc327ae5d369f75b98c0d59037eec41d44dfae75447fd753d9f2db9439124b");
{
blockHash: "0x6fa7d8bf982490de6246875deb2c21e5f3665b4422089c060138fc3907a95bb2",
blockNumber: 3105256,
contractAddress: "0xb226270965b43373e98ffc6e2c7693c17e2cf40b",
cumulativeGasUsed: 113558,
from: "0x2a966a87db5913c1b22a59b0d8a11cc51c167a89",
gasUsed: 113558,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: null,
transactionHash: "0x7bcc327ae5d369f75b98c0d59037eec41d44dfae75447fd753d9f2db9439124b",
transactionIndex: 0}
在這里我們可以看到合約的地址。我們可以按照 將數(shù)據(jù)傳輸?shù)紼OA或合約 所示,從合約發(fā)送和接收資金。
contract_address = "0xb226270965b43373e98ffc6e2c7693c17e2cf40b"> web3.eth.sendTransaction({from: src, to: contract_address, value: web3.toWei(0.1, "ether"), data: ""});"0x6ebf2e1fe95cc9c1fe2e1a0dc45678ccd127d374fdf145c5c8e6cd4ea2e6ca9f"> web3.eth.sendTransaction({from: src, to: contract_address, value: 0, data: "0x2e1a7d4d000000000000000000000000000000000000000000000000002386f26fc10000"});"0x59836029e7ce43e92daf84313816ca31420a76a9a571b69e31ec4bf4b37cd16e"
過一段時(shí)間,這兩個(gè)交易都可以在ethescan上看到
Etherscan showing the transactions for sending and receiving funds
Figure 6. Etherscan showing the transactions for sending and receiving funds
數(shù)字簽名
到目前為止,我們還沒有深入探討“數(shù)字簽名”的細(xì)節(jié)。在本節(jié)中,我們將探討數(shù)字簽名是如何工作的,以及如何在不泄露私鑰的情況下提供私鑰所有權(quán)的證明。
橢圓曲線數(shù)字簽名算法(ECDSA)
以太坊中使用的數(shù)字簽名算法是_Elliptic Curve Digital Signature Algorithm_,或_ECDSA_。ECDSA是用于基于橢圓曲線私鑰/公鑰對(duì)的數(shù)字簽名的算法,如 [elliptic_curve] 中所述。
數(shù)字簽名在以太坊中有三種用途(請(qǐng)參閱下面的邊欄)。首先,簽名證明私鑰的所有者,暗示著以太坊賬戶的所有者,已經(jīng)授權(quán)支付ether或執(zhí)行合約。其次,授權(quán)的證明是_undeniable_(不可否認(rèn))。第三,簽名證明交易數(shù)據(jù)在交易簽名后沒有也不能被任何人修改。
Wikipedia對(duì)“數(shù)字簽名”的定義
數(shù)字簽名是用于證明數(shù)字信息或文件真實(shí)性的數(shù)學(xué)方案。有效的數(shù)字簽名使收件人有理由相信該信息是由已知的發(fā)件人(認(rèn)證)創(chuàng)建的,發(fā)件人不能否認(rèn)已發(fā)送的信息(不可否認(rèn)),并且信息在傳輸過程中未被更改(完整性) 。 來源: https://en.wikipedia.org/wiki...
數(shù)字簽名如何工作
數(shù)字簽名是一種數(shù)學(xué)簽名,由兩部分組成。第一部分是使用私鑰(簽名密鑰)從消息(交易)中創(chuàng)建簽名的算法。第二部分是允許任何人僅使用消息和公鑰來驗(yàn)證簽名的算法。
創(chuàng)建數(shù)字簽名
在以太坊實(shí)現(xiàn)的ECDSA中,被簽名的“消息”是交易,或者更確切地說,來自交易的RLP編碼數(shù)據(jù)的Keccak256哈希。簽名密鑰是EOA的私鑰。結(jié)果是簽名:
((Sig = F_{sig}(F_{keccak256}(m), k)))
其中:
_k_是簽名私鑰
_m_是RLP編碼的交易
Fkeccak256 是Keccak256哈希函數(shù)
Fsig 是簽名算法
Sig 是由此產(chǎn)生的簽名
更多關(guān)于ECDSA數(shù)學(xué)的細(xì)節(jié)可以在 ECDSA數(shù)學(xué) 中找到。
函數(shù) Fsig 產(chǎn)生一個(gè)由兩個(gè)值組成的簽名+Sig+,通常稱為+R+和+S+:
Sig = (R, S)
驗(yàn)證簽名
要驗(yàn)證簽名,必須有簽名(R+和+S),序列化交易和公鑰(與用于創(chuàng)建簽名的私鑰對(duì)應(yīng))。實(shí)質(zhì)上,對(duì)簽名的驗(yàn)證意味著“只有生成此公鑰的私鑰的所有者才能在此交易上產(chǎn)生此簽名。”
簽名驗(yàn)證算法采用消息(交易的散列或其部分),簽名者的公鑰和簽名(+R+和+S+值),如果簽名對(duì)此消息和公鑰有效,則返回TRUE。
ECDSA數(shù)學(xué)
如前所述,簽名由數(shù)學(xué)函數(shù) Fsig 創(chuàng)建,該函數(shù)生成由兩個(gè)值_R_和_S_組成的簽名。在本節(jié)中,我們將更詳細(xì)地討論函數(shù) Fsig 。
簽名算法首先生成_ephemeral_(臨時(shí)的)私鑰/公鑰對(duì)。在涉及簽名私鑰和交易哈希的轉(zhuǎn)換之后,此臨時(shí)密鑰對(duì)用于計(jì)算_R_和_S_值。
臨時(shí)密鑰對(duì)由兩個(gè)輸入值生成:
1.一個(gè)隨機(jī)數(shù)_q_,用作臨時(shí)私鑰 1.和橢圓曲線生成點(diǎn)_G_
從_q_和_G_開始,我們生成相應(yīng)的臨時(shí)公鑰_Q_(以_Q = q * G_計(jì)算,與以太坊公鑰的派生方式相同,參見[pubkey])。數(shù)字簽名的_R_值就是臨時(shí)公鑰_Q_的x坐標(biāo)。
然后,算法計(jì)算簽名的_S_值,以便:
S ≡ q-1 (Keccak256(m) + k * R) (mod p)
其中:
_q_是臨時(shí)私鑰
_R_是臨時(shí)公鑰的x坐標(biāo)
_k_是簽名(EOA所有者)的私鑰
_m_是交易數(shù)據(jù)
_p_是橢圓曲線的素?cái)?shù)階
驗(yàn)證是簽名生成函數(shù)的反函數(shù),使用_R_,S_值和公鑰來計(jì)算一個(gè)值_Q,它是橢圓曲線上的一個(gè)點(diǎn)(簽名創(chuàng)建中使用的臨時(shí)公鑰):
Q ≡ S-1 Keccak256(m) G + S-1 R K (mod p)
其中:
_R_和_S_是簽名值
_K_是簽名者(EOA所有者)的公鑰
_m_是被簽名的交易數(shù)據(jù)
_G_是橢圓曲線生成點(diǎn)
_p_是橢圓曲線的素?cái)?shù)階
如果計(jì)算的點(diǎn)_Q_的x坐標(biāo)等于_R_,則驗(yàn)證者可以斷定該簽名是有效的。
請(qǐng)注意,在驗(yàn)證簽名時(shí),私鑰既不被知道也不會(huì)透露。
Tip
ECDSA必然是一門相當(dāng)復(fù)雜的數(shù)學(xué); 完整的解釋超出了本書的范圍。許多優(yōu)秀的在線指南會(huì)一步一步地通過它:搜索“ECDSA explained”或嘗試這一個(gè):http://bit.ly/2r0HhGB[]。
實(shí)踐中的交易簽名
為了產(chǎn)生有效的交易,發(fā)起者必須使用橢圓曲線數(shù)字簽名算法將數(shù)字簽名應(yīng)用于消息。當(dāng)我們說“簽署交易”時(shí),我們實(shí)際上是指“簽署RLP序列化交易數(shù)據(jù)的Keccak256哈希”。簽名應(yīng)用于交易數(shù)據(jù)的哈希,而不是交易本身。
Tip
在#2,675,000塊,Ethereum實(shí)施了“Spurious Dragon”硬分叉,除其他更改外,還推出了包括交易重播保護(hù)的新簽名方案。這個(gè)新的簽名方案在EIP-155中指定(參見[eip155])。此更改會(huì)影響簽名過程的第一步,在簽名之前向交易添加三個(gè)字段(v,r,s)。
要在以太坊簽署交易,發(fā)件人必須:
創(chuàng)建一個(gè)包含九個(gè)字段的交易數(shù)據(jù)結(jié)構(gòu):nonce,gasPrice,startGas,to,value,data,v,r,s
生成交易的RLP編碼的序列化消息
計(jì)算此序列化消息的Keccak256哈希
計(jì)算ECDSA簽名,用發(fā)起EOA的私鑰簽名散列
在交易中插入ECDSA簽名計(jì)算出的 r 和 s 值
原始交易創(chuàng)建和簽名
讓我們創(chuàng)建一個(gè)原始交易并使用 ethereumjs-tx 庫對(duì)其進(jìn)行簽名。此示例的源代碼位于GitHub存儲(chǔ)庫中的 raw_tx_demo.js 中:
raw_tx_demo.js: Creating and signing a raw transaction in JavaScript
link:code/web3js/raw_tx/raw_tx_demo.js[]
在此處下載: https://github.com/ethereumbo...
運(yùn)行示例代碼:
$ node raw_tx_demo.js
RLP-Encoded Tx: 0xe6808609184e72a0008303000094b0920c523d582040f2bcb1bd7fb1c7c1ecebdb348080
Tx Hash: 0xaa7f03f9f4e52fcf69f836a6d2bbc7706580adce0a068ff6525ba337218e6992
Signed Raw Transaction: 0xf866808609184e72a0008303000094b0920c523d582040f2bcb1bd7fb1c7c1ecebdb3480801ca0ae236e42bd8de1be3e62fea2fafac7ec6a0ac3d699c6156ac4f28356a4c034fda0422e3e6466347ef6e9796df8a3b6b05bed913476dc84bbfca90043e3f65d5224
用EIP-155創(chuàng)建原始交易
EIP-155“簡單重播攻擊保護(hù)”標(biāo)準(zhǔn)在簽名之前指定了重播攻擊保護(hù)(replay-attack-protected)的交易編碼,其中包括交易數(shù)據(jù)中的_chain identifier_。這確保了為一個(gè)區(qū)塊鏈(例如以太坊主網(wǎng))創(chuàng)建的交易在另一個(gè)區(qū)塊鏈(例如Ethereum Classic或Ropsten測試網(wǎng)絡(luò))上無效。因此,在一個(gè)網(wǎng)絡(luò)上廣播的交易不能在另一個(gè)網(wǎng)絡(luò)上廣播,因此得名“重放攻擊保護(hù)”。
EIP-155向交易數(shù)據(jù)結(jié)構(gòu)添加了三個(gè)字段 v,r+和+s。r+和+s 字段被初始化為零。這三個(gè)字段在編碼和散列_之前_被添加到交易數(shù)據(jù)中。因此,三個(gè)附加字段會(huì)更改交易的散列,稍后將應(yīng)用簽名。通過在被簽名的數(shù)據(jù)中包含鏈標(biāo)識(shí)符,交易簽名可以防止任何更改,因?yàn)槿绻湗?biāo)識(shí)符被修改,簽名將失效。因此,EIP-155使交易無法在另一個(gè)鏈上重播,因?yàn)楹灻挠行匀Q于鏈標(biāo)識(shí)符。
簽名前綴字段+v+被初始化為鏈標(biāo)識(shí)符,其值為:
Chain
Chain ID
Ethereum main net
1
Morden (obsolete), Expanse
2
Ropsten
3
Rinkeby
4
Rootstock main net
30
Rootstock test net
31
Kovan
42
Ethereum Classic main net
61
Ethereum Classic test net
62
Geth private testnets
1337
由此產(chǎn)生的交易結(jié)構(gòu)被進(jìn)行RLP編碼,哈希和簽名。簽名算法也稍作修改,以在+v+前綴中對(duì)鏈ID進(jìn)行編碼。
有關(guān)更多詳細(xì)信息,請(qǐng)參閱EIP-155規(guī)范: https://github.com/ethereum/E...
簽名前綴值(v)和公鑰恢復(fù)
如交易的結(jié)構(gòu)所述,交易消息不包含任何“from”字段。這是因?yàn)榘l(fā)起者的公鑰可以直接從ECDSA簽名中計(jì)算出來。一旦你有公鑰,你可以很容易地計(jì)算出地址?;謴?fù)簽名者公鑰的過程稱為_公鑰恢復(fù)_。
給定 ECDSA數(shù)學(xué) 中計(jì)算的值 r 和 s,我們可以計(jì)算兩個(gè)可能的公鑰。
首先,我們根據(jù)簽名中的x坐標(biāo) r 值計(jì)算兩個(gè)橢圓曲線點(diǎn)R和R"。有個(gè)兩點(diǎn),因?yàn)闄E圓曲線在x軸上是對(duì)稱的,所以對(duì)于任何值+x+,在x軸的兩側(cè)有兩個(gè)可能的值適合曲線。
從 r 開始,我們也計(jì)算r-1這是 r 的倒數(shù)。
最后我們計(jì)算 z,它是消息散列的最低位,其中n是橢圓曲線的階數(shù)。
然后兩個(gè)可能的公鑰是:
K1 = r-1 (sR - zG)
和
K2 = r-1 (sR" - zG)
其中:
K1 和 K2 是簽名者公鑰的兩種可能性
r-1是簽名的+r+值的倒數(shù)
s是簽名的+s+值
R和R"是臨時(shí)公鑰_Q_的兩種可能性
z是消息散列的最低位
G是橢圓曲線生成點(diǎn)
為了使事情更有效率,交易簽名包括一個(gè)前綴值 v,它告訴我們兩個(gè)可能的R值中哪一個(gè)是臨時(shí)的公鑰。如果 v 是偶數(shù),那么R是正確的值。如果 v 是奇數(shù),那么選擇R"。這樣,我們只需要計(jì)算R的一個(gè)值。
分離簽名和傳輸(離線簽名)
一旦交易被簽署,它就可以傳送到以太坊網(wǎng)絡(luò)。創(chuàng)建,簽署和廣播交易的三個(gè)步驟通常發(fā)生在單個(gè)函數(shù)中,例如使用+web3.eth.sendTransaction+。但是,正如我們在原始交易創(chuàng)建和簽名中看到的那樣,你可以通過兩個(gè)多帶帶的步驟創(chuàng)建和簽署交易。一旦你簽署了交易記錄,你就可以使用+web3.eth.sendSignedTransaction+傳輸該交易記錄,該方法采用十六進(jìn)制編碼的簽名交易信息并在Ethereum網(wǎng)絡(luò)上傳輸。
你為什么要分開交易的簽署和傳輸?最常見的原因是安全:簽名交易的計(jì)算機(jī)必須將解鎖的私鑰加載到內(nèi)存中。傳輸?shù)挠?jì)算機(jī)必須連接到互聯(lián)網(wǎng)并運(yùn)行以太坊客戶端。如果這兩個(gè)功能都在一臺(tái)計(jì)算機(jī)上,那么你的在線系統(tǒng)上有私鑰,這非常危險(xiǎn)。分離簽名和傳輸功能稱為 離線簽名 offline signing,是一種常見的安全措施。
根據(jù)你所需的安全級(jí)別,你的“離線簽名”計(jì)算機(jī)可能與在線計(jì)算機(jī)存在不同程度的分離,從隔離和防火墻子網(wǎng)(在線但隔離)到完全脫機(jī)系統(tǒng),成為 氣隙 _air-gapped_系統(tǒng) 。在氣隙系統(tǒng)中根本沒有網(wǎng)絡(luò)連接 - 計(jì)算機(jī)與在線環(huán)境是“空氣”隔離的。使用數(shù)據(jù)存儲(chǔ)介質(zhì)或(更好)網(wǎng)絡(luò)攝像頭和QR碼將交易記錄到氣隙計(jì)算機(jī)上,以簽署交易。當(dāng)然,這意味著你必須手動(dòng)傳輸你想要簽名的每個(gè)交易,不能批量化。
盡管沒有多少環(huán)境可以利用完全氣隙系統(tǒng),但即使是小程度的隔離也具有顯著的安全優(yōu)勢。例如,帶防火墻的隔離子網(wǎng)只允許通過消息隊(duì)列協(xié)議,可以提供大大降低的攻擊面,并且比在線系統(tǒng)上簽名的安全性高得多。許多公司使用諸如ZeroMQ(0MQ)的協(xié)議,因?yàn)樗鼮楹灻?jì)算機(jī)提供了減少的攻擊面。有了這樣的設(shè)置,交易就被序列化并排隊(duì)等待簽名。排隊(duì)協(xié)議以類似于TCP套接字的方式將序列化的消息發(fā)送到簽名計(jì)算機(jī)。簽名計(jì)算機(jī)從隊(duì)列中讀取序列化的交易(仔細(xì)地),使用適當(dāng)?shù)拿荑€應(yīng)用簽名,并將它們放置在傳出隊(duì)列中。傳出隊(duì)列將簽名的交易傳輸?shù)绞褂肊thereum客戶端的計(jì)算機(jī)上,客戶端將這些交易出隊(duì)并傳輸。
交易傳播
以太坊網(wǎng)絡(luò)使用“泛洪”路由協(xié)議。每個(gè)以太坊客戶端,在_Peer-to-Peer(P2P)中作為_node,(理想情況下)構(gòu)成_mesh_網(wǎng)絡(luò)。沒有網(wǎng)絡(luò)節(jié)點(diǎn)是“特殊的”,它們都作為平等的對(duì)等體。我們將使用術(shù)語“節(jié)點(diǎn)”來指代連接并參與P2P網(wǎng)絡(luò)的以太坊客戶端。
交易傳播開始于創(chuàng)建(或從離線接收)簽名交易的以太坊節(jié)點(diǎn)。交易被驗(yàn)證,然后傳送到_直接_連接到始發(fā)節(jié)點(diǎn)的所有其他以太坊節(jié)點(diǎn)。平均而言,每個(gè)以太坊節(jié)點(diǎn)保持與至少13個(gè)其他節(jié)點(diǎn)的連接,稱為_鄰居_。每個(gè)鄰居節(jié)點(diǎn)在收到交易后立即驗(yàn)證交易。如果他們同意這是有效的,他們會(huì)保存一份副本并將其傳播給所有的鄰居(除了它的鄰居)。結(jié)果,交易從始發(fā)節(jié)點(diǎn)向外漣漪式地遍歷網(wǎng)絡(luò),直到網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都擁有交易的副本。
幾秒鐘內(nèi),以太坊交易就會(huì)傳播到全球所有以太坊節(jié)點(diǎn)。從每個(gè)節(jié)點(diǎn)的角度來看,不可能辨別交易的起源。發(fā)送給我們節(jié)點(diǎn)的鄰居可能是交易的發(fā)起者,或者可能從其鄰居那里收到它。為了能夠跟蹤交易的起源或干擾傳播,攻擊者必須控制所有節(jié)點(diǎn)的相當(dāng)大的百分比。這是P2P網(wǎng)絡(luò)安全和隱私設(shè)計(jì)的一部分,尤其適用于區(qū)塊鏈。
記錄到區(qū)塊鏈中
雖然以太坊中的所有節(jié)點(diǎn)都是相同的對(duì)等節(jié)點(diǎn),但其中一些節(jié)點(diǎn)由_礦工_操作,并將交易和數(shù)據(jù)塊提供給_挖礦農(nóng)場_,這些節(jié)點(diǎn)是具有高性能圖形處理單元(GPU)的計(jì)算機(jī)。挖掘計(jì)算機(jī)將交易添加到候選塊,并嘗試查找使得候選塊有效的_Proof-of-Work_。我們將在[consensus]中更詳細(xì)地討論這一點(diǎn)。
不深入太多細(xì)節(jié),有效的交易最終將被包含在一個(gè)交易塊中,并記錄在以太坊區(qū)塊鏈中。一旦開采成塊,交易還通過修改賬戶余額(在簡單付款的情況下)或通過調(diào)用改變其內(nèi)部狀態(tài)的合約來修改以太坊單例的狀態(tài)。這些更改將與交易一起以交易_收據(jù)_ receipt 的形式記錄,該交易也可能包含_事件_ events。我們將在 [evm] 中更詳細(xì)地檢查所有這些。
我們的交易已經(jīng)完成了從創(chuàng)建到被EOA簽署,傳播以及最終采礦的旅程。它改變了單例的狀態(tài),并在區(qū)塊鏈上留下了不可磨滅的印記。
多重簽名(multisig)交易
如果你熟悉比特幣的腳本功能,那么你就知道有可能創(chuàng)建一個(gè)比特幣多重簽名賬戶,該賬戶只能在多方簽署交易時(shí)花費(fèi)資金(例如2個(gè)或3個(gè)或4個(gè)簽名)。以太坊的價(jià)值交易沒有多重簽名的規(guī)定,盡管可以部署任意條件的任意合約來處理ether和代幣的轉(zhuǎn)讓。
為了在多重簽名情況下保護(hù)你的ether,將它們轉(zhuǎn)移到多重簽名合約中。無論何時(shí)你想將資金轉(zhuǎn)入其他賬戶,所有必需的用戶都需要使用常規(guī)錢包軟件將交易發(fā)送至合約,從而有效授權(quán)合約執(zhí)行最終交易。
這些合約也可以設(shè)計(jì)為在執(zhí)行本地代碼或觸發(fā)其他合約之前需要多個(gè)簽名。該方案的安全性最終由多重簽名合約代碼確定
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103041.html
摘要:商城小程序的輪播實(shí)現(xiàn)小程序的輪播圖實(shí)現(xiàn)真是太方便了就是這么簡單粗暴。遍歷數(shù)組,把即選的加起來。商品的分類商品分類中主要是根據(jù)商品判斷選擇類別,在這里參考了林鑫大神的分類。 說在前面 從接觸微信小程序到第一次動(dòng)手實(shí)現(xiàn)一個(gè)商城小程序,我發(fā)現(xiàn)我們怕的不是不會(huì)寫,而是不敢動(dòng)手去寫,每個(gè)人都是從無到有,所以勇敢踏出我們的第一步吧,看官方文檔去吧騷年!showImg(https://segment...
摘要:我想說,學(xué)別人注冊優(yōu)步司機(jī)做優(yōu)步是一個(gè)確實(shí)是很奇葩的一個(gè)嘗試。從一開始就表明了我是程序員出身說實(shí)在的,做優(yōu)步司機(jī),從注冊司機(jī)到上路都鬧得不是很好。我想說,剩下的沒一步是好走的。真心說聲程序員兼職做了優(yōu)步就是為了創(chuàng)業(yè) 我是老碼農(nóng)了,從05年碼PHP到現(xiàn)在十年了。 最近一直都在找一個(gè)方向,一個(gè)事業(yè)的方向。在我同輩的人有人去創(chuàng)業(yè)了,有人創(chuàng)業(yè)失敗了,有人又創(chuàng)業(yè)失敗了??傊搅宋疫@個(gè)年齡,確實(shí)...
摘要:前言前后端分離的風(fēng)從我第一天當(dāng)開發(fā)的時(shí)候就已經(jīng)在我耳邊吹得呼呼作響了聽著各種前后端分離的各種牛心里還是有點(diǎn)癢癢后來因?yàn)楦鞣N原因轉(zhuǎn)向前端慢慢地了解起來了前后端分離雖然說轉(zhuǎn)向了前端但是小公司人不多后端接口還是要我寫一點(diǎn)好了上面都是些廢話下面開始 前言 前后端分離的風(fēng)從我第一天當(dāng)開發(fā)的時(shí)候 就已經(jīng)在我耳邊吹得呼呼作響了 聽著各種前后端分離的各種牛X,心里還是有點(diǎn)癢癢 后來因?yàn)楦鞣N原因轉(zhuǎn)向前...
閱讀 1408·2023-04-26 01:58
閱讀 2282·2021-11-04 16:04
閱讀 1753·2021-08-31 09:42
閱讀 1765·2021-07-25 21:37
閱讀 1066·2019-08-30 15:54
閱讀 2074·2019-08-30 15:53
閱讀 3047·2019-08-29 13:28
閱讀 2687·2019-08-29 10:56