V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
noli
V2EX  ›  程序员

[讨论] 用基于 VM 的语言(如 C# Java )还是用原生语言如(C/C++ Rust)来写区块链?可能各有什么利弊?

  •  
  •   noli · 2017-10-26 19:17:43 +08:00 · 3227 次点击
    这是一个创建于 2612 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知道从什么角度来切入思考这个问题比较好。

    请各位尽量不就语言本身来撕……
    14 条回复    2017-10-27 23:16:34 +08:00
    czheo
        1
    czheo  
       2017-10-26 20:17:33 +08:00   ❤️ 1
    golang 吧。链接的 node 多了,自带 goroutine 会派上用场。估计也是因为这个,以太坊的官方客户端用 golang。
    glues
        2
    glues  
       2017-10-26 20:39:26 +08:00   ❤️ 1
    Rust 性能好,内存安全
    SuperMild
        3
    SuperMild  
       2017-10-26 20:43:39 +08:00
    涉及金融的貌似用 Erlang 蛮好
    k9982874
        4
    k9982874  
       2017-10-26 20:56:57 +08:00 via iPhone
    各位知道易语言吗(逃
    Elven
        5
    Elven  
       2017-10-26 21:15:33 +08:00 via iPhone
    然而我用了 js ……
    Elven
        6
    Elven  
       2017-10-26 21:15:54 +08:00 via iPhone
    那个顺手用那个喽
    hjc4869
        7
    hjc4869  
       2017-10-26 21:29:27 +08:00   ❤️ 3
    语言没啥关系,差别都在 runtime,C#可以编译成 native code,C/C++也可以编译成 .NET CIL。
    基于 VM 的语言跟 native code 最大的差异应该是 GC,其次是 JIT 的代码质量问题,还有一些别的零碎的问题,比如内存安全的语言,运行时内存安全的代价——边界检查,类型检查等等。

    GC 的存在( JVM,CLR 这类,不包括 golang 那种 simple naive GC )使得这些环境在处理特定 workload 时有较大的优势,主要是在于 GC 分代、移动对象使得程序更加 cache-friendly。虽然用 C#理论上你可以完全绕过 GC,但是实际上也没见过多少人这么做,有这个需求的都去写 C++了🤣

    另外这篇文章给了一些非常具体的数据,可以去看一下。虽然这个是 .NET 2.0 时代的,CLR/JVM 今非昔比,但是一些过去很昂贵的写法,现在仍然要避免。https://msdn.microsoft.com/en-us/library/ms973852.aspx
    CoderGeek
        8
    CoderGeek  
       2017-10-26 22:08:05 +08:00
    go or java
    noli
        9
    noli  
    OP
       2017-10-26 22:10:17 +08:00
    @hjc4869

    我想到了一个可能跟“语言”或者说语言生态有关系的点。
    区块链客户端中,可以预料到 网络 IO 和 密码学相关计算 是最重要的功能。

    从以上考虑出发,应该选一些符合以下条件的:

    1. 在多种常见平台上对 异步 IO 的支持比较好,
    2. 同时生态环境中 密码学库比较成熟的 语言。

    C# 跨平台支持 异步 IO 没什么问题。

    但是 C# 标准库中对密码学的支持感觉比较弱。
    也好像没有像 OpenSSL 那样在密码学领域比较全能的套件?
    hjc4869
        10
    hjc4869  
       2017-10-26 22:37:23 +08:00
    @noli 非阻塞 IO 肯定没问题,不过 C#标准库的设计者根本不懂密码学,完全是外行设计的密码学库。
    但是 .NET 调用 native code 方便,可以直接调用 OpenSSL,用现有的 wrapper 或者自己写都行。别的密码学 C 库也有很多 .NET 的 wrapper。
    如果不在乎性能,可以用 BouncyCastle,不过 .NET 版的 bc 没有 Java 的 bc 好用,有些时候可能会需要抄 Java 那边的代码。
    noli
        11
    noli  
    OP
       2017-10-26 23:44:31 +08:00
    @hjc4869

    我试过用 BC C# 写过一些 demo,甚至有人移植 dotnet core 版本,但真心太难懂,用得我心中没底。
    也有留意到另外一个 SecurityDriven.Inferno 但是没用过。
    stirlingx
        12
    stirlingx  
       2017-10-27 09:05:49 +08:00
    go 吧,C/C++ Rust 太折腾
    leeg810312
        13
    leeg810312  
       2017-10-27 09:21:55 +08:00 via Android
    @hjc4869 请教一下.net 密码学库哪些方面不够好呢?性能?安全性?我 Java 也写,从使用来看,我觉得.net 还是挺方便的,效果和 Java 差不多
    markx
        14
    markx  
       2017-10-27 23:16:34 +08:00
    忍不住想说句题外话,一大堆推荐各种语言的,大家都不看清题就作答么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 17:54 · PVG 01:54 · LAX 09:54 · JFK 12:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.