跳到主要内容

NOTE协议在持续升级

· 阅读需 8 分钟

NOTE协议自2024年2月推出概念验证版索引器以来,已经吸引了广泛关注。根据用户反馈和需求,我们不断对协议进行升级改进。

截至4月4日,我们已经实施了以下升级:

  • 完全展开了Payload数据区,使得Payload数据既可以存储在解锁脚本中,也可以存放在赎回脚本中。
  • 引入了N20的Burn方法,现在可以销毁Token了。
  • 对链下合约执行环境进行了扩展,增加了大量环境变量,包括区块信息(如区块时间、区块哈希、区块高度)以及交易信息(如交易哈希、所有输入和输出)。此外,还包括了Tick信息,例如mint的总额等。
  • 对索引器代码进行了大规模重构。

本次升级的目标之一是让任何人都能参与到NOTE智能合约的开发中来。这意味着任何人都可以创建属于自己的智能合约,并将其发布到NOTE索引器上,从而完成数字资产的发行。我们正在制作一个详尽的合约创建教程。

通过2月份发布的POW挖矿合约,我们可以窥见NOTE协议的强大功能。

我们添加了一些注释来帮助大家更好地理解:

//每个合约都是一个继承自SmartContract的子类,它里面的成员变量都是只读的,需要使用@prop()装饰器来修饰。
export class N20_Pow extends SmartContract {
@prop()
readonly tick: ByteString

@prop()
readonly max: bigint

@prop()
readonly lim: bigint

@prop()
readonly dec: bigint

@prop()
readonly bitwork: ByteString

@prop()
readonly start: bigint

//合约如果包含成员变量,需要使用构造函数进行初始化
constructor(tick: ByteString, max: bigint, lim: bigint, dec: bigint, bitwork: ByteString, start: bigint) {
super(...arguments)
// 数字资产的标识符,名字
this.tick = tick
// 数字资产的最大发行量,如果不设置上限,可以指定为0
this.max = max
// 每个交易的挖矿上限,不能超过最大值
this.lim = lim
// 数字资产的小数单位,比如dec=8,那么1个代币后面就要跟8个零,所有的数量值amt,包括max和lim都是此影响。100000000表示1.00000000
this.dec = dec
//挖矿难度,每笔交易的hash256需要的前置字符
this.bitwork = bitwork
// 挖矿合约的起始高度,用于防止提前预挖
this.start = start
}

//挖矿的区块限制算法,需要使用@method()装饰器来修饰
@method()
getBlockLimit(height: bigint): bigint {
assert(height >= this.start, 'Block height is too low')
//每1000个区块减半一次,减半的次数由区块高度减去起始高度决定
let halvings = (height - this.start) / 1000n
// 最多减半7次
halvings = halvings > 7n ? 7n : halvings
// 每次减半挖矿数量限额都减半。此处使用2进制rshift操作符实现除以2的操作
const subsidy = rshift(this.lim, halvings)
return subsidy
}

// 挖矿的数量限制算法,需要使用@method()装饰器来修饰
@method()
getAmountLimit(currentMined: bigint): bigint {
// 从当前已经挖矿的数量占总量的多少开始数量限制
let miningAmount = this.lim
let threshold = this.max / 2n

//循环7次,每次循环,如果当前挖矿数量达到阈值,则将挖矿数量减半,并更新阈值
for (let halving = 0n; halving < 7n; halving++) {
if (currentMined >= threshold) {
miningAmount /= 2n // Halve the mining amount
threshold += rshift(this.max, halving + 2n) // Update the next threshold
}
}

return miningAmount
}

@method()
public mint(tick: ByteString, amt: bigint, total: bigint, height: bigint, tx: ByteString) {
//检查交易的hash256的前置字符是否符合挖矿合约的难度要求
const txid = hash256(tx)
assert(slice(txid, 0n, len(this.bitwork)) == this.bitwork, 'not match target')
// 检查挖矿总量是否超过最大发行量
assert(this.max == 0n || total <= this.max, 'Over max')
assert(tick == this.tick, 'Tick does not match')
// 检查挖矿数量是否超过区块限制以及总量减半限制
const limit1 = this.getBlockLimit(height)
const limit2 = this.getAmountLimit(total)
const limit = limit1 > limit2 ? limit2 : limit1
assert(amt <= limit && amt <= this.max - total, 'Amount check failed')
}

// 转移Token的方法,需要使用@method()装饰器来修饰
@method()
public transfer(tick: ByteString) {
assert(tick == this.tick, 'Tick does not match')
}
}

