0xmonaco CTF 体验心得
由开发人员、艺术家和设计师组成的集体 MatchBoxDAO 宣布推出 MatchBox Arena。该团队将其称为“Web3 公司的世界杯”,并表示游戏锦标赛旨在找出哪家公司拥有最好的技术团队。首先,可以代表公司和世界顶级的crypto公司(uniswap,polygon,ledger,chainlink。。。)同台竞技真的是一个非常荣幸的事情。所以我牺牲了宝贵的春节假期,就一直在打这个比赛。 这次CTF是一个用solidity操控汽车的算法比赛(终于遇到我非常感兴趣的地方了)介绍这本质上来说是一次博弈实验,而不是一次简单的代码hackthon。更像是一个社会实验,涉及纯技术方面、经济激励、效用优化模式和理性的压力测试。对于每一个参赛者,你需要实现自己的Car合约,特别是takeyourturn这个函数。对于每一轮你都需要做出决策,具体有五种决策: 1)加速(ACCELERATE) 2)炮弹(SHELL) 3)超级炮弹(SUPER_SHELL) 4)香蕉(BANANA) 5)盾(SHIELD) 有点像跑跑卡丁车?是的。。每一种决策都会耗费掉你的金额,你的金额总量是17500。而...

成长 -- 随笔(2)
深夜陷入了沉思,回顾了一下自己的成长历程。距离上一次的成长随笔已经过去7个月了~~ https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/By3P_3NiIriKGObdbWlFo0mDdwFDY1v9VFbjaUMmObU 既然是随笔,我觉得格式什么的,就随意了~~ 这段时间我学了啥呢~~ Uniswap V2, V3; 精通Curve ( 3 Pool, Meta Pool, Compond Pool, AAVE Pool) ~~~ Balancer V2, Kyber, Bancor ; AAVE, Clipper, DODO, Mstable, Saddle, Shell, Wombat ~~~ DODO, DODO V2, Fraxswap ~~ 对我来说,能力提升最大的是打CTF。比赛的过程,纠错发现bug的攻防真的很能提升一个人的合约能力~~~ 最开心的是,认识了组内Andrew和Jimmy两位Crypto科学家~~ 最感激的是,Melvin带着我做项目,耐心和孜孜不倦地引导我去激发自己的潜能~~...
成长 -- 随笔
我完全不敢想象自己的成长速度。 1个月前,我还在和慢雾的群上问curve的合约代码的语言是的时候。余弦大佬回了我是vyper。我现在已经可以把vyper语言看懂了, 并且对于原理也掌握了。 把curve代码看了一下一遍,其实也发现不过如此。白皮书,其实也没这么深奥。跟当年打ACM的那种级别比,还是差得有点远。 Hardhat也越来越熟悉了。当时那个编写测试用例还要问XD的那个毛头小子,已经成长了好多。 我觉得我现在完全可以独立撑起一个商业项目,唯一卡住的地方可能是JS还是不太熟悉。基本功能是OK的,但是遇到一些比较少见的bug。估计,要问人。 对于以前的我来说,3,4天吃透一个主流Defi协议,我真的想都不敢想。如果只是调研,我觉得我还是勉强可以一试。 这种成长的速度我只能用指数级别来形容。我看了一下一个月前的自己,觉得好菜。 我很希望我一个月之后,再回头看现在的我,也是觉得现在的我很菜~~ end
0xmonaco CTF 体验心得
由开发人员、艺术家和设计师组成的集体 MatchBoxDAO 宣布推出 MatchBox Arena。该团队将其称为“Web3 公司的世界杯”,并表示游戏锦标赛旨在找出哪家公司拥有最好的技术团队。首先,可以代表公司和世界顶级的crypto公司(uniswap,polygon,ledger,chainlink。。。)同台竞技真的是一个非常荣幸的事情。所以我牺牲了宝贵的春节假期,就一直在打这个比赛。 这次CTF是一个用solidity操控汽车的算法比赛(终于遇到我非常感兴趣的地方了)介绍这本质上来说是一次博弈实验,而不是一次简单的代码hackthon。更像是一个社会实验,涉及纯技术方面、经济激励、效用优化模式和理性的压力测试。对于每一个参赛者,你需要实现自己的Car合约,特别是takeyourturn这个函数。对于每一轮你都需要做出决策,具体有五种决策: 1)加速(ACCELERATE) 2)炮弹(SHELL) 3)超级炮弹(SUPER_SHELL) 4)香蕉(BANANA) 5)盾(SHIELD) 有点像跑跑卡丁车?是的。。每一种决策都会耗费掉你的金额,你的金额总量是17500。而...

