🍭 欢迎大家都来跟我一起学习 Web3 技术栈 🏃 🏻 🏃 🏻♀️ 学习智能合约,先从编程语言开始。 Solidity,也就是智能合约的语言。 Solidity 是智能合约的主要编程语言,Solidity 目前还是最主流的。 https://t.co/pCg4beZVO5
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
运行 Solidity 最方便的方式,必然先得试一下 Remix IDE。 https://t.co/272TVGdJ5I 最直观的体验:这才叫真正的 Cloud Native,无需数据库和本地环境,只需要编写合约。 云开发:编写、测试、部署、调试,都可以直接在 Remix IDE 中直接操作,还能加载 Solidity Plugin。 https://t.co/ZXOWLiFsvc
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
YouTube
Learn Blockchain, Solidity, and Full Stack Web3 Development with JavaScript – 32-Hour Course
This course will give you a full introduction into all of the core concepts related to blockchain, smart contracts, Solidity, ERC20s, full-stack Web3 dapps, decentralized finance (DeFi), JavaScript, TypeScript, Chainlink, Ethereum, upgradable smart contracts…
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
— 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
— 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
— 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
— 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
— 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
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
Deploy 后,每个智能合约都有一个地址,就像每个账户都有地址一样。 0xd9145CCE52D386f254917e481eB44e9943F39138 https://t.co/1YtFqShEBk
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
— 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
— 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
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
bitsofcode
Solidity function visibility, explained
When writing a smart contract, we can control who/what can call functions within that contract by specifying what is known as the function visibility. This allows us to easily secure certain parts of a contract without having to write too much custom logic.…
只要部署过后,旧的合约其实无法删掉,因为区块链是不可更改的。 重新部署[[智能合约]],会产生新的合约地址。 function 执行计算就会消耗gas,最简单的理解是,做越多的操作,消耗更多的 gas https://t.co/u9p1i6aZ6W
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022
— 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
— 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
— 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
— 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
— 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
— 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
— 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
— 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
— 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
— jimmylv.eth (🐣, 🐣) 吕立青 2𐃏22 🇨🇳 (@Jimmy_JingLv) Nov 22, 2022