开发指南
在比特币UTXO模型中,首先需要理解以下的名词。
部分概念内容同以太坊账号模型稍有不同。
- 助记词:助记词是一组单词,通常由12个或者24个英文单词组成(也有其他语言其他单词数的助记词)。可以通过钱包软件,也可以使用专门软件或者硬件,甚至掷股子生成。助记词需要严格保存好,最好使用纸和笔记录下来,物理保管。
- 钱包:钱包从助记词(种子)可以派生出多个公私钥。钱包主要负责地址的生成与管理,对交易进行签名和广播到区块链,从数据服务商获取交易记录,展示给用户。
- 数字货币:钱包通过BIP44等规范,管理包括BTC/BCH/BSV/RXD在内的多种区块链,以及对应的同名数字货币。每个区块链(数字货币)还可以分主网和测试网。
- 地址:钱包每生成一组公私钥,可以按照模版生成多种格式的地址。常见的包括P2PKH,P2WPKH,P2WSH,P2TR。NOTE协议有两种缺省的模版,P2TR-NOTE和P2TR-COMMIT-NOTE。
- 多地址:钱包可以生成多组公私钥,也就可以生成多组地址。生成数量一般没有限制。
注意:以太坊等账号模型的区块链不分主网和测试网,每组公私钥对应的账号有一个固定的地址。而在比特币UTXO模型中,没有账号的概念,每组公私钥按照模版可以生成多种地址,所有的地址形式不同,但都受私钥控制。
NOTE核心概念
账号
在比特币中没有账号的概念,只有地址。每种地址由交易输出模版构造而成,一个地址就是对交易输出脚本的编码。
在NOTE协议中,我们规定一个交易输出的脚本哈希值为账号。这个定义来自Electrum协议
scriptHash = sha256(script).reverse()
总结 ,账号是交易输出的哈希值,长度固定为256位(32个字节),hex字符串长度是64。地址是交易输出的编码,长度根据脚本的内容和编码规则不同。从地址可以转换为账号,反过来,从账号无法转换为地址。
链上合约
在NOTE协议中,数字资产账号使用特殊的脚本模版构造,不同于标准的P2PKH,P2WSH,P2TR地址,它在BTC中使用Taproot Script定义,一个最简单的脚本是NOTE OP_2DROP OP_2DROP OP_2DROP Pubkey OP_CHECKSIG
还可以是更加复杂的脚本模版,比如多签等等。统称这种脚本为:链上合约
。我们可以使用比特币脚本操作码(OpCode)写简单的链上合约,也可以使用sCrypt语言写复杂的链上合约。
账号的所有权
账号的所有权归属于可以解锁交易输出的一个或者多个私钥持有者。在常见普通的比特币交易中,一个私钥持有者,通过对UTXO的提供解锁脚本,经过矿工检查后获得所有权。同理,如果是一个多签地址,则由多个人的私钥共同签名后获取所有权。
数字资产
数字资产由协议定义,包括N20 Token和N721 NFT等等,数字资产绑定在交 易输出上。不同于染色币,这种绑定不依赖于交易输出的satoshi数量,只跟UTXO本身有关。
操作
操作是指mint,transfer, burn等由协议定义,对数字资产的进行的操作。操作由msgpack编码的一组key-value定义,我们叫做Payload,放置在解锁脚本中。也就是说,如果账号的所有者需要操作数字资产,首先需要通过签名解锁账号UTXO。这个过程就是比特币的交易过程,执行了链上合约,安全性由比特币的矿工机制确保。 比如一个Payload例子
{
"p": "n20",
"op": "transfer",
"tick": "NOTE",
"amt": 100
}
它表示解锁UTXO,将绑定在UTXO中的名为NOTE的数字资产转移给第一个交易输出,如果UTXO中的数字资产大于100,那么余额将转给第二个交易输出。
一旦交易被发布到 区块链上,意味着链上合约执行成功所有权已经确认。NOTE协议索引器从区块链上获取此笔交易,对解锁脚本中的Payload进行解释,检查Payload是否有效,被解锁的UTXO中是否包含足够的代币数量,然后执行链下智能合约,执行tick名字背后的智能合约里的方法,方法名就是op的值,比如transfer。一旦合约执行成功,相应数量的数字资产将被绑定在交易输出上。