成长 -- 随笔(2)
深夜陷入了沉思,回顾了一下自己的成长历程。距离上一次的成长随笔已经过去7个月了~~ https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/By3P_3NiIriKGObdbWlFo0mDdwFDY1v9VFbjaUMmObU 既然是随笔,我觉得格式什么的,就随意了~~ 这段时间我学了啥呢~~ Uniswap V2, V3; 精通Curve ( 3 Pool, Meta Pool, Compond Pool, AAVE Pool) ~~~ Balancer V2, Kyber, Bancor ; AAVE, Clipper, DODO, Mstable, Saddle, Shell, Wombat ~~~ DODO, DODO V2, Fraxswap ~~ 对我来说,能力提升最大的是打CTF。比赛的过程,纠错发现bug的攻防真的很能提升一个人的合约能力~~~ 最开心的是,认识了组内Andrew和Jimmy两位Crypto科学家~~ 最感激的是,Melvin带着我做项目,耐心和孜孜不倦地引导我去激发自己的潜能~~...
成长 -- 随笔
我完全不敢想象自己的成长速度。 1个月前,我还在和慢雾的群上问curve的合约代码的语言是的时候。余弦大佬回了我是vyper。我现在已经可以把vyper语言看懂了, 并且对于原理也掌握了。 把curve代码看了一下一遍,其实也发现不过如此。白皮书,其实也没这么深奥。跟当年打ACM的那种级别比,还是差得有点远。 Hardhat也越来越熟悉了。当时那个编写测试用例还要问XD的那个毛头小子,已经成长了好多。 我觉得我现在完全可以独立撑起一个商业项目,唯一卡住的地方可能是JS还是不太熟悉。基本功能是OK的,但是遇到一些比较少见的bug。估计,要问人。 对于以前的我来说,3,4天吃透一个主流Defi协议,我真的想都不敢想。如果只是调研,我觉得我还是勉强可以一试。 这种成长的速度我只能用指数级别来形容。我看了一下一个月前的自己,觉得好菜。 我很希望我一个月之后,再回头看现在的我,也是觉得现在的我很菜~~ end

Subscribe to shaneson.eth

