一张图解释一切:
https://i.imgur.com/3oejD6v.jpg
每个人都有一个 Seed,透过这个 seed,我们可以产出很多的地址:
IOTA(seed).generate_address(index=0) -> YVXKJLKAJLAJ9KA....
IOTA(seed).generate_address(index=1) -> UVMQMZOQL9LKJ9G....
每个地址都可以接收或是转帐出去。
今天如果你要发起一笔交易,假设 10 IOTA 好了,
你的各个地址所拥有的 IOTA 如下:
index 0: 5 IOTA
index 1: 3 IOTA
index 2: 5 IOTA
index 3: 0 IOTA
发起交易的时候,程式会先从你的 seed 中产出一个段落的地址,
例如说 index 0 ~ 10 的地址。接者把这些地址丢去 node 查询余额。
知道余额后,程式会依序走过这些余额,并且把对应的地址存起来等等使用。
收集好之后,像这次例子的地址,会用到这些:
index 0
index 1
index 2
总和 13 IOTA,多出来的 3 IOTA 就会从 index 2 的地址转到下一个可用地址中。
也就是 Bundle,不过这边不具体讲 bundle 如何,总之交易看起来就像这样:
index 0 + index 1 + index 2 -> target address
index 2 (余额) -> index 3
取得上面的 bundle 后,IOTA 会进行签署的步骤。
这里就是为什么不能够重复使用已经 spent 出去的地址的原因。
因为 IOTA 使用的是一种叫做 Winternitz One-Time Signatures (WOTS) 的签署方式,
为什么要采用什么鬼 WOTS 来签署,而不是传统的 RSA 之类的方式呢?
因为,据信,当量子电脑出现的时候,RSA 这种形态的加密方式 hen 容易就会被破解,
而 One-Time Signatures 可以抵御量子电脑的攻击。
在 IOTA 里面要如何透过 seed 产生出签署的 key 呢?
大概就是这样:
k = iota.crypto.signing.KeyGenerator(seed)
for addr in addrs:
priv_key = k.get_key_for(addr)
priv_key.sign_input_transactions(bundle, addr.index)
key 是透过地址去产生出来的!
key 是透过地址去产生出来的!
key 是透过地址去产生出来的! (hen 重要)
不过有一好就会有差的地方。如他的名字所言,每个 key 只能够签署一次,签署多次的话
会让这个签署被破解的机率提高。
回到最上面的小猪图,经过前面的解释你应该就可以看懂小猪图了。
你可以无限次数的把 IOTA 放入小猪 (地址) 当中,
但是当你把 IOTA 移出小猪的时候,你就会打破他,
也因此,你就不应该在使用这个小猪了。
但是,解释起来太麻烦,所以直接跟各位说,
地址用过就不要在使用。
TL;DR: 其实这是有前提的,没花用前都可以使用,有转出就不能再次使用。