在上面的代码中有一个BUG. 如果你希望使用它发行资产,注意不要让max=0. 任何资产发行都需要谨慎测试合约。

本次升级新增了Burn方法,允许销毁Token。以下是一个新示例

//此例子没有使用构造函数,而是使用静态设置参数的方式,因为数值完全在合约中,无法复用给其他的数字资产
export class N20_Joss extends SmartContract {
//joss paper 纸钱:一种金银纸,被剪成类似钱币的形状,在神像前焚烧的纸钱。
@prop()
static tick: ByteString = toByteString('JOSS', true)

//没有发行上限
@prop()
static max: bigint = 0n

//每次可以发行1万个
@prop()
static lim: bigint = 10000n

//没有小数位
@prop()
static dec: bigint = 0n

@method()
public mint(tick: ByteString, amt: bigint) {
assert(tick == N20_Joss.tick, 'Tick does not match')
//发行数量不能超过限额1万
assert(amt == N20_Joss.lim, 'Limit does not match')
}

@method()
public transfer() {
//不能转账
assert(false)
}

@method()
public burn(tick: ByteString) {
//可以烧掉
assert(tick == N20_Joss.tick, 'Tick does not match')
}
}

N20_Joss合约部署在BTC主网的交易是: https://mempool.space/tx/c2cda4c9da3a91bd245d9f6250b5ca8f2ec81d50c14821e87a033fde1f3b5561

NOTE协议支持智能合约,这是其与其他协议最大的不同。NOTE钱包和索引器为智能合约提供了执行环境,使用户能够编写自己的智能合约。关于智能合约的基础知识,可以参考:

为何比特币智能合约是图灵完备的语言:

NOTE协议的智能合约开发教程即将推出,敬请期待。

NOTE,首个实用的原生比特币智能合约协议

· 阅读需 15 分钟

NOTE协议标志着比特币历史上的一项重大进展。

NOTE协议是基于比特币UTXO模型的数字资产发行协议,区别于最近出现的其他协议,它真正构建在比特币的UTXO模型之上。采用与TypeScript兼容的智能合约语言,其约编译结果为比特币原生操作码,图灵完备,可包括Oracle和零知识证明在内的强大功能集合。

与Ordinals和Atomicals等协议不同,NOTE虽然也通过索引器来统计用户资产,但其全部基于密码学,由比特币矿工确保资产所有权,避免了因索引器标记而发生的误操作问题。此外,NOTE的交易成本极低,无需像Ordinals和Atomicals那样发送两笔交易。更为重要的是,NOTE协议支持智能合约,比如实现Bitwork挖矿和随时间递减的挖矿量。它使用的是实际的Token数值,而非基于Satoshi编号的素数协议也非依赖UTXO余额的染色币方案。

相较于许多“链间桥接协议”,NOTE发行的是比特币原生资产,不涉及使用BTC作为抵押在其他链上发行和交易资产的操作。

协议Ordinals/BRC20Atomicals/ARC20EVM/Zk Layer2NOTE/N20
使用UTXO使用使用不使用使用
是否为比特币资产
支持智能合约不支持不支持支持(EVM账号)支持(比特币脚本)
使用索引器使用使用不使用使用
索引器的视线逻辑聪序数编码染色聪-密码学
跨链转账不支持不支持通过跨链桥支持协议支持
交易费用中低
项目资金未知有或者未知

NOTE协议支持跨链,它可以将比特币上的原生资产发送给其他UTXO链,以及接收来自其他UTXO链的资产。这一切都基于密码学和比特币区块链共识。

NOTE协议,完全来自比特币开发社区开发者的开发。

下面进行详细的技术解读

UTXO模型的优势正在重新回到大众视野。比特币作为数字货币的定海神针,需要可用而且好用的技术方案,NOTE协议应运而生。

比特币UTXO模型相比较EVM模型有巨大的效率和并发优势。但在UTXO模型的比特币上发行原生资产,涉及到多个难以解决的问题,主要课题是资产如何标识。另外就是紧密的交易结构中资产如何保存。