Subscribe to shaneson.eth
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
Subgraph其实非常简单。我这边大概就学了3个小时吧,就可以直接开发了。这里简单整理一下要点。
首先要知道它是做什么的。Subgraph是用来做链上数据索引的。熟悉区块链的底层的小伙伴肯定知道,假如要监听链上数据的事件/合约状态的话,我们一般是要写一个死循环,然后调用sdk来监听事件/合约,然后把数据存到数据库/处理。诸如此类的。但这很非常累。
我们很多的业务逻辑都是要监听链上数据然后进行分析的。基于此,Subgraph就诞生了。
如果要快速入门subgraph,我觉得只需要理解到它是一个链上数据索引那么就没啥问题。直接可以看语法了。因为接下来的内容就和传统数据库的学习很相近了。
创建图呢,有两种方法,法一:
graph init \
--product subgraph-studio
--from-contract <CONTRACT_ADDRESS> \
[--network <ETHEREUM_NETWORK>] \
[--abi <FILE>] \
<SUBGRAPH_SLUG> [<DIRECTORY>]
法二:
graph init --studio <SUBGRAPH_SLUG>
The is the ID of your subgraph in Subgraph Studio, it can be found on your subgraph details page. 修改subgraph配置 == 修改数据库配置 Subgraph的配置十分重要,但是方便的一点在于你几乎不用去做修改。graph-cli这个脚手架你可以基于你输入的合约地址,链的选择,项目名,合约名。去自动生成以下的文件。其中,最重要的应该是:eventHandlers,callHandlers和blockHandlers。这些是用来处理捕捉到事件/信号的时候用来处理数据的地方。 specVersion: 0.0.4 description: Gravatar for Ethereum repository: https://github.com/graphprotocol/example-subgraph schema: file: ./schema.graphql dataSources: - kind: ethereum/contract name: Gravity network: mainnet source: address: '0x2E645469f354BB4F5c8a05B3b30A929361cf77eC' abi: Gravity startBlock: 6175244 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript entities: - Gravatar abis: - name: Gravity file: ./abis/Gravity.json eventHandlers: - event: NewGravatar(uint256,address,string,string) handler: handleNewGravatar - event: UpdatedGravatar(uint256,address,string,string) handler: handleUpdatedGravatar callHandlers: - function: createGravatar(string,string) handler: handleCreateGravatar blockHandlers: - function: handleBlock - function: handleBlockWithCall filter: kind: call file: ./src/mapping.ts Entity Relation == 数据库设计 这一步几乎是最重要的。是对schema的设计,其实本质上可以理解成数据库设计。主要分为几种: 一对一关系 type Transaction @entity { id: ID! transactionReceipt: TransactionReceipt } type TransactionReceipt @entity { id: ID! transaction: Transaction } 一对多关系 type Token @entity { id: ID! } type TokenBalance @entity { id: ID! amount: Int! token: Token! } 多对多关系 type Organization @entity { id: ID! name: String! members: [User!]! } type User @entity { id: ID! name: String! organizations: [Organization!]! @derivedFrom(field: "members") } Data Source == Web开发中的 DAO层(或者数据输入) Emmm,这里本质就是当遇到callback的时候,要把什么数据写进graph上。这里就是具体逻辑具体分析了。我这里挑了abracadabra的一个MIM合约的Transfer函数做了监听,假如发生了Transfer,我就记下来。也是非常简单的。 import { Address, BigInt } from "@graphprotocol/graph-ts" import { MagicInternetMoney, Approval, OwnershipTransferred, Transfer } from "../generated/MagicInternetMoney/MagicInternetMoney" import { MintRecord, MagicInternetMoneyEntity} from "../generated/schema" export function handleTransfer(event: Transfer): void { const MagicInternetMoneyV1Instance = MagicInternetMoney.bind(event.address) const magicInternetMoneyID = event.address.toString() let magicInternetMoney = MagicInternetMoneyEntity.load(magicInternetMoneyID) let mintRecord = MintRecord.load(event.transaction.from.toHex()) // update MagicInternetMoney if (!magicInternetMoney) { magicInternetMoney = new MagicInternetMoneyEntity(magicInternetMoneyID) magicInternetMoney.decimals = MagicInternetMoneyV1Instance.decimals() magicInternetMoney.totalSupply = MagicInternetMoneyV1Instance.totalSupply() magicInternetMoney.save() } if (!mintRecord) { mintRecord = new MintRecord(event.transaction.from.toHex()) const _from = event.parameters[0].value.toAddress() const _to = event.parameters[1].value.toAddress() const _value = event.parameters[2].value.toBigInt() const _lastMint = MagicInternetMoneyV1Instance.lastMint() mintRecord.tokenReceiver = _from mintRecord.tokenReceiver = _to mintRecord.amount = _value mintRecord.time = _lastMint.value0 mintRecord.token = magicInternetMoney.id mintRecord.save() } } export function handleApproval(event: Approval): void {} export function handleOwnershipTransferred(event: OwnershipTransferred): void {} 编译 + 部署 两行命令就可以发布到子网/托管网络,实现数据监听了。非常方便。 graph codegen && graph build graph deploy --studio clink-demo
Subgraph其实非常简单。我这边大概就学了3个小时吧,就可以直接开发了。这里简单整理一下要点。
首先要知道它是做什么的。Subgraph是用来做链上数据索引的。熟悉区块链的底层的小伙伴肯定知道,假如要监听链上数据的事件/合约状态的话,我们一般是要写一个死循环,然后调用sdk来监听事件/合约,然后把数据存到数据库/处理。诸如此类的。但这很非常累。
我们很多的业务逻辑都是要监听链上数据然后进行分析的。基于此,Subgraph就诞生了。
如果要快速入门subgraph,我觉得只需要理解到它是一个链上数据索引那么就没啥问题。直接可以看语法了。因为接下来的内容就和传统数据库的学习很相近了。
创建图呢,有两种方法,法一:
graph init \
--product subgraph-studio
--from-contract <CONTRACT_ADDRESS> \
[--network <ETHEREUM_NETWORK>] \
[--abi <FILE>] \
<SUBGRAPH_SLUG> [<DIRECTORY>]
法二:
graph init --studio <SUBGRAPH_SLUG>
The is the ID of your subgraph in Subgraph Studio, it can be found on your subgraph details page. 修改subgraph配置 == 修改数据库配置 Subgraph的配置十分重要,但是方便的一点在于你几乎不用去做修改。graph-cli这个脚手架你可以基于你输入的合约地址,链的选择,项目名,合约名。去自动生成以下的文件。其中,最重要的应该是:eventHandlers,callHandlers和blockHandlers。这些是用来处理捕捉到事件/信号的时候用来处理数据的地方。 specVersion: 0.0.4 description: Gravatar for Ethereum repository: https://github.com/graphprotocol/example-subgraph schema: file: ./schema.graphql dataSources: - kind: ethereum/contract name: Gravity network: mainnet source: address: '0x2E645469f354BB4F5c8a05B3b30A929361cf77eC' abi: Gravity startBlock: 6175244 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript entities: - Gravatar abis: - name: Gravity file: ./abis/Gravity.json eventHandlers: - event: NewGravatar(uint256,address,string,string) handler: handleNewGravatar - event: UpdatedGravatar(uint256,address,string,string) handler: handleUpdatedGravatar callHandlers: - function: createGravatar(string,string) handler: handleCreateGravatar blockHandlers: - function: handleBlock - function: handleBlockWithCall filter: kind: call file: ./src/mapping.ts Entity Relation == 数据库设计 这一步几乎是最重要的。是对schema的设计,其实本质上可以理解成数据库设计。主要分为几种: 一对一关系 type Transaction @entity { id: ID! transactionReceipt: TransactionReceipt } type TransactionReceipt @entity { id: ID! transaction: Transaction } 一对多关系 type Token @entity { id: ID! } type TokenBalance @entity { id: ID! amount: Int! token: Token! } 多对多关系 type Organization @entity { id: ID! name: String! members: [User!]! } type User @entity { id: ID! name: String! organizations: [Organization!]! @derivedFrom(field: "members") } Data Source == Web开发中的 DAO层(或者数据输入) Emmm,这里本质就是当遇到callback的时候,要把什么数据写进graph上。这里就是具体逻辑具体分析了。我这里挑了abracadabra的一个MIM合约的Transfer函数做了监听,假如发生了Transfer,我就记下来。也是非常简单的。 import { Address, BigInt } from "@graphprotocol/graph-ts" import { MagicInternetMoney, Approval, OwnershipTransferred, Transfer } from "../generated/MagicInternetMoney/MagicInternetMoney" import { MintRecord, MagicInternetMoneyEntity} from "../generated/schema" export function handleTransfer(event: Transfer): void { const MagicInternetMoneyV1Instance = MagicInternetMoney.bind(event.address) const magicInternetMoneyID = event.address.toString() let magicInternetMoney = MagicInternetMoneyEntity.load(magicInternetMoneyID) let mintRecord = MintRecord.load(event.transaction.from.toHex()) // update MagicInternetMoney if (!magicInternetMoney) { magicInternetMoney = new MagicInternetMoneyEntity(magicInternetMoneyID) magicInternetMoney.decimals = MagicInternetMoneyV1Instance.decimals() magicInternetMoney.totalSupply = MagicInternetMoneyV1Instance.totalSupply() magicInternetMoney.save() } if (!mintRecord) { mintRecord = new MintRecord(event.transaction.from.toHex()) const _from = event.parameters[0].value.toAddress() const _to = event.parameters[1].value.toAddress() const _value = event.parameters[2].value.toBigInt() const _lastMint = MagicInternetMoneyV1Instance.lastMint() mintRecord.tokenReceiver = _from mintRecord.tokenReceiver = _to mintRecord.amount = _value mintRecord.time = _lastMint.value0 mintRecord.token = magicInternetMoney.id mintRecord.save() } } export function handleApproval(event: Approval): void {} export function handleOwnershipTransferred(event: OwnershipTransferred): void {} 编译 + 部署 两行命令就可以发布到子网/托管网络,实现数据监听了。非常方便。 graph codegen && graph build graph deploy --studio clink-demo
No activity yet