浅谈区块链和WEB3
什么是区块链?区块链技术是一种去中心化、分布式的账本技术,它能够安全地记录交易信息,并防止数据被篡改。你可以把它想象成一本“公开账本”,所有参与者都可以查看,但没有人可以随意更改过去的记录。 区块链的基本概念 区块(Block):包含若干条交易记录的数据包。 链(Chain):每个区块通过加密哈希链接在前一个区块之后,形成一个链条。 去中心化:没有中心服务器,数据分布在多个节点上。 共识机制:网络节点之间达成一致的方法,比如工作量证明(PoW)、权益证明(PoS)等。 不可篡改性:一旦数据写入区块链,就几乎不可能更改。 区块链是如何工作的? 发起交易: 用户在区块链网络中发起一个交易,比如转账。 交易广播: 这笔交易会广播到整个网络,所有节点都能接收到。 交易验证: 节点通过算法验证交易是否合法,例如: 发送方是否有足够的余额; 数字签名是否有效。 打包成区块: 验证通过的交易会被打包进一个新区块。 达成共识: 通过共识机制选择一个节点把新区块加入链上(例如通过计算难题来竞争记账权)。 写入区块链: ...
部署UniswapV2
选择Foundry本地测试网 添加获取INIT_CODE的代码在UniswapV2Factory.sol 合约中添加以下代码用来获取INIT_CODE ,然后切换编译器版本为0.5.16 ,编译合约后直接部署即可。 1bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(UniswapV2Pair).creationCode)); 获取INIT_CODE部署好UniswapV2Factory合约后,调用获取INIT_CODE 的值。 替换INIT_CODE找到v2-periphery 下的UniswapV2Library.sol 文件,搜索hex ,修改pairFor 函数中对应的哈希值。 部署WETH以及router合约 在Foundry测试文件中如何调用合约?使用 vm.createSelectFork("http://127.0.0.1:8545"); 连接到本地测试网,即可直接用刚刚部署好的合约地址调用合约。
重入攻击
什么是重入攻击?重入攻击(Reentrancy Attack)是区块链智能合约中的一种常见安全漏洞,尤其在以太坊等支持智能合约的区块链平台中较为突出。它发生在一个合约在调用另一个合约(或地址)的函数时,未更新自身状态之前,对方合约又重新调用原合约的函数,从而导致逻辑被重复执行,进而被恶意利用。 举一个经典例子12345678910111213141516171819contract Vulnerable { mapping(address => uint) public balances; function withdraw() public { uint amount = balances[msg.sender]; require(amount > 0); // 向用户发送 ETH (bool success, ) = msg.sender.call{value: amount}(""); require(success);...
以太坊中的Token与NFT
首先,Token与NFT都属于代币,每一条区块链都会有自己的原生代币(比如btc、eth、sol),而Token和NFT是建立在某个区块链平台(比如以太坊、Solana、BNB Chain 等)之上的数字资产或权益证明,它代表某种价值、权限、所有权或使用权。 TokenToken一般是指同质化代币,就像货币一样,每一枚Token都是一样的。 我们常说的发币,其实就是部署合约代码,而Token就是存储在合约里的数据。在以太坊中,所有Token合约都应遵循ERC-20标准实现。 用途 支付用途:某些项目的Token可以用于支付或手续费(例如BNB)。 治理代币:持有者可以参与项目的投票、决策(例如UNI)。 稳定币:如USDT、USDC,锚定美元等法币。 奖励激励:用来奖励用户参与某些活动(如DeFi挖矿)。 NFTNFT(Non-Fungible Token,非同质化代币)不像Token一样可以分割,可以认为每一个NFT就是一份独一无二的收藏品。 NFT 依靠区块链技术来确保其所有权记录的完整性和安全性。NFT...
部署第一个合约
钱包转账 部署第一个合约创建一个 counter.sol 文件,写入 Solidity 代码,如下: 1234567891011121314151617//SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract Counter { uint256 internal count = 0; constructor() {} function get() public view returns (uint256) { return count; } function add(uint256 x) public { count += x; }} 选择合适的编译器版本进行编译。 在部署页面选择 Injected Provider - MetaMask ,这将使用MetaMask作为Web3 Provider...
v-deep的使用踩坑
问题在同一个页面中,我使用v-deep设置了input 组件的placeholder 样式,让输入框从右往左输入,但是这导致textarea 组件的placeholder 样式也被修改了。当我单独设置textarea 的placeholder 样式时,input 中的样式也会相应被覆盖。 这是自定义的placeholder 的样式: 12345678910::v-deep(.placeholder-text) { font-family: PingFangSC, PingFang SC; font-weight: 400; font-size: 14px; color: #2C5181; line-height: 0; text-align: right; font-style: normal; text-transform: none; } 解决办法将需要修改样式的输入框再包一层就好了。修改后的样式如下: 123456789101112.right-input...
表单默认提交行为导致请求被取消
表单默认提交行为导致请求被取消起因是最近接手的一个前端管理系统项目,这是个19年的老项目,技术栈就不必多说了,jquery+layui ,我看了直接傻眼,我曼波是个后端开发啊😭😭😭!!!终究是活成了自己最讨厌的样子。话又说回来,成为一名全栈er感觉也挺爽的,只是我不想接触这么一坨大杂烩的时代遗物。 问题打开模态框填写表单数据,然后点击按钮提交表单发起请求时发现预检OPTION 请求通过了,但是真正的请求却被取消了,随后整个页面自动刷新了,模态框也被关闭但没有触发任何回调函数弹出提示框。这个问题其实很基础,但我作为一名半路出家的前端,对这种场景没什么经验。 12345678910111213141516171819202122232425// 监听提交按钮点击事件$('#submitAfterSale').on('click', function() { var formElement = $('#addAfterSaleForm')[0]; if (formElement) { ...
结构体指针的转换
问题:起因是在水群的时候看到这么个问题: 12345678910111213141516171819202122232425262728293031package mainimport ( "fmt" "unsafe")type Reception struct { p unsafe.Pointer len int}func main() { type A struct { s string } m := make(map[string]struct{}) tmp := A{s: "hello"} m[tmp.s] = struct{}{} // 由于 A 结构体的字段 s 是一个字符串类型,所以在将 tmp.s 作为 map 的 key 时,会将字符串的地址作为 key,而不是字符串的值 fmt.Printf("tmp.s: %+v\n",...
for range的闭包问题
for range的闭包问题在之前,Go中的for range语句中用短声明形式定义的循环变量是整个循环共享同一个,这就导致在for range语句中的闭包在循环结束后引用的该循环变量最后都会变为同一个值。 1234567891011func main() { var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait()} 例如在上面的代码中,最后输出的结果为: 123333 这是因为闭包实际上捕获的是对变量 i 的引用,在闭包函数运行时,循环语句已经结束,i 的值已经变为了3,所以输出的结果自然都是3。 如果要实现预期输出,则需要使每个闭包函数的引用各不相同,修改如下: 123456789101112func main() { var wg sync.WaitGroup for i := 0; i < 3;...
Golang使用Protocol Buffers不完全指北
Protocol Buffers V3 语法指南Protocol Buffers V3中文语法指南[翻译] - 李文周的博客 使用指南安装protobuf从gtihub仓库下载对应操作系统的预编译好的二进制文件。 我下载的是M芯片的Mac系统版本: 其中: bin 目录下的 protoc 是可执行文件。 include 目录下的是 google 定义的.proto文件。 别忘了将文件夹下的 bin 目录添加到环境变量中。 protoc生成Go和gRPC代码protocol buffer编译器需要一个插件来根据提供的proto文件生成 Go 代码,使用下面的命令安装插件。 1go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 同样,生成gRPC代码也需要用到一个插件。 1go install...