一个UTXO形式的交易如下图

Image1

NOTE协议采取了一种创新的方法来处理比特币交易和资产的管理,这种方法与其他协议方案有显著的不同。在传统的比特币交易中,交易的输入部分解锁了之前交易的输出(即旧的UTXO),并生成新的交易输出(即新的UTXO)。在其他协议方案中,资产被绑定在新生成的UTXO上,导致用户的资产分散在不同的UTXO中。这种方式需要索引器和钱包维护一个详尽的UTXO列表来确保资产绑定关系的准确性,同时必须非常谨慎地管理带有资产标记的UTXO,以避免误花费,并且必须一次性花费整个UTXO。

相比之下,NOTE协议采用了一种将交易输出视为用户账号的方法,其中用户的账号由其交易输出脚本哈希表示,如同示例中的TX1交易输出所示。这种账号是完全隐私的,其绑定的资产类型和数量源自于TX1的解锁输入。当在TX2中花费这些资产时,经过比特币矿工的确认解锁后,会生成新的交易输出。在这个过程中,NOTE协议的索引器仅需记录在解锁时公开的交易细节,并且能够在区块确认后提供默克尔证明来验证交易的有效性。

这种设计不仅简化了资产的追踪和管理,减少了用户资产分割的问题,还增加了交易的隐私性。通过将交易输出用作账号,并依赖于比特币网络的矿工验证和区块链共识机制,NOTE协议为数字资产的管理提供了一种更加安全、高效和隐私保护的方法。

一个典型的Taproot P2TR格式的交易如下所示 Image2

NOTE协议采用的技术策略与Ordinals和Atomicals协议有显著的不同之处。Ordinals和Atomicals利用P2TR(Taproot)的赎回脚本,通过添加OP_FALSE OP_IF操作码构造了一个不可访问的数据区域,以此来嵌入额外数据。而NOTE协议则允许通过操作码直接操作解锁数据,提高了数据的可用性。在NOTE协议中,示例脚本能够直接从堆栈中弹出数据,更复杂的脚本则能实现如hashlock等链上的检查功能。

此外,NOTE协议不限于使用P2TR,它还可以通过P2SH(Pay to Script Hash)、P2WSH(Pay to Witness Script Hash)和非标准脚本来实现,这增加了协议的灵活性和跨链资产交易的能力。NOTE协议使用msgpack数据编码而不是json编码,这种方式更为紧凑,有助于减少每笔交易的数据量,从而降低用户的交易成本。

在NOTE协议中,由特定的赎回脚本构建的地址充当用户账户。这些账户地址在被正确解锁时才能被矿工确认。解锁脚本中包含的资产交易数据在解锁时被索引器识别,并进行链下智能合约处理。只有在链下合约验证通过的资产交易才会被索引器记录,这一机制有效防止了比特币钱包误花费NOTE的UTXO,并且使得UTXO中的微量比特币(例如546 Satoshi)可以被回收。

NOTE协议的设计考虑了比特币网络自2017年以来关于隐私和交易空间优化的多次升级。与此同时,它也借鉴了BSV(Bitcoin SV)所代表的大区块策略,深入挖掘比特币脚本的潜能。NOTE协议的智能合约解决方案是基于sCrypt团队开发的比特币智能合约语言,该语言支持链下合约验证。由于比特币脚本语言是图灵完备的且可以确保在给定的脚本长度内执行完成,因此索引器不会因智能合约设计不当而陷入死循环,保证了系统的稳定性和效率。

演示用的N20资产发行智能合约项目已经被发布在GitHub上。 https://github.com/NoteProtocol/scryptdemo

Image3

它演示了NOTE协议下的Pow合约通过模拟比特币挖矿的减半机制和Atomicals的Bitwork难度挖矿,展示了在比特币网络上实现复杂逻辑的能力。通过生成1KB大小的比特币脚本,该合约允许索引器调用并校验交易是否符合协议规定,这一过程体现了智能合约在比特币网络中应用的可行性和灵活性。

更复杂的基于Rabin签名算法的Oracle和基于零知识证明的复杂合约则提供了高级别的应用场景。这些技术在智能合约的实现中,特别是在需要验证特定条件或执行特定逻辑时,发挥着至关重要的作用。

