solidity 合约开发记录

搭建hardhat环境

  1. 全局安装 solcjs
    npm install -g solc
  2. 查看是否安装成功
    solcjs --version 输出 0.8.21+commit.d9974bed.Emscripten.clang
  3. 下载 remix 桌面版
    https://github.com/ethereum/remix-desktop/releases
  4. 创建新文件夹并进入
  5. npx hardhat 选择ts创建项目
  6. npm i -g hardhat-shorthand 安装 缩写和自动补全
    hh 相当于 npx hardhat
  7. ts 测试合约方法
const [owner, addr1] = await ethers.getSigners();
console.log('owner===',owner,addr1)
const testaa = await ethers.deployContract('Test')
await testaa.setOwner('0x70997970C51812dc3A010C7d01b50e0d17dc79C8')
const abc = await testaa.getOwner()
console.log('-=-=--=-',abc)

solidity 语法记录

selfdestruct

https://www.alchemy.com/overviews/selfdestruct-solidity

修饰符

pure 对于函数:不允许修改或访问状态。
view 对于函数:不允许修改状态。
payable 对于功能:允许他们在接到电话的同时接收乙醚。
constant 对于状态变量:不允许赋值(初始化除外),不占用存储槽。
immutable 对于状态变量:在构造时只允许一个赋值,之后是常量。存储在代码中。
anonymous 对于事件:不将事件签名存储为主题。
indexed 对于事件参数:将参数存储为主题。
virtual 对于函数和修饰符:允许在派生契约中更改函数或修饰符的行为。

library

https://www.geeksforgeeks.org/solidity-libraries/
通过创建库来部署通用代码可以降低gas成本

数据存储 memory storage calldata

https://docs.alchemy.com/docs/when-to-use-storage-vs-memory-vs-calldata-in-solidity
https://docs.alchemy.com/docs/what-is-the-difference-between-memory-and-calldata-in-solidity
https://dev.to/ratracegrad/storage-vs-memory-vs-calldata-understanding-data-locations-in-solidity-52ff

msg.sender

https://medium.com/upstate-interactive/what-you-need-to-know-about-msg-global-variables-in-solidity-566f1e83cc69

错误处理assert revert require error

https://medium.com/blockchannel/the-use-of-revert-assert-and-require-in-solidity-and-the-new-revert-opcode-in-the-evm-1a3a7990e06e

函数修饰符 public external internal private

https://blockchain-academy.hs-mittweida.de/courses/solidity-coding-beginners-to-intermediate/lessons/solidity-5-calling-other-contracts-visibility-state-access/topic/visibility-public-private-external-internal/

自定义值类型

type UFixed256x18 is uint256;

// 用户定义的值类型允许在基本值类型上创建零成本抽象。这类似于别名,但具有更严格的类型要求。
// 用户定义的值类型使用 type C is V ,在哪里 C 是新引入的类型的名称,并且 V 必须是内置值类型(“基础类型”)。
// 类型 C 没有任何运算符或绑定的成员函数。特别是,即使是操作员 == 未定义。不允许与其他类型进行显式和隐式转换。
type UFixed256x18 is uint256;


// 该函数 C.wrap 用于从基础类型转换为自定义类型。类似地,函数 C.unwrap 用于从自定义类型转换为基础类型。
function add(UFixed256x18 a, UFixed256x18 b) internal pure returns (UFixed256x18) {
    return UFixed256x18.wrap(UFixed256x18.unwrap(a) + UFixed256x18.unwrap(b));
}

创建外部合约对象

Test1 test1Contract = new Test1();

枚举

enum ActionType { cancel, comfirm, sure, end }

结构

 struct UserInfo {
      address addr;
      uint256 balance;
      bool isNote;
      string name;
    }
 UserInfo userInfo = UserInfo({
      addr:0xE4cdDab0Cf6d9Bf2231cd7CA3A8c82Ba24C74a1d,
      balance: 1,
      isNote:false,
      name:"jack"
    });


编译器自动为所有 public 状态变量 生成 getter 函数

 // test1Contract.amount()
uint public amount;

映射

 // 映射类型 映射的数据位置只能为 storage
    mapping (address => uint256) public balanceInfo;
    function updateBalance(address addr) public {
      balanceInfo[addr] = uint256(100);
    }

定义事件


 // 定义事件,alreadyEnd 调用后调用该事件
    event SendParams(address owner, uint amount);
    function alreadyEnd() public {
      uint amounts;

      // 在此处发送事件
      emit SendParams(msg.sender, amounts);
    }

try catch

        // try 外部合约方法 catch
        // 这个 try 关键字后面必须跟一个表示外部函数调用或协定创建的表达式 (new ContractName() ).
        // 不会捕获表达式内部的错误(例如,如果它是一个复杂的表达式,同时还涉及内部函数调用),
        // 只会在外部调用本身内部发生还原。这个 returns 后面的部分(可选)声明与外部调用返回的类型匹配的返回变量

        try test1Contract.testFun() returns (uint) {
          
        } catch  {
          
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容