我想做一个Scrypto蓝图的游戏,用户可以玩他们的Gumball NFT。
我的蓝图有一个pub fn attack(&self, my_gumball: Proof, other_gumball_key: NonFungibleId)方法,通过给另一个NFT分配1到10之间的随机伤害来攻击它。我应该使用Runtime::generate_uuid()吗?
发布于 2022-04-12 22:18:30
问得好!我在这里给大家一个小小的例子,因为随机数的产生是所有区块链/DLT/公共网络都在努力解决的问题,这是一个真正难以解决的问题。
首先,我假设您使用UUIDs作为您的dApp的随机数,所以整个答复都是基于这一点的。在幕后,当您调用Uuid::generate函数时,在发生的长链调用结束时,下面的函数是处理生成UUID:https://github.com/radixdlt/radixdlt-scrypto/blob/24168ae772215af5169549a7a2cc1adeb666baa6/radix-engine/src/engine/id_allocator.rs#L78的函数
如果您查看这个函数,您将看到该函数使用事务哈希+下一个可用的id为您生成UUID。下一个可用的ID没有什么特别之处,它只是一个计数器,每次我们需要生成一个新的ID时,它都会递增。这个方法所做的就是在将tx_hash + next_id加载到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());
}正如我们已经说过的,IdAllocator.new_uuid方法需要一个事务哈希才能运行,所以我向它提供了一个示例事务哈希。如果我们运行这段代码并查看输出,您和我的命令行终端中都会有以下内容:
Generated UUID: 333873524275763974188597434119212610710
Generated UUID: 315396769568132504258157739854036837613
Generated UUID: 31497316649309892037047888539219683042
Generated UUID: 300332381675622117598720587595812830316你可能会问,,为什么我们都得到相同的输出,这不是随机的吗?
我们两人得到的输出将与UUID的随机性完全相同,这取决于事务哈希和next_id的更改。所以很容易看出,这不是随机函数,而是伪随机函数。
因此,要回答你的问题:
有人可以猜到数字5-10之前,氪码甚至可以产生它?
是!内存池中的事务具有可见的散列,因此有散列部分。另外,知道您的蓝图和在事务期间分配的is数量的人将能够100%地猜出随机数,然后才能猜到这个随机数,上面的代码就是这样做的一个例子。
结论:Uuid::generate很好地生成UUID,但不能很好地生成随机数,因为它不是真正的随机数函数。
https://stackoverflow.com/questions/71849722
复制相似问题