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...
ETH源码学习(1)创建私有链
下载geth,创建genesis.json{ "config": { "chainId": 8888, //自行修改 "homesteadBlock": 0, "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "difficulty": "0x700000",//难度,越大挖矿越慢 "alloc": { "093f59f1d91017d30d8c2caa78feb5beb0d2cfaf...
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...
ETH源码学习(1)创建私有链
下载geth,创建genesis.json{ "config": { "chainId": 8888, //自行修改 "homesteadBlock": 0, "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "difficulty": "0x700000",//难度,越大挖矿越慢 "alloc": { "093f59f1d91017d30d8c2caa78feb5beb0d2cfaf...
Subscribe to point
Subscribe to point
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
//使用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'},
{name: 'value', type: 'uint256'},
],
},
//上面定义的数据格式具体内容
domain: {
name: 'Demo',
version: '1.0',
chainId:'1',
verifyingContract:'0xf8e81D47203A594245E36C48e151709F0C19fBe8'
},
primaryType: 'Mail',
//具体的业务字段,需要和上面的Mail格式对应
message: {
from: "0xE3a463d743F762D538031BAD3f1E748BB41f96ec",
to: "0x39Ef50bd29Ae125FE10C6a909E42e1C6a94Dde29",
value: 1234234145789,
},
}
//生成签名 privateKey 是钱包账户的秘钥
var privateKeyHex = Buffer.from(privateKey, 'hex')
var signature = sigUtil.signTypedData_v4(privateKeyHex, {data: typedData})
}
//使用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'},
{name: 'value', type: 'uint256'},
],
},
//上面定义的数据格式具体内容
domain: {
name: 'Demo',
version: '1.0',
chainId:'1',
verifyingContract:'0xf8e81D47203A594245E36C48e151709F0C19fBe8'
},
primaryType: 'Mail',
//具体的业务字段,需要和上面的Mail格式对应
message: {
from: "0xE3a463d743F762D538031BAD3f1E748BB41f96ec",
to: "0x39Ef50bd29Ae125FE10C6a909E42e1C6a94Dde29",
value: 1234234145789,
},
}
//生成签名 privateKey 是钱包账户的秘钥
var privateKeyHex = Buffer.from(privateKey, 'hex')
var signature = sigUtil.signTypedData_v4(privateKeyHex, {data: typedData})
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/draft-EIP712.sol";
contract MyContract is EIP712 {
constructor(string memory name, string memory version) EIP712(name, version) {}
//生成签名的业务参数和生成的签名
function recoverV4(
address from,
address to,
uint256 value,
bytes memory signature
) public view returns (address) {
bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
//需要和js中的type中业务的数据格式对应
keccak256("Mail(address from,address to,uint256 value)"),
from,
to,
value
)));
return ECDSA.recover(digest, signature);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/draft-EIP712.sol";
contract MyContract is EIP712 {
constructor(string memory name, string memory version) EIP712(name, version) {}
//生成签名的业务参数和生成的签名
function recoverV4(
address from,
address to,
uint256 value,
bytes memory signature
) public view returns (address) {
bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
//需要和js中的type中业务的数据格式对应
keccak256("Mail(address from,address to,uint256 value)"),
from,
to,
value
)));
return ECDSA.recover(digest, signature);
}
}
No activity yet