
WTF Solidity 合约安全: S08. 绕过合约检查
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍绕过合约长度检查,并介绍预防的方法。绕过合约检查很多 freemint 的项目为了限制科学家(程序员)会用到 isContract() 方法,希望将调用者 msg.sender 限制为外部账户(EOA),而非合约。这个函数利用 extcodesize 获取该地址所存储的 bytecode 长度(runtime),若大于0,则判断为合约,否则就是EOA(用户)。 // 利用 extcodesize 检查是否为合约 function isContract(address account) public view returns (bool) { // extcodesize > 0 的地址一定是合约...

WTF Solidity 合约安全: S09. 拒绝服务
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的拒绝服务(Denial of Service, DoS)漏洞,并介绍预防的方法。NFT项目 Akutar 曾因为 DoS 漏洞损失 11,539 ETH,当时价值 3400 万美元。DoS在 Web2 中,拒绝服务攻击(DoS)是指通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象。而在 Web3,它指的是利用漏洞使得智能合约无法正常提供服务。 在2022年4月,一个很火的 NFT 项目名为 Akutar,他们使用荷兰拍卖进行公开发行,筹集了 11,539.5 ETH,非常成功。之前持有他们社区Pass的参与者会得到 0.5 ETH的退款,但是他们处理...

WTF Solidity 合约安全 S06. 签名重放
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的签名重放(Signature Replay)攻击和预防方法,它曾间接导致了著名做市商 Wintermute 被盗2000万枚 $OP。签名重放上学的时候,老师经常会让家长签字,有时候家长很忙,我就会很“贴心”照着以前的签字抄一遍。某种意义上来说,这就是签名重放。 在区块链中,数字签名可以用于识别数据签名者和验证数据完整性。发送交易时,用户使用私钥签名交易,使得其他人可以验证交易是由相应账户发出的。智能合约也能利用 ECDSA 算法验证用户将在链下创建的签名,然后执行铸造或转账等逻辑。更多关于数字签名的介绍请见WTF Solidity第37讲:数字签名。 数字签名一般有两种常见的重放攻击...
WTF Academy: wtf.academy

WTF Solidity 合约安全: S08. 绕过合约检查
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍绕过合约长度检查,并介绍预防的方法。绕过合约检查很多 freemint 的项目为了限制科学家(程序员)会用到 isContract() 方法,希望将调用者 msg.sender 限制为外部账户(EOA),而非合约。这个函数利用 extcodesize 获取该地址所存储的 bytecode 长度(runtime),若大于0,则判断为合约,否则就是EOA(用户)。 // 利用 extcodesize 检查是否为合约 function isContract(address account) public view returns (bool) { // extcodesize > 0 的地址一定是合约...

WTF Solidity 合约安全: S09. 拒绝服务
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的拒绝服务(Denial of Service, DoS)漏洞,并介绍预防的方法。NFT项目 Akutar 曾因为 DoS 漏洞损失 11,539 ETH,当时价值 3400 万美元。DoS在 Web2 中,拒绝服务攻击(DoS)是指通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象。而在 Web3,它指的是利用漏洞使得智能合约无法正常提供服务。 在2022年4月,一个很火的 NFT 项目名为 Akutar,他们使用荷兰拍卖进行公开发行,筹集了 11,539.5 ETH,非常成功。之前持有他们社区Pass的参与者会得到 0.5 ETH的退款,但是他们处理...

WTF Solidity 合约安全 S06. 签名重放
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的签名重放(Signature Replay)攻击和预防方法,它曾间接导致了著名做市商 Wintermute 被盗2000万枚 $OP。签名重放上学的时候,老师经常会让家长签字,有时候家长很忙,我就会很“贴心”照着以前的签字抄一遍。某种意义上来说,这就是签名重放。 在区块链中,数字签名可以用于识别数据签名者和验证数据完整性。发送交易时,用户使用私钥签名交易,使得其他人可以验证交易是由相应账户发出的。智能合约也能利用 ECDSA 算法验证用户将在链下创建的签名,然后执行铸造或转账等逻辑。更多关于数字签名的介绍请见WTF Solidity第37讲:数字签名。 数字签名一般有两种常见的重放攻击...
WTF Academy: wtf.academy

Subscribe to 0xAA

Subscribe to 0xAA
Share Dialog
Share Dialog


