以太坊技术研究
maxdaic
这个作者很懒,什么都没留下…
展开
-
读区块链也要消耗gas?
最近写智能合约代码发现一个问题,我写了一个读区块链的函数,结果发现这个读区块链的函数执行后居然上链了!这有点颠覆我的认知,我一直以为只有写区块链才需要上链,因为写区块链会导致区块链状态发生改变。而读区块链应该不会才对!经过我不断的怀疑,测试,验证终于发现一个秘密。下面就是我读区块链功能类似的代码,我用更直接的方式写出来:pragma solidity >=0.4.0 <0.7.0;contract Hello { string hello = "hello, world";原创 2020-09-27 10:11:30 · 730 阅读 · 0 评论 -
以太坊智能合约bytes参数解析
最近测试以太坊智能合约的时候,发现一个现象,智能合约函数有bytes类型参数的时候,首先会有个奇怪的数据。这个奇怪的数据似乎和bytes参数所在的位置有关。下面是第一个参数是bytes类型的函数调用时候的参数。下面是第二个参数是bytes类型的函数调用时候的参数。下面是第三个参数是bytes类型的函数调用时候的参数从第一个参数的0x20到第二个参数的0x40到第三个参数的0x60,这个值到底有什么用处呢?在下面这篇文章里终于找到了答案:https://solidity-cn.原创 2020-09-02 18:10:55 · 2013 阅读 · 0 评论 -
用golang和以太坊智能合约交互
用golang可以开发程序和以太坊智能合约进行交互,只是需要一些额外的步骤。首先需要智能合约源码,其次需要abigen这个程序,这个程序可以通过编译go-ethereum程序得到。在windows下通过把go-ethereum源码下载下来,然后在源码目录执行下面命令:go install -v ./cmd/...执行abigen命令把智能合约代码转义成我们需要的golang代码,命令如下abigen --sol YLCoin.sol --out token.go --pkg sma原创 2020-08-04 20:23:55 · 2069 阅读 · 0 评论 -
ChainLink的VRF体验之彩票合约
今天体验了一下ChainLink的VRF功能,用的是社区的一个模拟彩票抽奖的智能合约。下面是智能合约的主要代码:RandomNumberGenerator.solpragma solidity ^0.6.2;import "./VRFConsumerBase.sol";import "./Lottery.sol";contract RandomNumberGenerator is VRFConsumerBase { address requester; bytes32原创 2020-06-07 12:27:25 · 1361 阅读 · 1 评论 -
为什么solidity空字符串打印到event里却是0x20?【未解决】
之前遇到一个问题,一直就接着我,在研究argent智能合约的时候,最后一次打印日志,明明是空的字符串,打印出来却变成了0x40,在好奇心的驱使下,我写了一小段代码做测试,代码如下:contract TestLog { bytes constant internal EMPTY_BYTES = ""; event Logempty(bytes data); function Log() public { emit Logempty(EMPTY_BYTES);原创 2020-06-05 16:44:35 · 338 阅读 · 0 评论 -
argent钱包软件转账免手续费之谜——钱包合约初始化细节
这里我想通过公开的数据获取到足够的信息,最后尽量能重现创建我的钱包合约的整个过程。我钱包里的看到的那个地址上回说了是一个智能合约地址,这和传统的以太坊外部账号地址不同。仔细研究这个智能合约,发现它只是一个代理合约。这个合约真正的功能实现是另有其人,就是合约里的implementation变量存储的智能合约地址。contract Proxy { address implementation;...}经过分析智能合约代码,发现是从它的创建者合约传入的该地址,而这个值是0xb6d642原创 2020-06-05 11:56:00 · 1110 阅读 · 0 评论 -
以太坊智能合约地址生成之CREATE2指令
承接上篇,不多做介绍,直接上代码:func Create2ContractAddr(sendAddr string, salt string, byteCode []byte) (string,error) { //keccak256( 0xff ++ sendAddr ++ salt ++ keccak256(byteCode))[12:] var ( data []byte err error buf []byte ) data = append(data, byte(0xf原创 2020-06-04 11:20:50 · 2728 阅读 · 0 评论 -
以太坊智能合约地址生成之CREATE指令
以太坊智能合约地址生成是有规则的,是可以提前预测的。不信,看下面的代码:import ( "encoding/binary" "encoding/hex" "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3")//根据RLP编码规则把int变量值转变成字节切片func RlpInt2Bytes(i int)[]byte { var data [4]byte if i <= 255 { if i =原创 2020-06-04 11:14:19 · 1965 阅读 · 0 评论 -
以太坊智能合约Event的哈希值验证
最近在研究以太坊,看到智能合约的Event部分,在etherscan上看到下面这张图标题就是这个topic0,据说这是Received(blablabal)那一串的哈希值。怀着动手一试的想法,我用golang测了一下,诚不欺我也。代码如下:t.Run("test keccak256 event", func(t *testing.T) { var testcases = []struct { str string want string } { { //"even原创 2020-06-04 11:01:48 · 1381 阅读 · 0 评论 -
以太坊地址生成算法golang实现
实现代码:func NewAddress(strPrivKey string) (string, error) { var ( uncompressPubKey []byte pubKeyHash256 []byte err error buf []byte ) if buf, err = hex.DecodeString(strPrivKey); err != nil { return "", err } privKey := secp256k1.PrivKeyFrom原创 2020-06-04 10:45:26 · 1304 阅读 · 0 评论 -
以太坊地址检测算法golang实现
早些时候,以太坊地址是没有区分大小写的。后来不知道从什么时候开始,提交了一个EIP55提案,建议以太坊地址以大小写区分来验证地址的合法性。比特币地址在最后添加4个字节的校验和后缀来做校验,以太坊却是以大小写的形式做校验,也算是一种新颖的做法。下面代码实现了转换部分大小写的以太坊地址为带校验的地址,以及检测一个地址是否带校验功能。源码如下:func ToValidateAddress(address string) string { addrLowerStr := strings.ToLower(ad原创 2020-06-04 10:42:41 · 1891 阅读 · 0 评论