📮漫游日报 Roam Daily
696 subscribers
54 photos
2 videos
2 files
1.12K links
吕立青的漫游日报,
每天分享我的阅读。
有趣、有料、有用,
随时、随心、随意。
🌝🌕🌖🌗🌘🌑🌚
jimmylv@crossbell
Download Telegram
contract 是 Solidity 的关键字,用来声明智能合约,它告诉编译器后面的代码是来定义智能合约的。 类似 Java 和 Javascript 面向对象编程语言中的 class 关键字。 tip: Remix IDE 使用 Cmd+S 可以自动 Compile 注意这里的证书 `// SPDX-License-Identifier: MIT` 合约天然公开,否则报 warnings https://t.co/uXxfu94i95
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Solidity 数据类型,最基础的 5 种分别是 boolean, uint, int 和 address, bytes • boolean 定义 true 和 false • uint 是无符号整数,表示这个数字不是可正可负的,只能是正数 • int 可以表示正数或者负数 • address,表示地址,就像在 @MetaMask 钱包中看到的一样
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
• bytes (更底层,bytes 变量值通常是“0x”开头然后加上一些随机的数字和字母 ref: (02:12:29 https://ift.tt/VpzuTZ3 Basic Solidity - Types
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Solidity 创建变量,类型在前,比如 uint8 声明分配了 8个bit,uint不带数字默认分配 uint256 • 通常,把分配空间显式的写出来是一个好习惯,即不要 单独使用 uint tip: 结尾处的分号 ; 是必须的 https://t.co/uCxzN7A9WJ
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
string 类型很有趣,因为它本质上是一种 bytes,但是 string 只能存储文本;所以“cat”字符串是一个 string,但是可以自动转化为 bytes https://t.co/hIV7nHSlLG https://t.co/mRCDNtsBk5
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Solidity function,比如图中的 store() 函数,跟其他语言没有什么不同。 tip: 在 Remix IDE 中运行时,可以连接 Swarm 本地网络,Environment 下拉列表,选择 Remix VM 即可。 https://t.co/GKfY7xOPD8
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Deploy 后,每个智能合约都有一个地址,就像每个账户都有地址一样。 0xd9145CCE52D386f254917e481eB44e9943F39138 https://t.co/1YtFqShEBk
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
在执行 store() 方法时 terminal 会显示对应的 transition tip: Solidity 创建变量声明时,默认是private 的,所以 terminal log 看不到,需要加上 public 修饰符(Function Visibility Specifiers) https://t.co/SAN6jzAycn https://t.co/cpxEdOdjq4
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
1. public:在外部和内部可见(其实是给 storage/state 变量创建一个getter函数) 2. private:仅在当前合约中可见 3. external:仅在外部可见(相对于当前 function 而言)-- 即只能被消息调用(通过this.func) 4. internal:只在内部可见 不写默认为第 4 种,合约内可见,https://t.co/uMpx6MYA59 https://t.co/bJMATIKV19
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
只要部署过后,旧的合约其实无法删掉,因为区块链是不可更改的。 重新部署[[智能合约]],会产生新的合约地址。 function 执行计算就会消耗gas,最简单的理解是,做越多的操作,消耗更多的 gas https://t.co/u9p1i6aZ6W
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Remix IDE 会为已部署合约显示对应的操作按钮 比如黄色的 store 按钮,对应合约中的 store() 方法 蓝色的 favoriteNumber 按钮,对应 public 的变量,颜色代表单独读取 state 数据,无需消耗 gas tip: 这里的 Scope 概念即上下文,跟 JavaScript 类似 https://t.co/e89Th0klLj
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
view, pure 函数只是读区块链数据 - 记住,只有更改状态的时候才支付 gas,发交易,即 store 橙色按钮 - 调用 view 或者 pure 函数,是不需要支付 gas 的 - 在 Remix IDE 中未显示 绿色的 ,即没有发生交易 https://t.co/yDOuSxgrsD
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
点击 retrieve 蓝色按钮,不发送交易,我们只是在链上读取数值 但需要注意的是:“消耗只有在被合约调用时才会计算在内”,也就是说 如果在一个要改变区块链状态的函数内部,调用了类似 retrieve 这种 view 或者 pure 函数,还是会消耗 gas,因为需要消耗额外计算量。 https://t.co/2MZDpvAIxV
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
view 和 pure 的区别: 1. view 告诉我们,通过运行该函数,不会保存/更改任何数据。 2. pure 告诉我们,该函数不仅不会将任何数据保存到区块链中,而且不会从区块链中读取任何数据。 带有 public 的变量 favoriteNumber,可以看作是一个返回 uint256 的 view 函数 uint256 public favoriteNumber;
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Solidity struct 结构体 不满足于基础的数据类型,当然就需要自定义类型,struct 结构体可以包含一些基本的数据类型。 当然,也可以包含自定义的 struct 类型,俗称「套娃」🪆 https://t.co/fsKWwOYOO7
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
声明 struct 变量后,可以直接初始化,People({ key1: val1, key2: val2}) 更简单直观的方式是,按照 struct 的参数顺序来填入值,People(val1, val2, ...) https://t.co/0dHzPAugz0
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Solidity array 数组 更好的创建列表的方法是使用一种被称为数组(array) 的数据结构 举例:People[] 数组是储存列表,或者说储存一系列对象的一种方式 people 数组在智能合约部署过后,还是个空列表,参数输入框,可以填入想要获得的那个对象的索引 https://t.co/zFXic0RgGd
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
默认类型的数组就是所谓的动态数组(Dynamic Array),初始化这个数组的时候并没有规定它的大小 - 数组的方括号里添加一个数字 3,最多只能放进去三个 People 对象 - 不指定的话,数组的大小会随着我们添加和减少 People而增大和减小 People[3] public people;
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
在 Remix IDE 调用已部署的合约函数 比如 addPerson() 黄色按钮 + 输入框:根据参数顺序,填写值 JimmyLv, 7 就会为 people 数组添加一个对象,对应 People(JimmyLv, 7)。 你会发现 terminal 中的 符号,代表消耗了 gas 计算量, 暴露的 people 变量对应一个蓝色按钮,可根据索引位置获取数据。 https://t.co/Llx8RSk6ir
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
闪念是一次迭代, 笔记是一次迭代, 整理是一次迭代, 写推是一次迭代, 文字是一次迭代, 画图是一次迭代, 视频是一次迭代, 剪辑是一次迭代, 字幕是一次迭代, 评论是一次迭代, 弹幕是一次迭代, 标题是一次迭代, 口述是一次迭代, 回复是一次迭代, 朗读是一次迭代, 转发是一次迭代, AI提炼是 https://t.co/UD4xNmUKmj
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
📮漫游日报 Roam Daily pinned «我是一名 7 years+ 经验的全栈工程师,👨🏻‍💻 偏爱前端 🎨 和 DevOps ⚙️。 2022 年下定决心,正经学习区块链 & Web3 技术栈,「学习技术,穿越牛熊」🐻 这个 Thread 记录我的公开学习,分享最直观的体验和学习笔记。 🧵 /n 📣 如果有不正确的地方,感谢指出! — jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022»