Cle*_*ent 2 smartcontracts scrypto
我想在 Scrypto 蓝图中制作一款游戏,用户可以使用他们的 Gumball NFT 来玩。
我的蓝图有一种pub fn attack(&self, my_gumball: Proof, other_gumball_key: NonFungibleId)方法,可以通过分配 1 到 10 之间的随机伤害来攻击另一个 NFT。我应该使用Runtime::generate_uuid()它吗?
小智 5
好问题!我将在这里给您举一个 Radix 的小例子,因为随机数的生成是所有区块链/DLT/公共网络都面临的一个问题,而且是一个真正难以解决的问题。
首先,我假设您使用UUIDs 作为 dApp 的随机数,因此整个回复都基于此。在底层,当您调用该Uuid::generate函数时,在发生的一长串调用的末尾,以下函数是处理生成的函数UUID: https: //github.com/radixdlt/radixdlt-scrypto/斑点/24168ae772215af5169549a7a2cc1adeb666baa6/radix-engine/src/engine/id_allocator.rs#L78
如果您查看这个函数,您会发现该函数使用交易哈希+下一个可用的 id 来UUID为您生成。下一个可用的 ID 没什么特别的,它只是一个计数器,每次我们需要生成新 ID 时都会递增。该方法所做的就是在将其tx_hash + next_id加载到 a 之前对其进行两次哈希处理u128,这几乎就是UUID生成的。这意味着 UUID 是一个伪随机数,如果有人知道交易哈希是什么,那么他们将能够确定您将使用的“随机”数。
让我们暂时抛开所有的理论,让我们在代码中尝试一些事情。下面是一些简单的 Scrypto 代码,向您展示 UUID 的非随机性:
use radix_engine::engine::{IdAllocator, IdSpace};
use scrypto::prelude::*;
#[test]
fn test_randomness() {
// Creating the ID allocator
let mut id_allocator: IdAllocator = IdAllocator::new(IdSpace::Application);
// A fictional transaction hash
let tx_hash: H256 = H256::from_str("0e4c5812f00b3c821335c54b3bbc835a157df1149480f6469a4dc6b51489e989").unwrap();
// Generating four UUIDs
println!("Generated UUID: {:?}", id_allocator.new_uuid(tx_hash).unwrap());
println!("Generated UUID: {:?}", id_allocator.new_uuid(tx_hash).unwrap());
println!("Generated UUID: {:?}", id_allocator.new_uuid(tx_hash).unwrap());
println!("Generated UUID: {:?}", id_allocator.new_uuid(tx_hash).unwrap());
}
Run Code Online (Sandbox Code Playgroud)
正如我们所说,该IdAllocator.new_uuid方法需要事务哈希才能运行,因此我为其提供了示例事务哈希。如果我们运行此代码并查看输出,您和我都会在命令行终端中看到以下内容:
Generated UUID: 333873524275763974188597434119212610710
Generated UUID: 315396769568132504258157739854036837613
Generated UUID: 31497316649309892037047888539219683042
Generated UUID: 300332381675622117598720587595812830316
Run Code Online (Sandbox Code Playgroud)
您可能会问,为什么我们都得到相同的输出,这不是随机的吗?
UUID我们双方得到的输出将与依赖于交易哈希和 的变化的随机性完全相同next_id。所以很容易看出这不是随机函数而是伪随机函数。
所以回答你的问题:
在 scrypto 代码生成之前,有人能够猜出数字 5-10 吗?
是的!内存池中的交易的哈希值是可见的,因此存在哈希部分。另外,了解您的蓝图并了解交易期间分配的 ID 数量的人将 100% 能够在加密代码之前猜出随机数,上面的代码是如何做到这一点的示例。
结论:它Uuid::generate可以很好地生成 UUID,但不能很好地生成随机数,因为它并不是真正的随机数函数。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |