V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Elven
V2EX  ›  程序员

继续问一个关于区块链的问题~

  •  
  •   Elven · 2017-10-20 20:20:50 +08:00 via iPhone · 2759 次点击
    这是一个创建于 2576 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近一直在边考研边写区块链,然后现在一个基于 pbft 与 dpos 的区块链写完了,理论上可以运行,但是还没来得及测试。不过现在有一个新的问题摆在了我的面前,智能合约到底是怎么实现的呢?我知道当满足某种条件时,从外界触发可以使合约得到执行。但是这一一切的一切究竟是怎么实现的呢?忧伤,背作文都不开心了😔😔😔
    21 条回复    2017-10-21 10:27:40 +08:00
    czheo
        1
    czheo  
       2017-10-20 20:31:53 +08:00
    你需要定义一套 opcode,然后实现一个 deterministic 的 virtual machine。
    可以参考比特币: https://en.bitcoin.it/wiki/Script
    以及以太坊论文的 22 页: http://gavwood.com/paper.pdf
    Elven
        2
    Elven  
    OP
       2017-10-20 20:41:15 +08:00 via iPhone
    @czheo emmm 大概就是一个堆栈虚拟机喽,外界要如何通知合约比较好呢~
    czheo
        3
    czheo  
       2017-10-20 21:02:52 +08:00
    当生成一个 block 的时候,block 里面的所有 script 被执行。
    Elven
        4
    Elven  
    OP
       2017-10-20 21:18:21 +08:00 via iPhone
    @czheo 如果是需要特定时间嘞
    KgM4gLtF0shViDH3
        5
    KgM4gLtF0shViDH3  
       2017-10-20 21:20:02 +08:00 via Android
    请问有你是通过什么途径学习的呢,有相关的书吗。
    KgM4gLtF0shViDH3
        6
    KgM4gLtF0shViDH3  
       2017-10-20 21:20:47 +08:00 via Android
    比较靠谱的工程化的书。
    czheo
        7
    czheo  
       2017-10-20 21:21:02 +08:00
    @Elven 那你就顶一个 op 可以指定时间执行咯。
    czheo
        8
    czheo  
       2017-10-20 21:22:53 +08:00
    @bestkayle 普林斯顿这套教程是技术上我见过讲的最清楚的。http://bitcoinbook.cs.princeton.edu/
    Elven
        9
    Elven  
    OP
       2017-10-20 21:27:56 +08:00 via iPhone
    @czheo 我可以这么理解咩~当合约发送到网络后,被节点打包并广播到网络,在广播前程序便执行,然后得到一个状态,如果需要定时的话就像启动一个定时器(。・ω・。)唔,如果是要重复执行怎么办呢~比如说资产发行时,程序不能只执行一次呀╮(╯▽╰)╭
    Elven
        10
    Elven  
    OP
       2017-10-20 21:29:06 +08:00 via iPhone
    @czheo 多谢推荐(o^^o)
    Elven
        11
    Elven  
    OP
       2017-10-20 21:30:31 +08:00 via iPhone
    @bestkayle 根据概念实现的,没有通过书
    czheo
        12
    czheo  
       2017-10-20 21:34:06 +08:00   ❤️ 1
    可以这么理解。
    重复执行,在比特币里没有对应的。在以太坊里,其实有两种地址,一种是给人用的,一种是给程序用的(存有代码)。你给第二种地址多次发 txn,相当于执行了那个程序里的代码。具体看这里: http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html
    Elven
        13
    Elven  
    OP
       2017-10-20 21:45:03 +08:00 via iPhone
    @czheo ok,思路终于清晰了不少,感谢大佬的帮助😋😋
    czheo
        14
    czheo  
       2017-10-20 21:51:27 +08:00   ❤️ 1
    有一点:应该不是广播前程序被执行,我的理解是需要 block 生成出来( mined )之后才被执行,而且如果分叉的话可能要维护多个状态。
    qdwang
        15
    qdwang  
       2017-10-20 21:59:58 +08:00 via iPhone
    @Elven 你理解错了。
    1. 所有矿工接收执行合约的请求
    2. 挖出矿的矿工执行所有刚才收的请求
    3. 把结果广播出去,大家都执行一次,来验证

    你要做的精准定时是很难实现的。一般设置时间阈值然后判断的方式比较多。
    czheo
        16
    czheo  
       2017-10-20 22:03:19 +08:00
    @qdwang +1
    qdwang
        17
    qdwang  
       2017-10-20 22:03:58 +08:00 via iPhone   ❤️ 1
    另外智能合约不一定要内建虚拟机自创语言。用现有语言和解释器或虚拟机也可以。自创语言,是为了安全可控并且可计算消耗。
    Elven
        18
    Elven  
    OP
       2017-10-20 22:10:09 +08:00 via iPhone
    @qdwang 嗯哼~,这么说的话我可以去找找现成的 vm😋。唔,这个合约可以是写在好几个区块之前的咩,还是一定要在当前区块呢
    qdwang
        19
    qdwang  
       2017-10-20 22:28:49 +08:00 via iPhone   ❤️ 1
    @Elven 合约可以在任意位置,就像 5 年前开了个比特币账号,存了 1 个比特币。五年后的今天,一样可以操作这个账号转出比特币。一个合约,就像一个特殊的账号,这样理解比较好
    Elven
        20
    Elven  
    OP
       2017-10-20 22:40:34 +08:00 via iPhone
    @qdwang OK ~~
    KgM4gLtF0shViDH3
        21
    KgM4gLtF0shViDH3  
       2017-10-21 10:27:40 +08:00
    @czheo #8 谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1706 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:47 · PVG 00:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.