ETH源码学习(2)GetBalance
从这开始读,因为最简单。还能对重要的东西有所理解。如果是单节点debug,重启链之后余额会归零,所以最少要两个节点,同步区块就没这个问题了,具体原因还未知。 声明:eth版本:Geth/v1.10.7-unstable/darwin-arm64/go1.17.5,我对比了网上的一些文章,这块代码有改动,主要以下改变从BlockChain的snap中读account几乎放弃从trie中获取account,判断极为严苛,我想不到有什么情况能进入,应该是放弃了这层分析入口//命令 eth.getBalance('0x0d7dd6dbabee2ec9b325aa7aa8b42d75068e8597') //入口 func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { //获取statedb state, _, err := s.b.StateAndHea...
Ether.js+Web3modal基础使用
1.说明现在网站会提供很多种钱包,web3modal可以提供统一的provider,不需要你操心太多东西用ether.js而不是web3.js的原因是简单,爽2.安装npm i web3modal npm i ethers //另外还需要安装对应wallet的包,自行搜索就行 3.连接钱包// MM默认就有,无需显式加入 const providerOptions = { walletconnect: { package: walletconnectProvider, options: { infuraId: "", }, }, }; //构建Web3Modal对象 const web3Modal = new Web3Modal({ //缓存provider cacheProvider: true, providerOptions, }); //连接wallet async function connect() { try { const web3ModalProvider = await web3Modal.connect(); provider = new ethers.pr...
签名:EIP712
//使用web3.js和eth-sig-util生成签名 import Web3 from "web3"; var sigUtil = require("eth-sig-util") const typedData = { //定义数据格式 types: { //固定格式,不要动,并且字段一个都不能少 //name:contract name //vaersion:版本号,如1.0随意 //chainId:当前链chainId //verifyingContract:合约地址 EIP712Domain: [ {name: 'name', type: 'string'}, {name: 'version', type: 'string'}, {name: 'chainId', type: 'uint256' }, {name: 'verifyingContract', type: 'address' }, ], //自定义自己业务的数据格式 Mail: [ {name: 'from', type: 'address'}, {name: 'to', type: 'address'},...
ETH源码学习(2)GetBalance
从这开始读,因为最简单。还能对重要的东西有所理解。如果是单节点debug,重启链之后余额会归零,所以最少要两个节点,同步区块就没这个问题了,具体原因还未知。 声明:eth版本:Geth/v1.10.7-unstable/darwin-arm64/go1.17.5,我对比了网上的一些文章,这块代码有改动,主要以下改变从BlockChain的snap中读account几乎放弃从trie中获取account,判断极为严苛,我想不到有什么情况能进入,应该是放弃了这层分析入口//命令 eth.getBalance('0x0d7dd6dbabee2ec9b325aa7aa8b42d75068e8597') //入口 func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { //获取statedb state, _, err := s.b.StateAndHea...
Ether.js+Web3modal基础使用
1.说明现在网站会提供很多种钱包,web3modal可以提供统一的provider,不需要你操心太多东西用ether.js而不是web3.js的原因是简单,爽2.安装npm i web3modal npm i ethers //另外还需要安装对应wallet的包,自行搜索就行 3.连接钱包// MM默认就有,无需显式加入 const providerOptions = { walletconnect: { package: walletconnectProvider, options: { infuraId: "", }, }, }; //构建Web3Modal对象 const web3Modal = new Web3Modal({ //缓存provider cacheProvider: true, providerOptions, }); //连接wallet async function connect() { try { const web3ModalProvider = await web3Modal.connect(); provider = new ethers.pr...
签名:EIP712
//使用web3.js和eth-sig-util生成签名 import Web3 from "web3"; var sigUtil = require("eth-sig-util") const typedData = { //定义数据格式 types: { //固定格式,不要动,并且字段一个都不能少 //name:contract name //vaersion:版本号,如1.0随意 //chainId:当前链chainId //verifyingContract:合约地址 EIP712Domain: [ {name: 'name', type: 'string'}, {name: 'version', type: 'string'}, {name: 'chainId', type: 'uint256' }, {name: 'verifyingContract', type: 'address' }, ], //自定义自己业务的数据格式 Mail: [ {name: 'from', type: 'address'}, {name: 'to', type: 'address'},...
Subscribe to point
Subscribe to point
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
async walletSignMessage(message) {
const signer = await window.ethProvider.getSigner();
const result = await signer.signMessage(message);
return result;
}
func VerifySig(address, signature, msg string) bool {
bytes := []byte(msg)
fromAddr := common.HexToAddress(address)
sig := hexutil.MustDecode(signature)
if sig[64] != 27 && sig[64] != 28 {
return false
}
sig[64] -= 27
pubKey, err := crypto.SigToPub(signHash(bytes), sig)
if err != nil {
return false
}
recoveredAddr := crypto.PubkeyToAddress(*pubKey)
fmt.Println(recoveredAddr)
result := fromAddr == recoveredAddr
return result
}
func signHash(data []byte) []byte {
msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
return crypto.Keccak256([]byte(msg))
}
为了提高安全性,还可以在前端生成时加入salt,时间戳之类的限制
async walletSignMessage(message) {
const signer = await window.ethProvider.getSigner();
const result = await signer.signMessage(message);
return result;
}
func VerifySig(address, signature, msg string) bool {
bytes := []byte(msg)
fromAddr := common.HexToAddress(address)
sig := hexutil.MustDecode(signature)
if sig[64] != 27 && sig[64] != 28 {
return false
}
sig[64] -= 27
pubKey, err := crypto.SigToPub(signHash(bytes), sig)
if err != nil {
return false
}
recoveredAddr := crypto.PubkeyToAddress(*pubKey)
fmt.Println(recoveredAddr)
result := fromAddr == recoveredAddr
return result
}
func signHash(data []byte) []byte {
msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
return crypto.Keccak256([]byte(msg))
}
为了提高安全性,还可以在前端生成时加入salt,时间戳之类的限制
No activity yet