jjzjj

go - 以太坊简单存储 : get() func always returns zero?

coder 2024-07-09 原文

简单存储.sol:

pragma solidity ^0.4.4;

contract SimpleStorage {
    uint storedData;

    function set(uint x) public {
        storedData = x;
    }

    function get() public constant returns (uint) {
        return storedData;
    }
}

绑定(bind)/SimpleStorage.go:

// Set is a paid mutator transaction binding the contract method 0x60fe47b1.
//
// Solidity: function set(x uint256) returns()
func (_SimpleStorage *SimpleStorageSession) Set(x *big.Int) (*types.Transaction, error) {
    return _SimpleStorage.Contract.Set(&_SimpleStorage.TransactOpts, x)
}

// Solidity: function set(x uint256) returns()
func (_SimpleStorage *SimpleStorageTransactor) Set(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) {
    return _SimpleStorage.contract.Transact(opts, "set", x)
}

// Solidity: function get() constant returns(uint256)
func (_SimpleStorage *SimpleStorageSession) Get() (*big.Int, error) {
    return _SimpleStorage.Contract.Get(&_SimpleStorage.CallOpts)
}

// Get is a free data retrieval call binding the contract method 0x6d4ce63c.
//
// Solidity: function get() constant returns(uint256)
func (_SimpleStorage *SimpleStorageCaller) Get(opts *bind.CallOpts) (*big.Int, error) {
    var (
        ret0 = new(*big.Int)
    )
    out := ret0
    err := _SimpleStorage.contract.Call(opts, out, "get")
    return *ret0, err
}

测试/SimpleStorage.go:

// TestGet checks if Get return a value that has been set
func (s *SimpleStorageSuite) TestGet(c *check.C) {
    session := contract.Session("SimpleStorage")
    c.Assert(session, check.NotNil)

    storageSession, ok := session.(*bindings.SimpleStorageSession)
    c.Assert(ok, check.Equals, true)
    c.Assert(storageSession, check.NotNil)
    fmt.Printf("session: %+v\n", storageSession)

    tx, err := storageSession.Set(big.NewInt(2302))
    c.Assert(err, check.IsNil)
    c.Assert(tx, check.NotNil)
    fmt.Printf("tx: %+v\n", tx)
    fmt.Printf("tx.To: %v\n", tx.To())

    storedData, err := storageSession.Get()
    fmt.Printf("%d\n", storedData)
    c.Assert(err, check.IsNil)
    c.Assert(storedData, check.Equals, 2302)
}

geth 开始使用 this脚本:

geth --datadir $DIR --nodiscover --maxpeers 0 init $DIR/genesis.json
geth --datadir $DIR --nodiscover --maxpeers 0 --mine --minerthreads 1 --rpc --rpcapi "eth,web3,personal,net" console

问题:运行 perigord test 给了我结果:

----------------------------------------------------------------------
FAIL: tests/SimpleStorage.go:37: SimpleStorageSuite.TestGet

tests/SimpleStorage.go:55:
    c.Assert(storedData, check.Equals, 2302)
... obtained *big.Int = 0 (%!q(big.Int=0))
... expected int = 2302

OOPS: 0 passed, 1 FAILED

为什么 get() 返回 0 而不是 2302?

通过打印交易,我看到了这个:

TX(555ca4c3edfa0190ce41bb6bfced502d903a721b02113634bbab5ff48902503a)
Contract: false
From:     945cd603a6754cb13c3d61d8fe240990f86f9f8a
To:       c4b69e1de27994a2a769302c4b9e7f56fa65d8d9
Nonce:    83
GasPrice: 0x430e23400
GasLimit  0xa2be
Value:    0x0
Data:     0x60fe47b100000000000000000000000000000000000000000000000000000000000008fe
V:        0x1b
R:        0x43b542cd09feb08db234a7693ed756cead678e0cf7b11b749594e9559333f7bb
S:        0x143f01822afe5d8ea65f97078b2df95df80128842a42d1f40edf031691df6bf8
Hex:      f88853850430e2340082a2be94c4b69e1de27994a2a769302c4b9e7f56fa65d8d980a460fe47b100000000000000000000000000000000000000000000000000000000000008fe1ba043b542cd09feb08db234a7693ed756cead678e0cf7b11b749594e9559333f7bba0143f01822afe5d8ea65f97078b2df95df80128842a42d1f40edf031691df6bf8

