About Avm
Published:
Parsing of the AVM
今天我们终于得到了关于AVM的部分信息:https://x.com/atomicalsxyz/status/1777657512872890571?s=46 推特上已经有很多人在讨论推测avm的细节了,我今天一直在搜相关的帖子,想要了解更多的信息。晚上终于有时间梳理下我的想法。
- High level programming language
- 一个新的针对avm合约的语言?
- Private contract state
- 这个我不理解,合约部署到链上后是公开的了。如何做到合约状态私密呢?
- 100% on-chain logic and data. #L1
- 完全理解,并且完全符合大家预期,我们不想要一个L2或者侧链
- Smart contracts are called #Reactors
- 智能合约在atomicals这里有一个新的名词:Reactors
- Complete developer freedom
- 无需多言
- Swap, stake, deposit withdraw #ARC20
- 针对arc20,avm可以做到以上几点(这是我们期待的,但是还不够,还缺少一些细节)
- Turing Complete
- 所以,一个新的合约开发语言,并为我们提供图灵完备的智能vm
- Payable contract methods turns every #ARC20 into a medium of exchange in any contract reactor
- reactor包含的合约方法可以是付费调用的,任何ft都可以作为reactor的输入,我先这么理解了
我们看下reactor是如何工作的吧
首先alice编写了一个智能合约
Reactor: MyCrowdFunder
{
owner string
ftAmount map[string]int64 // key:ftAtomicalsID, value: ft amount
}
func deploy(owner:Address){
this.owner=owner
}
func deposit(message:String) {
ftAtomicalsID,ftAmount:=parse(message)
this.ftAmount[ftAtomicalsID]+=ftAmount
}
func withDraw(message:String){
if tx.PublicKey.Hex()!=owner{
return
}
ftAtomicalsID,ftAmount:=parse(message)
this.ftAmount[ftAtomicalsID]+=ftAmount
}
func close()
- alice发了一笔btc交易,在witness字段中包含合约文本,合约被提交到btc链上
- 索引器捕获到步骤1中的witness,得到一个合约,并生成一个对应的atomicalsID_1
- alice发了一笔btc交易,调用了atomicalsID_2的合约方法,deploy(alice’s btc address),该操作使得alice派生出了一个Reactor
- 索引器捕获到步骤3,为该reactor生成一个atomicalsID_2,并在数据库中维护该reactor的数据
- bob想要给alice捐款,bob发了一笔btc交易,调用atomicalsID_2的方法deposit(1000 atom), bob的交易中将其中一个vin包含1000个atom
- 索引器捕获步骤5,将bob的1000个atom销毁。更新reactor的ftAmount。
- alice调用atomicalsID_2的合约方法withDraw,提取1000atom,该交易的第一个vout至少包含1000个sat。
- 索引器检测到步骤7,执行withDraw方法,并将alice在步骤5中的vout[0]染色1000atom
以上就是大概的合约部署执行流程(细节是我脑补的!!!),这个合约和solidity风格还是挺像的,或者说是一个c++ class,毕竟有个派生的过程。 我们可以确定的是,以上合约的数据维护是索引器在链下完成的,btc链上保存的是一个log式的历史记录,但是合约的最新状态需要索引器告知给用户。
问题来了
- 如何处理恶意的合约代码,比如在合约方法中计算一个非常难解的数,比如二分法逼近计算二次方程的解。或者一个死循环。
- btc的脚本功能非常单一,而且它是一种堆栈式的脚本语言,复杂的运算和函数逻辑根本做不到,也就是说它不是图灵完备的。在区块链上完成图灵完备的计算机这一理想被Vitalik实现了,然后他封神了。
- 如何限制vm图灵完备很重要,evm的答案是收gas。avm呢?我还没有看到任何关于avm gas的信息,我认为没有。那么合约语言里应该对循环逻辑做限制。
- avm提供的开发语言是否会是类似bitvm那种电路包吗?
- 抱歉,电路包这个词是我瞎编的。但是结合现有信息来看,avm应该是一个独立的计算引擎,由索引器调用。
- 我希望它是一个跨语言的动态连接库dll,因为我在写atomicals-core-golang
- 可用性的问题,btc交易确认的时间太长了,很多交易在mempool中的时间也太长了
- 如果我们想在btc原生做swap,大额交易必然被夹(三明治攻击)
- 是不是我们的思路应该转变一下,swap这种链上数据更新非常高频场景的应用,就不要在L1去做了。
- 不管你玩不玩,反正btc链上swap我不玩
- btc和atomicals ft交互的可编程性
- 从Arthur透露的信息来看,avm只支持对atomicals资产的编程。不过btc和atomicals资产交互编程仍然可以实现,利用bitvm就可以了
- 举例,alice提供1000atom,bob提供0.1btc,他们俩打了一个赌,赢的人获得对方的赌注
- 首先alice将他们的赌约写为bitvm电路提交到btc链上,并向一个响应地址存入1000atom。我可以将赌约简化为1>2吗?
- 接下来就是乐观证明的过程,bob可以挑战赌约的结果,如果bob能够提交该电路结果的证据1确实小于2,响应地址中的1000atom将自动转给bob
- alice创建赌约的同时,bob也需要创建一个赌约,他向一个响应地址转入0.1btc,并将附带一个赌约,赌约内容就是alice的赌约结果决定这0.1btc的归属。
- btc和atomicals ft资产交互编程看起来非常的麻烦,但是我知道这条路经是存在的。因为ft资产本质上仍然是utxo,bitvm完全可以操纵它