>200 subscribers
>200 subscribers
我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 0.10.2版本
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
cairo(cairo-lang)是StarkNet(以太坊ZK-Rollup扩容方案)智能合约的编程语言。它同时也用于编写可证明程序,证明某个计算已正确执行。Cairo主要有两个特点:
ZK友好: Cairo是原生的可证明计算的编程语言,可以直接编译为Stark可证明程序。而Solidity不能。
难学: Cairo是低级语言,学习曲线陡峭;并且现在属于开发早期,每个版本都会有很大改变。
目前Cairo版本为0.10.2,预计22年年底发行比较成熟的1.0版本。
本教程中,我会用cairo playground来运行cairo合约。cairo playground是Cairo官方开发的在线编辑器,适合新手,可以在浏览器中快速部署智能合约,你不需要在本地安装任何程序。
网址: cairo-lang.org/playground/

第一个Cairo程序很简单,只有5行代码:
%lang starknet
@view
func gm() -> (res: felt) {
return (res='Hello Cairo!');
}
我们拆开分析,学习cairo代码源文件的结构:
第1行声明了这段代码为 StarkNet 合约。如果不声明,则不能部署在StarkNet上。
%lang starknet
之后,我们写一个函数。第2行,我们用@view修饰这个函数。与solidity中的类似view类似,该函数只能查询但不能修改合约状态。
第3-5行我们声明了名为gm的函数,没有参数,返回一个变量,类型为felt。felt(field element,域元素)是 cairo 的基本类型,数字,字符串,地址通通由它表示。然后在函数体中,我们将返回值设为 Hello Cairo!。
@view
func gm() -> (res: felt) {
return (res='Hello Cairo!');
}
我们将代码拷贝到cairo playground的编辑器(Editor)中,然后点击右上角的 Deploy on StarkNet 就能将合约编译并部署到StarkNet测试网上。部署好以后,下面的输出栏(Output)会显示智能合约地址和交易哈。合约部署上链大概需要2-5分钟

合约部署成功后,点击合约地址链接跳转到StarkNet的区块链浏览器Voyager(类似以太坊的etherscan)就可以查看合约。一个已部署好的例子。
下滑到页面底,点击Read Contract栏,可以看到合约里的只读函数gm()。点击gm,将输出选为Text(文本),然后点击Query运行函数,就可以看到Hello Cairo!了!

这一讲,我们简单介绍了cairo-lang,并在cairo playground中部署了第一个cairo智能合约--Hello Cairo。之后,我们将继续 Cairo 之程!
我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 0.10.2版本
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
cairo(cairo-lang)是StarkNet(以太坊ZK-Rollup扩容方案)智能合约的编程语言。它同时也用于编写可证明程序,证明某个计算已正确执行。Cairo主要有两个特点:
ZK友好: Cairo是原生的可证明计算的编程语言,可以直接编译为Stark可证明程序。而Solidity不能。
难学: Cairo是低级语言,学习曲线陡峭;并且现在属于开发早期,每个版本都会有很大改变。
目前Cairo版本为0.10.2,预计22年年底发行比较成熟的1.0版本。
本教程中,我会用cairo playground来运行cairo合约。cairo playground是Cairo官方开发的在线编辑器,适合新手,可以在浏览器中快速部署智能合约,你不需要在本地安装任何程序。
网址: cairo-lang.org/playground/

第一个Cairo程序很简单,只有5行代码:
%lang starknet
@view
func gm() -> (res: felt) {
return (res='Hello Cairo!');
}
我们拆开分析,学习cairo代码源文件的结构:
第1行声明了这段代码为 StarkNet 合约。如果不声明,则不能部署在StarkNet上。
%lang starknet
之后,我们写一个函数。第2行,我们用@view修饰这个函数。与solidity中的类似view类似,该函数只能查询但不能修改合约状态。
第3-5行我们声明了名为gm的函数,没有参数,返回一个变量,类型为felt。felt(field element,域元素)是 cairo 的基本类型,数字,字符串,地址通通由它表示。然后在函数体中,我们将返回值设为 Hello Cairo!。
@view
func gm() -> (res: felt) {
return (res='Hello Cairo!');
}
我们将代码拷贝到cairo playground的编辑器(Editor)中,然后点击右上角的 Deploy on StarkNet 就能将合约编译并部署到StarkNet测试网上。部署好以后,下面的输出栏(Output)会显示智能合约地址和交易哈。合约部署上链大概需要2-5分钟

合约部署成功后,点击合约地址链接跳转到StarkNet的区块链浏览器Voyager(类似以太坊的etherscan)就可以查看合约。一个已部署好的例子。
下滑到页面底,点击Read Contract栏,可以看到合约里的只读函数gm()。点击gm,将输出选为Text(文本),然后点击Query运行函数,就可以看到Hello Cairo!了!

这一讲,我们简单介绍了cairo-lang,并在cairo playground中部署了第一个cairo智能合约--Hello Cairo。之后,我们将继续 Cairo 之程!
No activity yet