在以太坊中,每笔交易都有一个nonce值,该nonce值代表的是从该交易发起地址发出的交易数。(当存在使用同一地址从多个客户端发起交易时,客户端需从链上同步nonce值。具体也可参见chainlink中的同步机制。) 在英文中,nonce表示的仅可使用一次的数字。 在密码学中,nonce为以随机或伪随机方式产生的一次性使用的数字,用于保护主密码传输安全,防止重放攻击。
当你发送交易时,需对该nonce值增加1。 符合以下规则的交易可认为是有效交易:
- 交易必须是有序的。不可能 具有nonce 1的交易 在 具有nonce 0的交易 之前被挖出。
- nonce值是连续的,不存在跳跃的情况。若不存在具有nonce 0和nonce 1的交易,则不可能挖出具有nonce 2的交易。
由于以太坊交易中nonce值代表了交易的顺序,因此可防止双花。 当双花交易确实发生时,则通常需遵循以下流程:
- 交易由某一方发起;
- 等待交易注册;
- 需从该笔交易中收集某些信息;
- 此时有另一笔交易以更高的gas费快速发起;
- 第二笔交易被优先挖出,从而使第一笔交易失效。
这也是为何交易所要等待一定数量的confirmation之后才允许你对新存入的资金进行交易。 而对于以太坊来说,以上流程不可能成立。因为在以太坊中,第二笔交易(如具有nonce 3)不可能在第一笔交易(比如具有nonce 2)之前被挖出。
2. 区块链中交易的confirmation区块链中一笔交易的confirmation,意味着该笔交易已验证且已通过挖矿等方式添加到了区块链中。 当一笔交易被挖出,其即被包含在区块链中了,其得到了1个confirmation。
不同的区块链平台其挖出区块的时间各不相同,该时间称为blocktime。 在Bitcoin中,平均每10分钟挖出一个新的区块。当有一个新的区块之后,现有区块链中的每笔交易都额外增加了一个confirmation。当交易被reverse或双花时,confirmation数量会减少。
对于incoming交易,通常需要一定数量的confirmation。当某笔交易的confirmation数量达到一定值之后,可认为该笔交易已接收。
不同平台所需的confirmation和相应的预估时间如下:
[1] What Are Blockchain Confirmations and Why Do They Matter? [2] Why is my transaction “pending”? [3] Block time and confirmation time [4] How many confirms is considered ‘safe’ in Ethereum? [5] What are the differences (and relationship) between the steps used to (1) validate a transaction and (2) confirm a block? [6] What number of confirmations is considered secure in Ethereum? [7] What is a Block Confirmation on Ethereum? [8] What is the required number of confirmations? [9] What is a Nonce?