- 博客(35)
- 资源 (6)
- 收藏
- 关注
原创 基于虚拟机源码分析move合约(零):Move虚拟机执行原理
本系列文章尝试通过解读move虚拟机执行阶段的源码,来分析move合约实际的工作原理
2022-09-28 17:11:03 700
原创 Solana Account 详解
在Solana的世界里,一切都是Account,每个Account都有一个独一无二的地址,除了地址外,每个Account都有以下属性
2022-07-13 15:00:15 1606 1
原创 Solana SPL Token 的一些最佳实践
SPL Token是Solana针对ERC20的一种实现,在Solana编程中常常会对SPL Token进行操作,今天介绍一些关于SPL Token的最佳实践,代码出自Solana官方之手:spl_tokes.rsToken Account是SPL Token里特有的Account类型,它的作用是用来持有某种类型的代币,每个用户想要持有代币,就必须创建一个Token Account。在转移代币的时候,我们往往需要校验一个Token Account是合法的,上述代码包含了所有需要校验的点:1. 校验da
2022-07-13 13:58:29 2865
翻译 基于Merkle Tree为NFT添加白名单功能(翻译)
1、介绍在我们今天所知道和喜爱的区块链出现之前,Merkle Trees一直存在于密码学和计算机科学领域。如今,我们开始慢慢看到它们在链上更频繁地用于数据验证。在这篇文章中,我将解释Merkle Trees如何在NFT(ERC-721)背景下实现NFT的白名单的功能,以及它们如何提供保证NFT只能由特定的用户认领。2、什么是Merkle Trees?Merkle Trees是一种树状结构,树上的每个节点都由一个值表示,这个值是一些哈希函数的结果。哈希函数是单向的,这意味着从一个输入产生一个输出很
2022-04-08 15:13:31 1440
原创 Rust简短笔记:Cargo指定依赖版本
今天使用Cargo管理依赖,发现指定的依赖和实际构建的依赖对不上:如图,我指定了solana-program = "1.9.5",但是实际构建的时候依赖的是1.10.2,百度了很久发现没有任何有效信息,然后google了一下,找到了和我遇到一样问题的兄弟(这说明Rust在国内还是比较小众的):how to specify the exact version of a dependency从回答中我们知道,solana-program = "1.9.5"这种写法,Cargo会优先使用本地的s.
2022-03-17 17:23:56 3889
原创 Rust复杂的表达式解析结果探讨
在上文Solana项目学习(一):Hello World_biakia0610的专栏-CSDN博客中,我们学习了solana的helloworld例子,在代码最后一部分,有一个非常复杂的表达式:greeting_account.serialize(&mut &mut account.data.borrow_mut()[..])?;这里的&mut &mut account.data.borrow_mut()[..] 到底是返回什么呢? 这篇文章会尝试进行详细探讨。
2022-02-25 13:55:47 377
原创 Solana项目学习(一):Hello World
项目地址:example-helloworld1、整体代码use borsh::{BorshDeserialize, BorshSerialize};use solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint, entrypoint::ProgramResult, msg, program_error::ProgramError, pubkey::
2022-02-21 15:17:57 883
原创 Rust简短笔记:原始指针(Raw Pointer)
众所周知,Rust语言的指针是一种安全的指针,它会遵循一定的规则,比如ownership规则,会确保不出现悬挂指针。但是当我们需要写一些底层框架的时候,往往需要绕过这些规则,自由的控制指针,这时候我们就可以使用原始指针1、定义原始指针我们可以通过以下方法定义原始指针:fn main() { let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32;}
2022-02-14 13:42:39 3122
原创 PawningShop:一种NFT抵押借贷的实现
PawningShop是一种基于NFT的抵押借贷的实现。PawningShop中有两种角色:一种是抵押NFT的人,他需要通过抵押NFT借入一笔钱,我们叫他borrower,另一种是借出钱的人,我们叫他lender....
2021-11-14 15:05:30 13034
原创 Pancake的IFO解读
IFO英文全称是Initial Farm Offering,用户在pancake进行CAKE-BNB挖矿获得的LP Token,用户使用LP Token可以在IFO合约中进行新发布币种的认购。代码在:initial-farm-offering/IFO.sol at 1d452d71d5956693467605e76b04a1f6c06c8344 · pancakeswap/initial-farm-offering · GitHubpragma solidity 0.6.12;import
2021-09-10 13:20:38 8554
原创 NFT Market的一种实现
代码来源:https://github.com/blocklords/seascape-smartcontracts/blob/main/contracts/nft_marketplace/NftMarket.solpragma solidity ^0.6.7;pragma experimental ABIEncoderV2;import "./../openzeppelin/contracts/token/ERC20/IERC20.sol";import "./../openzeppel
2021-09-08 14:11:44 11052
原创 SushiToken的投票实现
SushiToken继承标准的ERC20,在此基础上,又实现了代币的投票功能。1、数据结构/// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint {
2021-08-10 13:51:40 457
原创 Safemoon源码解读
Safemoon是一种通缩分红token,通缩指的是每次转账都会收取一定手续费,这些手续费会直接销毁,进而导致总量的通缩。分红指的是,用户的余额会随着其他用户转账而增加。Safemoon的基本原理用一个比喻来说就是,将一块固定蛋糕(_tTotal)分给总量会变化的盘子中(_rTotal),每次转账都会打碎一部分盘子,这样剩余盘子分到的蛋糕就变多了。
2021-07-30 17:25:24 4508 5
原创 Solidity中的mapping为何不提供按照key遍历的功能?
举个例子pragma solidity ^0.6.12;contract Test { mapping(uint256 => uint256) numMap; function testMap() public { numMap[1001] = 1; }}这个Test合约定义了一个mapping数据结构numMap,key和value都是uint256类型使用solc生成汇编:solc --bin --asm --optimize Test.sol
2021-04-16 14:53:19 949
原创 SushiSwap的SushiMaker和SushiBar解读
1、SushiMakerSushiMaker的第一个作用是收集SushiSwap的手续费,SushiSwap是基于Uniswap进行扩展的,底层的代码和Uniswap是一样的。而Uniswap每个交易对都是一个UniswapV2Pair,它在执行mint和burn的时候,会计算手续费,这些手续费会以流动性代币的形式发给feeTo这个地址。在SushiSwap中,这个feeTo其实就是SushiMaker合约的地址。SushiMaker的第二个作用就是将收集到的流动性代币转换成Sushi代币,然后发给
2021-04-13 15:09:41 1801
原创 SushiSwap的MasterChef解读
1、MasterChef的数据结构MasterChef在SushiSwap中处于核心地位,用户可以通过它进行流动性挖矿。MasterChef中包含两个主要的数据结构:UserInfo和PoolInfo1.1、UserInfostruct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See ex
2021-04-13 14:22:31 1429 1
原创 Uniswap计算过程推演
0、创建一个交易对假设创建了一个DAI/USDT交易对,其中有一个用户lpUser负责存入和提取交易对,另一个用户swapUser负责交易。1、初始状态
2021-04-10 14:56:12 2948 1
原创 基于双数组实现Set功能(基于Solidity)
1、背景在以太坊NFT中,需要使用Set进行NFT(本质是存的NFT的唯一ID)的存储,以太坊本身没有Set的概念,只有数组。基于单数组实现Set,每次删除value,都需要遍历数组然后逐个调整,由于太坊执行操作需要消耗gas,这种调整比较消耗gas,因此会基于双数组来实现删除功能。2、原理图3、solidity代码实现mapping(address => uint256[]) internal ownerTokens;mapping(uint256 => uint.
2021-04-03 10:46:21 341
原创 docker启动springboot耗时太长
1、问题最近发现测试环境docker启动springboot应用,耗时达到了355s:2、排查首先进入docker容器docker exec -it core-collections /bin/bash执行jps得到应用pid是1,然后执行jstack 1 | grep -100 main得到如下堆栈:"main" #1 prio=5 os_prio=0 tid=0x00007f7dbc00d800 nid=0x6 in Object.wait() [0x00007f7d
2020-08-05 20:22:16 1449
原创 高并发下JDBC执行update有可能返回0
1、场景jdbc配置:jdbc.url=xxxxxxxxx&useAffectedRows=true数据库字段update_time为datetime 类型sql语句:update xxx set a=#{a},update_time=now() where id=#{id}触发场景:高并发下,1秒内连续两次update请求,第二次update返回为0。2、原因分析一般我们建表时都不指定日期格式精度,默认就是精确到秒,jdbc如果设置了useAffectedRows=t.
2020-06-29 16:32:39 1263
原创 iOS内置webview跨域问题
1、问题描述同一个接口,在安卓webview下跨域成功,iOS的webview跨域失败。2、原因参考:https://stackoverflow.com/questions/49304677/cors-error-in-safari-not-in-chrome由于我们服务端设置了Access-Control-Allow-Headers : *而iOS的webview可能不支持*...
2019-12-31 09:47:36 6276 1
原创 CentOS7安装mysql5.7
1、下载去https://dev.mysql.com/downloads/mysql/ 下载Mysql Community Server 5.7版本,然后上传到服务器2、解压并移动目录tar -zvxf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gzmkdir /usr/local/msyqlmv mysql-5.7....
2019-01-19 15:16:57 97
原创 Sharding-JDBC实战
1、快速入门1.1、分库分表数据库架构以订单中心为例,无论库还是表,都是以卖家ID或者买家ID去分片。假设有两个数据库 order_center_0和order_center_1,每个库有两张表t_order_0,t_order_1以及t_order_item_0和t_order_item_1,于是我们得到下面的数据库架构:1.2、Sharding-JDBC的配置1....
2019-01-14 19:42:44 1681
原创 最大字段和
/** * 求一个序列的最大字段和: * 比如序列{-2,11,-4,13} 则最大字段和为18 * @author biakia * */public class MaxSubSum { /* * 求最大字段和的分治算法: * 如果将所给的序列a[1:n]分为两段:a[1:n/2],a[n/2+1,b],那么要求最大字段和,共三种情况: * 1、a[1:n]的最大字段和
2014-09-02 15:10:36 472
原创 最长公共子序列
/** * 最长公共子序列问题,是一个经典的动态规划问题,它有如下最优子结构: * 令c[i][j]保存的是最大长度,则 * 1、当i=0 j=0时 c[i][j]=0 * 2、当i,j>0;x[i]=y[j]时 c[i][j]=c[i-1][j-1]+1 * 3、当i,j>0;x[i]!=u[j]时 c[i][j]=max{c[i][j-1],c[i
2014-09-02 14:46:44 363
原创 快速排序
/** * 经典的快速排序,基本思想分为三步: * 1、分解:选取一个基元素,把数组中小于基元素的元素放到左边,大于基元素的放到右边 * 2、递归求解 * 3、合并:其实一旦求解完,数组就已经排好序了,所以不需要合并 * @author biakia * */public class QuickSort { private static void quickSort(int[
2014-09-01 21:09:51 255
原创 归并排序
/** * 归并排序,本质是分治算法,对每个数组分为左右两个数组,然后在合并的时候进行排序 * @author biakia * */public class MergeSort { private static int[] mergeSort(int[] array,int left,int right){ int[] result=new int[right-left+1]
2014-09-01 20:58:40 270
dubbo-admin-2.8.4.war
2016-12-21
C Programming Language(高清版)
2013-03-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人