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 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
>100 subscribers
>100 subscribers
我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 0.10.2版本
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
felt(field element,域元素)是 cairo 的基本类型,数字,字符串,地址通通由它表示。它是定义在 $[0, P]$ 的整数,其中 P 是一个非常大的质数。在目前的版本中,$P = 2^{251}+17*2^{192}+1$,大小为252 bit。P 具有一些很好的数学性质用于零知识证明,因此没有选择和Solidity一致的256 bit。
felt 可以被整型赋值,下面的例子中,我们将 7828582 赋值给 res:
@view
func int() -> (res: felt) {
return (res=7828582);
}

felt 可以被 bytes(十六进制数)赋值,下面的例子中,我们将 0x777466 赋值给 res:
@view
func bytes() -> (res: felt) {
return (res=0x777466);
}

felt 可以被短字符串(31个字符以内)赋值,太长的字符串需要借助外部的库(cairo-lang 1.0 版本可能会改善)。下面的例子中,我们将 wtf 赋值给 res:
@view
func shortString() -> (res: felt) {
return (res='wtf');
}

上面三个变量 7828582,0x777466,和 'wtf' 对应的felt值其实是相等的,你可以将合约部署到测试网,然后在区块链浏览器的Read Contract页面分别点击Decimal,Hex,和Text看看同一个值的不同格式输出。
如果你需要使用布尔值,将felt赋值为0或1。
felt 类型支持加,减,乘,除四则运算,但是除法与整数除法有区别。
如果x 能被 y 整除,那么非常好,结果也是整数。下面的例子中,变量 divide = 10/5 = 2。
如果 x 不能被 y 整除,比如 3/2,那么很不好,结果既不是 1,2,或 1.5。而是:
是的,非常长的一串数字,为了方便,咱们称这个数字为 $x$,那么 $x$ 代表什么?首先,felt 除法是乘法的逆运算,其实 $x = (P+3)/2$,满足$x$为整数且$2 * x (\mod P) = 3$。
在下面的代码中,我们尝试了felt的四则运算,其中 divide1 变量存储了$x$的值。在 playground 编译并部署到测试网之后,我们可以看到 recover = divide1 * 2 = 3。
@view
func operations() -> (add: felt, minus: felt, multiply: felt, divide: felt, divide1: felt, recover: felt) {
let x = 10;
let y = 5;
let add = x + y;
let minus = x - y;
let multiply = x * y;
let divide = x/y;
// note the division of felt is different from integers.
let divide1 = 3/2;
let recover = divide1*2;
return (add, minus, multiply, divide, divide1, recover);
}

这一讲,我们介绍了cairo的基本类型felt,和它支持的运算符。特别要注意的是felt的除法与整数除法不同,可能会得到预期之外的结果。如果想进行整数运算,可以利用math库的unsigned_div_rem()函数。
我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 0.10.2版本
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
felt(field element,域元素)是 cairo 的基本类型,数字,字符串,地址通通由它表示。它是定义在 $[0, P]$ 的整数,其中 P 是一个非常大的质数。在目前的版本中,$P = 2^{251}+17*2^{192}+1$,大小为252 bit。P 具有一些很好的数学性质用于零知识证明,因此没有选择和Solidity一致的256 bit。
felt 可以被整型赋值,下面的例子中,我们将 7828582 赋值给 res:
@view
func int() -> (res: felt) {
return (res=7828582);
}

felt 可以被 bytes(十六进制数)赋值,下面的例子中,我们将 0x777466 赋值给 res:
@view
func bytes() -> (res: felt) {
return (res=0x777466);
}

felt 可以被短字符串(31个字符以内)赋值,太长的字符串需要借助外部的库(cairo-lang 1.0 版本可能会改善)。下面的例子中,我们将 wtf 赋值给 res:
@view
func shortString() -> (res: felt) {
return (res='wtf');
}

上面三个变量 7828582,0x777466,和 'wtf' 对应的felt值其实是相等的,你可以将合约部署到测试网,然后在区块链浏览器的Read Contract页面分别点击Decimal,Hex,和Text看看同一个值的不同格式输出。
如果你需要使用布尔值,将felt赋值为0或1。
felt 类型支持加,减,乘,除四则运算,但是除法与整数除法有区别。
如果x 能被 y 整除,那么非常好,结果也是整数。下面的例子中,变量 divide = 10/5 = 2。
如果 x 不能被 y 整除,比如 3/2,那么很不好,结果既不是 1,2,或 1.5。而是:
是的,非常长的一串数字,为了方便,咱们称这个数字为 $x$,那么 $x$ 代表什么?首先,felt 除法是乘法的逆运算,其实 $x = (P+3)/2$,满足$x$为整数且$2 * x (\mod P) = 3$。
在下面的代码中,我们尝试了felt的四则运算,其中 divide1 变量存储了$x$的值。在 playground 编译并部署到测试网之后,我们可以看到 recover = divide1 * 2 = 3。
@view
func operations() -> (add: felt, minus: felt, multiply: felt, divide: felt, divide1: felt, recover: felt) {
let x = 10;
let y = 5;
let add = x + y;
let minus = x - y;
let multiply = x * y;
let divide = x/y;
// note the division of felt is different from integers.
let divide1 = 3/2;
let recover = divide1*2;
return (add, minus, multiply, divide, divide1, recover);
}

这一讲,我们介绍了cairo的基本类型felt,和它支持的运算符。特别要注意的是felt的除法与整数除法不同,可能会得到预期之外的结果。如果想进行整数运算,可以利用math库的unsigned_div_rem()函数。
No activity yet