区块链智能合约技术及实践
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
..
区块链智能合约技术及实践
晕.一.
PART1智能合约基本概述
..
区块链是什么?
.
...
_
Bl吵98
区块链技术是—种以 1. 非对称加密技术对交易进行数字签名 2. 通过共识机制达成多节点—致
3. 数据以链式区块形式组织存储
的分布式账簿系统。
Block99
Block100 Blockchain
| / / / ◄ | /
Account
。, Ox伦36e...Oad91
,1 xf936e...Oad92
.r Oxf936e...Oad93
OxOOOOOOOOOOOOOO....00000000000000000001 Ox68656c6c6fOOOOOOOOOOOOOOOOOOOOOOOOOO OxOOOOOOOOOOOOOO…00000000000000000002
DEMO
雹
.一.
动态变量
』一
I OxOOOOOO…000 I
OxOOOOOO...001 OxOOOOOOOOOOOOOOOOOOOOOOOOOOOO…00002
_、Map
. -.
· Oxc4e9a56293c3 1 Ox68656c6c6fOOOOOOOOOOOOOOOOOOOOOOOOOO
fI: Ox7a15fde3e6a8 OxTT6f726c6400000000000000000000000000
• Storage 中每一 条数据的 Key 和 Value
大小都是32字节。
• 在Storage 中取数据的时候 , 都是以一 个 slot 为单位完成操作。
问题:
.那一个变量在Storage 中存储的索引值是怎么计算的?
.变量本身是怎么编码的?
变量索引规则
:♦ ♦ 变量索引的生成是发生在合约的编译阶段。 编译
.:· —些比较小的静态变量, 会被压缩存储到 —个slot中。
DEMO
`,
静态变量
var1 和var2两个小变置放在一起
.
i^
...
OxOOOOOO...000
,I
OxOOOOOOOOO…0000000000000000201
r
·今
OxOOOOOO...001
r·
...
OxOOOOOO...002
Ox伦36e...Oad94 Ox776f726c6400000000000000000000000000
晕.一.
PART3智能合约语言Solidity讲解
..
Solidity-复杂类型
雹
• 定义:int8[] arr; int[]8 a = new int8[](3);默认为storage属性
',一·=
I
Rom
Code
Storage
Ram
Stack Args
Memory
Ca Ilda.ta Load
••••
;
OxOOOOOO...000
!l
OxOOOOOO...001
OxOOOOOO...002
合约存储结构-Storage结构
slot(32 bytes) slot(32 bytes) slot(32 bytes)
器根据变量的类型分别应用不同的规则生成索引。
中 solidity中变量有两个大类型, 分别是青回弟公沁担l
动态变量 , 这两种类型变量的索引规则也另
..
静态变量
规则
.:· 静态变量就是变量大小固定的变量。
.:· 所有静态变量被连续地存放在Storage中, 存放的顺
序和变量在合约中定义的顺序 — 致。
)
• 删除:delete arr[2];
• 长度:arr.length;
• 插入:arr.push(3); --------> storage变长类型数组才有push()
• 特殊:string、 bytes类型底层由bytel数组组成,也能用push()。
)
► 声明:struct StructName{int8 a;bytes8 b;}
` 记录长度 var5 j 仁`.li 丘晌 I存储的地方
I var5<ioxc257…00a0e Oxc25兀 .OOaOf
Ox68656c6c6f776f726c646!:•t:i�6 f;:j,...6865
Ox6c6c6f776行'26c640000000000… 0000000
= keccak256(slot3) Oxc257…OOaOe
///
1
书
Version Random Pervious Hash Time Stamp
Merkle Tree
|
|
|
Block Header
\
\ \\ \
\
Transactions List/Ledger/Contract Code
«
... 3
晕.一.
PART2智能合约技术分析
••••
合约执行引擎--EVM
..
动态变量
规则 ♦:· 动态变量主要有两种: map 和动态长度数 组(string, bytes等) ♦:� Storage 中会为 map变量本身分配—个 slot, 不过这个slot不存储任何数据, 而map 中的数据被散列存储在Storage 中。 ♦:· 由千无法确认map将要存储的数据大小, solidity采用哈希算法来计算map 中每— 条数 据在Storage 中的存储索引值。
、�Hale Waihona Puke Baidu
• 遍历:利用数组辅助遍历, 将key存储
► mapping(int=>bytes8[]) mapl; ► mapping(bytes32= >StructName) map2;
..
• storage展性: • 只有数组和结构体有此展 性 • 默认函数局部变量和合约定义 的变最为storage展性 • 表明永久存储,赋值多为引用
► 定义:StructName test;默认为storage属性 ► 赋值:test.a = 8; test.b = "hello";
)
• 定义:mapping(int8= >bytes32) map;
• 赋值: map[O] = "hello";
• 删除:没有删除函数, 只能将value置为默认值map[O] = OxO
,;
·嘈
OxOOOOOO...003
i-
..
OxOOOOOO... 004
r·
..
OxOOOOOO...005
OxOOOOOOOOO…0000000000000000003 Ox68656c6c6f776f726c640000…00014 OxOOOOOOOOOOOOOOOOOOOO…00000050 OxOOOOOOOOOOOOOOOOOOOO…OOOOOOOe OxOOOOOOOOOOOOOOOOOOOO…OOOOOOOf
区块链智能合约技术及实践
晕.一.
PART1智能合约基本概述
..
区块链是什么?
.
...
_
Bl吵98
区块链技术是—种以 1. 非对称加密技术对交易进行数字签名 2. 通过共识机制达成多节点—致
3. 数据以链式区块形式组织存储
的分布式账簿系统。
Block99
Block100 Blockchain
| / / / ◄ | /
Account
。, Ox伦36e...Oad91
,1 xf936e...Oad92
.r Oxf936e...Oad93
OxOOOOOOOOOOOOOO....00000000000000000001 Ox68656c6c6fOOOOOOOOOOOOOOOOOOOOOOOOOO OxOOOOOOOOOOOOOO…00000000000000000002
DEMO
雹
.一.
动态变量
』一
I OxOOOOOO…000 I
OxOOOOOO...001 OxOOOOOOOOOOOOOOOOOOOOOOOOOOOO…00002
_、Map
. -.
· Oxc4e9a56293c3 1 Ox68656c6c6fOOOOOOOOOOOOOOOOOOOOOOOOOO
fI: Ox7a15fde3e6a8 OxTT6f726c6400000000000000000000000000
• Storage 中每一 条数据的 Key 和 Value
大小都是32字节。
• 在Storage 中取数据的时候 , 都是以一 个 slot 为单位完成操作。
问题:
.那一个变量在Storage 中存储的索引值是怎么计算的?
.变量本身是怎么编码的?
变量索引规则
:♦ ♦ 变量索引的生成是发生在合约的编译阶段。 编译
.:· —些比较小的静态变量, 会被压缩存储到 —个slot中。
DEMO
`,
静态变量
var1 和var2两个小变置放在一起
.
i^
...
OxOOOOOO...000
,I
OxOOOOOOOOO…0000000000000000201
r
·今
OxOOOOOO...001
r·
...
OxOOOOOO...002
Ox伦36e...Oad94 Ox776f726c6400000000000000000000000000
晕.一.
PART3智能合约语言Solidity讲解
..
Solidity-复杂类型
雹
• 定义:int8[] arr; int[]8 a = new int8[](3);默认为storage属性
',一·=
I
Rom
Code
Storage
Ram
Stack Args
Memory
Ca Ilda.ta Load
••••
;
OxOOOOOO...000
!l
OxOOOOOO...001
OxOOOOOO...002
合约存储结构-Storage结构
slot(32 bytes) slot(32 bytes) slot(32 bytes)
器根据变量的类型分别应用不同的规则生成索引。
中 solidity中变量有两个大类型, 分别是青回弟公沁担l
动态变量 , 这两种类型变量的索引规则也另
..
静态变量
规则
.:· 静态变量就是变量大小固定的变量。
.:· 所有静态变量被连续地存放在Storage中, 存放的顺
序和变量在合约中定义的顺序 — 致。
)
• 删除:delete arr[2];
• 长度:arr.length;
• 插入:arr.push(3); --------> storage变长类型数组才有push()
• 特殊:string、 bytes类型底层由bytel数组组成,也能用push()。
)
► 声明:struct StructName{int8 a;bytes8 b;}
` 记录长度 var5 j 仁`.li 丘晌 I存储的地方
I var5<ioxc257…00a0e Oxc25兀 .OOaOf
Ox68656c6c6f776f726c646!:•t:i�6 f;:j,...6865
Ox6c6c6f776行'26c640000000000… 0000000
= keccak256(slot3) Oxc257…OOaOe
///
1
书
Version Random Pervious Hash Time Stamp
Merkle Tree
|
|
|
Block Header
\
\ \\ \
\
Transactions List/Ledger/Contract Code
«
... 3
晕.一.
PART2智能合约技术分析
••••
合约执行引擎--EVM
..
动态变量
规则 ♦:· 动态变量主要有两种: map 和动态长度数 组(string, bytes等) ♦:� Storage 中会为 map变量本身分配—个 slot, 不过这个slot不存储任何数据, 而map 中的数据被散列存储在Storage 中。 ♦:· 由千无法确认map将要存储的数据大小, solidity采用哈希算法来计算map 中每— 条数 据在Storage 中的存储索引值。
、�Hale Waihona Puke Baidu
• 遍历:利用数组辅助遍历, 将key存储
► mapping(int=>bytes8[]) mapl; ► mapping(bytes32= >StructName) map2;
..
• storage展性: • 只有数组和结构体有此展 性 • 默认函数局部变量和合约定义 的变最为storage展性 • 表明永久存储,赋值多为引用
► 定义:StructName test;默认为storage属性 ► 赋值:test.a = 8; test.b = "hello";
)
• 定义:mapping(int8= >bytes32) map;
• 赋值: map[O] = "hello";
• 删除:没有删除函数, 只能将value置为默认值map[O] = OxO
,;
·嘈
OxOOOOOO...003
i-
..
OxOOOOOO... 004
r·
..
OxOOOOOO...005
OxOOOOOOOOO…0000000000000000003 Ox68656c6c6f776f726c640000…00014 OxOOOOOOOOOOOOOOOOOOOO…00000050 OxOOOOOOOOOOOOOOOOOOOO…OOOOOOOe OxOOOOOOOOOOOOOOOOOOOO…OOOOOOOf