如果我尝试获取 To 地址的值:

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.3-stable/darwin-amd64/go1.10.1
coinbase: 0x945cd603a6754cb13c3d61d8fe240990f86f9f8a
at block: 7189 (Thu, 26 Apr 2018 20:07:44 +07)
 datadir: /tmp/geth_private_testnet
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> eth.getStorageAt("0xc4b69e1de27994a2a769302c4b9e7f56fa65d8d9", 0)
"0x00000000000000000000000000000000000000000000000000000000000008fe"

和:

Python 2.7.14 (default, Mar 22 2018, 14:43:05)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> int("0x00000000000000000000000000000000000000000000000000000000000008fe", 16)
2302

最佳答案

正如@smarx 所指出的,尽管 difficulty设置为0x1,交易还需要一些时间来挖掘。

我添加了以下代码来等待它:

ethClient, err := ethclient.Dial(s.network.Url())
txPending := true
for txPending {
    _, txPending, err = ethClient.TransactionByHash(context.Background(), tx.Hash())
    c.Assert(err, check.IsNil)
    if txPending {
        time.Sleep(3 * time.Second)
    } else {
        break
    }
}

现在测试通过了:

Running migration 1
Running migration 2
Setting last migration to:  2
s.network: &{name:dev rpc_client:0xc4202773b0 client:0xc4203780c0 keystore:0xc4204642d0}
session: &{Contract:0xc42027e400 CallOpts:{Pending:true From:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] Context:<nil>} TransactOpts:{From:[148 92 214 3 166 117 76 177 60 61 97 216 254 36 9 144 248 111 159 138] Nonce:<nil> Signer:0x448c760 Value:<nil> GasPrice:<nil> GasLimit:0 Context:<nil>}}
tx:
    TX(11afba591622660236c2726ec67616c26f2f4a65ea5c3b4333bc6cf9523d2d2b)
    Contract: false
    From:     945cd603a6754cb13c3d61d8fe240990f86f9f8a
    To:       37ad882be0e122a82da9a93addbc22f6b0330ac1
    Nonce:    135
    GasPrice: 0x430e23400
    GasLimit  0xa2be
    Value:    0x0
    Data:     0x60fe47b100000000000000000000000000000000000000000000000000000000000008fe
    V:        0x1b
    R:        0x2f66cf07f390714d835c2d539ab03d26e274854903c535b751475d270f68c17c
    S:        0x31d41b82a5614162cf4ec518c67fb5dfb0b6f16c6ce8329d43860483b996a470
    Hex:      f8898187850430e2340082a2be9437ad882be0e122a82da9a93addbc22f6b0330ac180a460fe47b100000000000000000000000000000000000000000000000000000000000008fe1ba02f66cf07f390714d835c2d539ab03d26e274854903c535b751475d270f68c17ca031d41b82a5614162cf4ec518c67fb5dfb0b6f16c6ce8329d43860483b996a470

tx.Hash: [17 175 186 89 22 34 102 2 54 194 114 110 198 118 22 194 111 47 74 101 234 92 59 67 51 188 108 249 82 61 45 43]
ret0: 842351256648
out: 842351256648
2302
OK: 1 passed
PASS
ok      github.com/quantonganh/simplestorage    82.625s

关于go - 以太坊简单存储 : get() func always returns zero?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043994/

有关go - 以太坊简单存储 : get() func always returns zero?的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  4. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  5. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  6. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  7. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  10. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

随机推荐