惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cloudbric
Cloudbric
V
Visual Studio Blog
L
LangChain Blog
A
About on SuperTechFans
B
Blog
T
Tenable Blog
罗磊的独立博客
Hacker News: Ask HN
Hacker News: Ask HN
Blog — PlanetScale
Blog — PlanetScale
博客园 - 三生石上(FineUI控件)
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Palo Alto Networks Blog
U
Unit 42
WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
C
Check Point Blog
Security Latest
Security Latest
M
MIT News - Artificial intelligence
Application and Cybersecurity Blog
Application and Cybersecurity Blog
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
S
Securelist
Security Archives - TechRepublic
Security Archives - TechRepublic
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Latest news
Latest news
GbyAI
GbyAI
T
Troy Hunt's Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 热门话题
V2EX - 技术
V2EX - 技术
小众软件
小众软件
Google DeepMind News
Google DeepMind News
K
Kaspersky official blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
Netflix TechBlog - Medium
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed

smallyu的博客

为什么买的加密货币一定要去中心化 RISC-V 虚拟机无法代替 EVM 虚拟机 Polkadot 的 Existential Deposit 机制错在哪里 利息,套利,交易策略,金融市场 LayerZero 从来不挑战比特币的地位 默认参数引起的以太坊节点运行错误 硬件钱包与资产安全 预测市场比币圈更赌场 为什么去中心化的跨链桥不可能实现 我对于 AI 时代的答案 不要投资任何隐私币 区块链技术世界的三大真理 以太坊 AA 钱包的致命问题是什么 基于 AI 语义执行的 MCP 区块链的设计 一个集成 Geth 和 CometBFT 的兼容层 我的加密货币定投策略(二) DeFi 基础: 理解 AMM 定价机制 Go 语言 GMP 调度器的原理是什么 Web3 项目分析计划 对 Psyche Network 项目的分析 continuation 教程: 理解 CPS 如何开发一个比特币符文(Runes)协议 比特币脚本开发教程 我从王垠的计算机科学视频班学到了什么 区块链技术面试题(2025年版) Rust 语言容易让新手困惑的一个“过度优化” Solana 智能合约开发教程 (1) 尝试开发一个最小 EVM 虚拟机 基于 ZK 的链上身份系统设计 一个 Web3 打赏系统的设计 鼓吹 Cursor 的人技术能力都差 关于 Code Review 的礼节 假如启动一个新的以太坊 PoS 网络 发行加密货币的最好方式 所有 BFT 共识的区块链都是中心化的 对 2025 年区块链行业的预测 Restaking 项目的经济难题 如何看懂任意区块链项目的技术架构 为什么不要做以太坊的二次开发 为什么不要做智能合约开发和 DeFi 开发 我的加密货币定投策略(一) PoS 类型的区块链如何处理分叉 Ethereum Casper 为什么需要 EIP-7251 区块链中的 PBFT 不需要第二次投票 开发者的思维方式 发币的核心要点 炒币投资的小 tips 为什么说 PoW 比 PoS 更加去中心化 牛市对普通人来说意味着什么 如何健康地远程工作 为什么比特币不用概率加密函数 程序员的 “服从权威” 心理 区块链技术面试题 如何区分公有链和联盟链 对 Layer 2 项目创业想法的回复 对区块链共识机制的理解 Pebbling Game 鹅卵石游戏 PDP 文件证明的局限性 不要小瞧 ChatGPT 为什么炒币不是一个好主意 一种在区块链上生成随机数的机制 为什么以太坊的私钥计算不可逆 关于以太坊的私钥碰撞 “猜均值的2/3” dApp 游戏设计 Proof of Storage/Space/Replication 的区别 Proofs of Retrievability 文件证明的含义 对 S-PDP 文件证明的示例和解释 我的加密货币交易机器人 对区块链行业的见闻 随机确认块的共识机制 VRF + BFT 共识引起交易失败的问题 对 Web 3.0 的理解 GitBook 好用吗? 一种区块链节点存储扩容的方式 一种基于“自我中心主义”的共识机制 链表常见算法题及解析 基于 Multi-Linked List 的区块链设想 理解哈希函数与序列化 联盟链比公有链差在哪儿 在 Dijkstra 算法中保存路径 为什么数字货币使用区块链是政治问题 区块链:下一代数字身份认证体系的基石 网页技术能实现 3D 建模吗? 给区块链一个定义 从 Erlang 开始了解 Actor 模型 一种侧边导航栏的交互方式 Rust 的 ownership 是什么? Haskell 中的 Monad 是什么? 浅析 Libra 背后的区块链技术 对区块链的理性认识 Rust 基础语法概述 基于 Java 的爬虫框架 WebCollector Kotlin:简化版的 Scala JavaScript 有关联数组吗? 主流编程语言的异常处理机制 Go 语言基本语法 Scala 语法基础 用 Scala 改写 Java 浅度实践 Python 获取海贼王更新信息 HTML5 音乐可视化
为什么要重视编程思想
2022-07-24 · via smallyu的博客