通过利用这些智能合约,比特币上的资产发行可以被用于实现真实世界的应用场景,例如AI解决问题的悬赏金场景。在这类场景中,只要有人能提交一个可验证的计算结果,就能获得奖赏。这不仅显示了比特币智能合约的实用性,还展示了它们如何促进复杂应用的实现,这些应用超越了传统的金融交易和资产管理。

N20 Token资产发行功能是NOTE协议中众多功能中的一部分。NOTE协议还包括DID(去中心化身份)以及加密数据和所有权标识,并且随着N721 NFT和Alias(比特币别名系统)的制定和验证进程,NOTE协议的能力和应用范围预计将进一步扩展。

为了让用户能够体验N20 Token的铸造(mint)和转移(transfer),一个命令行钱包已经发布在GitHub上,而开源的索引器也计划将被发布。

NOTE协议背后的开源代码贡献者们强调,所有内容仅用于技术探讨,任何资产的发行和炒作都与代码贡献者无关。NOTE仅仅是一个开源的技术项目。

随着NOTE协议的进一步开发和完善,可以预见将有更多基于此协议的真实应用诞生,这些应用将利用NOTE协议的独特功能和优势,在比特币以及更广泛的区块链领域创造新的价值和可能性。开源社区的持续贡献和协作精神是推动这一进程不可或缺的力量。

总结

NOTE协议代表了比特币网络向智能合约功能扩展的一个重要进展。通过在比特币这个最为原始和广泛使用的加密货币平台上引入智能合约,NOTE协议不仅增强了比特币的功能性,还为开发者和用户提供了前所未有的创新可能性。以下是NOTE协议的几个关键特点:

智能合约支持:NOTE协议通过智能合约扩展了比特币的应用范围,允许在比特币网络上创建和执行更复杂的逻辑和交易类型。这包括但不限于资产发行、去中心化金融(DeFi)应用、以及其他需要条件执行的场景。

基于UTXO的模型:与基于账户的智能合约平台不同,NOTE协议建立在比特币的UTXO模型之上,借力了比特币的安全性和高效率。

跨链功能:NOTE协议支持跨链交易,使数字资产能够在不同的UTXO链之间移动,进一步提高了其灵活性和应用范围。

真实世界的应用:NOTE协议支持先进的密码学技术,如零知识证明和Rabin签名算法,可以应用在更复杂的真实世界应用场景中。

低成本和高效率:通过优化数据存储和使用msgpack编码,NOTE协议旨在减少交易成本和提高网络效率。

开源和社区驱动:NOTE协议强调开源精神和社区的贡献,促进了技术的透明性和可信赖性,同时也鼓励了更广泛的开发和应用创新。

随着NOTE协议的发展和应用的深入,我们可以期待在比特币生态中出现更多创新的应用和服务,这些都将在保持比特币核心价值观的同时,为用户提供更丰富的功能和更好的体验。

NOTE协议

网站: https://noteprotocol.org

X: https://twitter.com/NoteProtocol

GitHub: https://github.com/NoteProtocol

NOTE协议草案问世

· 阅读需 2 分钟

🚀 我们团队的激动人心的更新:我们设计了一种 #比特币 #第二层协议,专为 #UTXO 基础的区块链量身定做。这个协议不仅允许创建代币和NFT,还整合了可选的数据 #加密、#智能合约 和 #DID 定义,所有这些都在 MIT 许可证下。

🔬 第一部分已在 #BTC、#RXD 和 #BSV 网络上成功测试。#NFT/#代币/索引器功能即将完成,经过彻底验证以确保高安全标准后,计划于一月发布。

🌍 随着我们前进,我们邀请社区为这个不断进化的项目做出贡献。我们的目标是建立一个协议委员会,由贡献者组成,致力于推广和增强协议,确保它有效地服务于全球比特币社区。

🔧 在这一创新与合作的旅程中,你的参与至关重要。我们在这里支持利用这一协议的项目,促进一个安全而动态的区块链生态系统。

🔔 请保持关注详细更新,并成为塑造区块链技术未来的一部分。#区块链工程 #比特币协议 #去中心化创新 #开源未来

新年快乐大家!