23-03-06

First Post:

Last Update:

2023-03-06

哈希函数

keccak256(abi.encode(xxx))keccak256(abi.encodePacked())是bytes32类型不同于前面的call时候的用法:abi.encodeWithSignature("funcname",arg1,arg2,...)返回值是bytes类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract hashFunc {
function hash(string memory title, uint number, address addr) public pure returns(bytes32){
return keccak256(abi.encodePacked(title, number, addr));
}
function sameType(string memory astr, string memory bstr) public pure returns(bytes32){
return keccak256(abi.encode(astr, bstr));//两个数据一样时需要用abi.encode,用abi.encodePacked会出现
//"AAA,BBB"与"AA,ABBB"的哈希值相同
}
function sameType(string memory astr) public pure returns(bytes32){//函数重载
return keccak256(abi.encode(astr));
}
}
contract guessNum {
bytes32 public word = 0x0d0fbbfb6f13ca33b055053820891b647dba6d9578df439c1a6543ca379da73e;

function guessWord(string memory _word) public view returns(bool) {
return word == keccak256(abi.encode(_word));
}
}

decode

encode

1
2
3
function tryEncode(string memory astr, string memory bstr) public pure returns(bytes memory) {
return abi.encode(astr, bstr);
}

decode

1
2
3
function decode(bytes memory data) public pure returns(string memory, string memory) {
return(abi.decode(data,(string, string)));
}

assembly

在 Solidity 中,assembly 是一种低级语言,它可以直接与以太坊虚拟机(EVM)进行交互。它提供了更多的控制能力,可以实现一些仅使用 Solidity 无法实现的逻辑,例如指向特定的内存块。

Solidity 定义了两种 assembly 的实现方式:内联 assembly 和独立 assembly。内联 assembly 可以直接在 Solidity 源代码中使用,而独立 assembly 则可以脱离 Solidity 使用。

r := mload(add(sig, 32))表示从内存地址 sig + 32 处读取一个字(32 字节)的数据,并将其赋值给变量 r

搭链

一、安装依赖包

1
2
3
4
5
sudo yum install -y openssl openssl-devel
cd ~ && mkdir fisco && cd fisco

curl
如果没有的话:...后面补充