为什么要重视编程思想

2022-07-24

(1)

前两天遇到一个小问题,Solidity 写的智能合约超过 24 KB,不能部署到以太坊主网上,因为 EVM 对合约的代码小小有限制。于是考虑怎么减小合约的大小,当时对合约大小的概念都是模糊不清的。

其中注意到一个地方,合约是可以引入其他合约、调用其他合约方法的,只需要把部署后的合约地址作为参数传到合约里:

contract Demo {}
contract Main {
    Demo demo;
    constructor(Demo _demo) public {
        demo = _demo;
    }
}

合约大小包括引入的合约吗?EVM 在执行合约的时候,会不会先把其他合约的代码也加载进来,然后一起运行?代码大小的计算要包括所有合约?那可就麻烦了。

后来注意到,可以使用接口替代合约:

contract IDemo {}
contract Demo is IDemo {}
contract Main {
    IDemo demo;
    contract(IDemo _demo) public {
        demo = _demo;
    }
}

接口的代码量一定是少于具体实现的,因为接口不包含方法体,把引入的合约全部替换成接口,合约不就小多了?

当然,在这里纠结的不是 Solidity 合约怎么写或者合约代码大小怎么计算的问题,后来搞清楚了。比较在意的是,那个时候突然有点恍惚,用接口和直接用合约,有什么区别?

之前给合约定义接口是为了提供一个对外方法的描述,这里才意识到接口可以替代合约本身,直接用来定义变量,并且使用接口定义的变量,去调用合约里面的方法。但为什么可以呢,它不就只是一个接口吗?

(2)

如果你刚学习过 Java,或者使用 Java 作为工作语言,一定会有哑然失笑的感觉,这个问题太幼稚了,这不就是多态吗?

上第一节 Java 的课程,老师就告诉我们,面向对象有三大特性,封装、继承、多态,这句话时至今日我都能想起来,这是多么基础的概念,结果在工作多年后的今天,我竟然在实际工作上因为如此简单的问题犯了难,一时没反应过来,用接口作为类型的写法是什么意思。这太荒唐了。可能也是因为很久没写 Java,现在一直在用 Golang。

不得不说 Java 是面向对象编程语言的标杆,Solidity 虽然是一种看似新的用于智能合约的脚本语言,揉杂了多种语言的特性,但基本的编程思想还是基于面向对象的。合约就是类,部署一个合约就是实例化了一个对象,合约地址就是对象的内存地址,合约调用就是对象的方法调用……

只要是支持面向对象的编程语言,就包含有面向对象的特性,就可以使用面向对象的写法,就离不开最基本的像多态一样的特性。从面向对象的角度去理解,Solidity 有什么难的呢?无非不就是换了一些表面上的形式,编程思路甚至可以一模一样,此外再添上一些区块链特有的概念,像转账、块高度之类,就没了。

从编程语言的角度看,Solidity 和 Java 那样成熟的语言自然没法比,面向对象的特性是残缺的,modifier、require 之类的写法看似好用却增加了很多理解成本,而且代码结构也变得不是太统一。EVM 怎么能和 JVM 相提并论呢?但作为一种轻量级的脚本语言,Solidity 又要使用静态类型那样冗余的写法。

当然要注意,编程思想是先于编程语言的,我仍然会认为形式上的编程语言不值得学习,但是不否认从学习编程语言的角度入手去学习编程思想。比如多态这个概念,含义是使用统一的符号去代表不同的类型,包括三种类型的解释,一是支持多种类型的参数,对应 Java 里方法的重载,二也是支持多种类型的参数,对应 Java 里的范型,三是子类型,也就是把接口作为类型,对应上面提到的场景中的多态的含义。

面向对象是一种编程思想,包含很多计算机科学的概念,而 Java 是一种完全的面向对象的编程语言,不但涵盖众多有用的特性,而且实现的完整漂亮,如果你学习了 Java,自然也就知道面向对象是怎么回事了,受用无尽。从这个角度看,和 Java 相比,Golang 有什么值得学习的地方吗?是 struct 的写法还是 * 号的用法?可能 Golang 更像是一种快餐式的语言吧,可以很方便地 go func()。不过要是为了学习,就不是太推荐了。

花了几分钟看 Java 文档的目录,倒是能很快想起来那些内容,毕竟实在是太基础了。也是要告诫自己,别忘了代码怎么写。