精华内容
下载资源
问答
  •     在以太坊中,若需要合约合约之间的调用,则可以使用call、callcode和delegatecall方法,它们之间的联系如下: 调用方式 修改storage 调用者的msg.sender 被调用的msg.sender 执行的上下文 推荐 call ...

        在以太坊中,若需要合约与合约之间的调用,则可以使用call、callcode和delegatecall方法,它们之间的联系如下:

    调用方式 修改storage 调用者的msg.sender 被调用的msg.sender 执行的上下文 推荐
    call 修改被调用者的合约storage 交易的发起者地址 调用者地址 被调用者
    callcode 修改调用者的合约storage 调用者地址 调用者地址 在调用者里
    delegatecall 修改调用者的合约storage 交易的发起者地址 调用者地址 在调用者里

        这里以合约EthAlice调用合约EthBob为例,进行说明,其执行流程如下:

    图(1) 合约间的调用流程(Alice调用Bob)

    1、调用者EthAlice

        //ehtAlice.sol

    pragma solidity ^0.4.18;
    
    contract EthAlice {
        uint    public num;
        address public addr;
        function callSetNum(address ads, uint value) public returns(uint) {
            require(ads.call(bytes4(keccak256("SetNum(uint256)")), value));
            return value;
        }
    
        function callcodeSetNum(address ads, uint value) public returns(uint) {
            require(ads.callcode(bytes4(keccak256("SetNum(uint256)")), value));
            return value;
        }
    
        function delegatecallSetNum(address ads, uint value) public returns(uint) {
            require(ads.delegatecall(bytes4(keccak256("SetNum(uint256)")), value));
            return value;
        }
    }
    
    

    2、被调用者EthBob

        //ethBob.sol

    pragma solidity ^0.4.18;
    
    contract EthBob {
        uint    public num;
        address public addr;
    
        event sendAddr(address);
        function SetNum(uint _num) public {
            num = _num;
            addr = msg.sender;
            emit sendAddr(msg.sender);
        }
    }
    
    

    3、部署合约

        在MetaMask里选择一个Rinkeby测试网账户,比如0x6026DfB9816D22F65F1011639B207B1c3A2C2e84
    ,然后在Remix上部署EthAlice和EthBob合约,得到如下:
        EthAlice合约地址:0xeb0282Dcd268afCFeAFA84ea2260edC2c7747381
        EthBob合约地址:0xe981880Ac36360A1bF4F8F2a369877dbE29Aa8d4

    3.1 测试call()调用方式

        在Remix里的部署页面里,点开ETHALICE --> callSetNum 输入如下2个参数:
    ads:0xe981880Ac36360A1bF4F8F2a369877dbE29Aa8d4
    value:32
        如图(2) 所示:

    图(2) call()调用方式

        Alice通过call()方式,修改的是Bob的num:0–>32,
    而不是自身的num:0–>0;
        即call()方式,修改的是被调用者的storage
        Alice的msg.sender = 交易的发起者地址
        Bob的msg.sender = 调用者地址(Alice合约地址)

    3.2 测试callcode()调用方式

        在Remix里的部署页面里,点开ETHALICE --> callcodeSetNum 输入如下2个参数:
    ads:0xe981880Ac36360A1bF4F8F2a369877dbE29Aa8d4
    value:34
        如图(3) 所示:

    图(3) callcode()调用方式

        Alice通过callcode()方式,修改的是自身num:32–>34,
    它不会修改Bob的num:32–>32;
        即callcode()方式,修改的是调用者自身的storage
        Alice的msg.sender = 调用者地址(Alice合约地址)
        Bob的msg.sender = 调用者地址(Alice合约地址)

    3.3 测试delegatecall()调用方式

        在Remix里的部署页面里,点开ETHALICE --> delegatecallSetNum 输入如下2个参数:
    ads:0xe981880Ac36360A1bF4F8F2a369877dbE29Aa8d4
    value:36
        如图(4) 所示:

    图(4) delegatecode()调用方式

        Alice通过delegatecall()方式,修改的是自身num:34–>36,
    它不会修改Bob的num:32–>32;
        即delegatecall()方式,修改的是调用者自身的storage
        Alice的msg.sender = 交易的发起者地址
        Bob的msg.sender = 调用者地址(Alice合约地址)

    展开全文
  • 今天在技术群里跟大家做技术交流,发现还是有很多人还是对以太坊的智能合约调用关系不是很清楚。所以我打算专门写一篇博文来说一下这个问题。 直接上代码: contract Wallet{ ERC20Token public token; ...

    今天在技术群里跟大家做技术交流,发现还是有很多人还是对以太坊的智能合约调用关系不是很清楚。所以我打算专门写一篇博文来说一下这个问题。

    直接上代码:

    contract Wallet{
        ERC20Token public token;
    
        constructor(address _token) public{
            token = ERC20Token(_token);
        }
    
        event Event_TransferToken(address _addr,uint256 _value);
        function TransferToken(address _addr,uint256 _value) external
        {
            token.transfer(_addr ,_value);
            emit Event_TransferToken(_addr ,_value);
        }
    }

    如代码上所示,这个合约内有一个Token对象,合约初始化的时候传入一个ERC20 Token的地址来实例化这个token对象,还有一个TransferToken方法,传入你要转出的的token数量和地址,然后TransferToken方法会调用token.transfer方法转出token。

    很多人认为当我们自己去调用Wallet合约的TransferToken方法,这个时候msg.sender是我们自己,所以当执行token.transfer语句的时候很多人也会觉得相对于token对象而言msg.sender还是我们自己,这个时候转出的token是我们自己账户上的token。

    但是这个想法大错特错。

    调用TransferToken方法的时候,msg.sender却是是我们自己,但是在这个方法体内又执行了token.transfer,但是这个语句并不是我们自己去调用的,而是这个Wallet合约调用的,我们只是跟Wallet合约交互,跟token合约交互的是Wallet,所以在执行token.transfer语句的时候,token合约接收到的msg.sender是Wallet,所以转出的token是从Wallet的账户地址转出来的。

    展开全文
  • ,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。 这里是 原文 转载于:https://my.oschina.net/u/2472105/blog/1933846

    本指南将深入探讨调用合约,交易,事件,过滤器和主题。

    测试合约

    以下智能合约是上一指南中multiply合约的更新版本:

    contract test {
    
        int _multiplier;
        event Multiplied(int indexed a, address indexed sender, int result );
    
        function test(int multiplier) {
            _multiplier = multiplier;
        }
    
        function multiply(int a) returns (int r) {
           r = a * _multiplier;
           Multiplied(a, msg.sender, r);
           return r;
        }
     }
    

    智能合约现在是一个Multiplied事件。该事件将在日志中存储原始参数包括asender的地址和结果result。参数asender的地址都被编入索引,因此我们可以使用主题topic为这两个创建特定的过滤器filter

    部署合约

    我们可以按如下方式部署合约:

        var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
        var password = "password";
    
        var abi = @"[{'constant':false,'inputs':[{'name':'a','type':'int256'}],'name':'multiply','outputs':[{'name':'r','type':'int256'}],'type':'function'},{'inputs':[{'name':'multiplier','type':'int256'}],'type':'constructor'},{'anonymous':false,'inputs':[{'indexed':true,'name':'a','type':'int256'},{'indexed':true,'name':'sender','type':'address'},{'indexed':false,'name':'result','type':'int256'}],'name':'Multiplied','type':'event'}]";
    
        var byteCode = "0x6060604052604051602080610104833981016040528080519060200190919050505b806000600050819055505b5060ca8061003a6000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480631df4f144146037576035565b005b604b60048080359060200190919050506061565b6040518082815260200191505060405180910390f35b60006000600050548202905080503373ffffffffffffffffffffffffffffffffffffffff16827f841774c8b4d8511a3974d7040b5bc3c603d304c926ad25d168dacd04e25c4bed836040518082815260200191505060405180910390a380905060c5565b91905056";
    
        var multiplier = 7;
    
        var web3 = new Web3.Web3();
    
        var unlockResult = await web3.Personal.UnlockAccount.SendRequestAsync(senderAddress, password, new HexBigInteger(120));
        Assert.True(unlockResult);
    
        var transactionHash = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), multiplier);
        var receipt = await MineAndGetReceiptAsync(web3, transactionHash);
    

    multiply乘法交易

    这是在智能合约状态下执行的,或者我们正在执行操作(如乘法),调用不是通过区块链一致性验证的交易。

    提交交易以在智能合约中执行功能操作不会返回结果,我们可以通过使用函数调用来检查智能合约的条件。

        var contractAddress = receipt.ContractAddress;  
    
        var contract = web3.Eth.GetContract(abi, contractAddress);
    
        var multiplyFunction = contract.GetFunction("multiply");
    
        transactionHash = await multiplyFunction.SendTransactionAsync(senderAddress, 7);
        transactionHash = await multiplyFunction.SendTransactionAsync(senderAddress, 8);
    
        receipt = await MineAndGetReceiptAsync(web3, transactionHash);
    

    使用部署交易的合同地址,我们可以创建合约对象的实例和函数“multiply”。

    函数对象以与调用相同的方式简化提交交易。根据上面的例子,我们只需要包含“senderAddress”,其将与操作相关的gas及函数的参数操作一起缴费。

    还可以选择指定gas或以太币值作为交易的一部分。

    在示例中,我们提交了2个交易来执行7和8的乘法,并在我们的私有测试链上等待交易被挖掘。

    事件,过滤器和主题

    创建事件和过滤器

    事件被定义为abi的一部分,类似于我们可以使用合约实例获取事件的函数。

    var multiplyEvent = contract.GetEvent("Multiplied");
    

    事件对象允许创建create以查询存储在日志中的信息。

    我们可以创建查询所有事件日志的过滤器。

    var filterAll = await multiplyEvent.CreateFilterAsync();
    

    或者指定一个主题。

    var filter7 = await multiplyEvent.CreateFilterAsync(7);
    

    在上面的例子中,我们查询了参数为7的日志,因为这个输入参数被标记为索引,我们可以过滤该主题。

    我们使用发件人地址作为过滤器,因为它也被标记为索引,但如果我们想要过滤该特定主题,我们将在创建过滤器时第二个参数。

    var filterSender = await multiplyEvent.CreateFilterAsync(null, senderAddress);
    

    DTO事件

    事件数据传输对象将所有事件参数解码为传输对象,其方式与我们将Json对象反序列化的方式类似。

     public class MultipliedEvent
     {
        [Parameter("int", "a", 1, true)]
        public int MultiplicationInput {get; set;}
    
        [Parameter("address", "sender", 2, true)]
        public string Sender {get; set;}
    
        [Parameter("int", "result", 3, false)]
        public int Result {get; set;}
    
     }
    

    在上面的示例中,MultipliedEvent属性已使用自定义参数属性mapped到事件参数。

    每个参数都指定原始类型,名称,顺序以及它是否被索引。我们可以看到地址的类型被解码为字符串,在我们的场景中,我们可以安全地将int256解码为int32,但如果不知道最终类型BigInteger将是一个更好的选择。

    查询事件和日志

    使用我们已经创建的过滤器,我们可以查询日志和事件。

     var log = await multiplyEvent.GetFilterChanges<MultipliedEvent>(filterAll);
     var log7 = await multiplyEvent.GetFilterChanges<MultipliedEvent>(filter7);
    

    上面我们使用GetFilterChanges,这可用于查询过滤符合我们条件的,已创建或自上次我们尝试获取更改以来的任何日志。

    参数将用于使用GetAllChangesFilterInput

    最后

    所有的源代码都可以Tutorials solution找到。

    如果你想马上使用c#开发以太坊dapp,可以学习下面的教程:

    C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。

    这里是原文

    转载于:https://my.oschina.net/u/2472105/blog/1933846

    展开全文
  • 以太坊部署调用合约

    2018-10-27 21:42:29
    在自己的电脑上安装配置以太坊开发环境,搭建以太坊私有链,编写一个简单的智能合约,通过以太坊JSON RPC 和JavaScript API编程接口将其部署到所创建的以太坊私有链,并可调用合约获得正确的合约执行结果。...

    以太坊实验

    在自己的电脑上安装配置以太坊开发环境,搭建以太坊私有链,编写一个简单的智能合约,通过以太坊JSON RPC	和JavaScript API编程接口将其部署到所创建的以太坊私有链,并可调用合约获得正确的合约执行结果。
    本次作业的最终提交物是一个描述上述过程的完整文档,请把整个过程用文字和截图描述清楚。
    
    • 本机已经安装go
    • 安装以太坊Ethereum
    brew update
    brew upgrade
    brew tap ethereum/ethereum
    brew install ethereum
    
    • 安装solc编译器
    npm install solc
    
    • 创建账户
    geth account new
    
    • 编写创始块文件
    {
        "config": {
            "chainId": 10, 
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        },  
        "nonce": "0x0000000000000042",
        "difficulty": "0x1",
        "alloc": {
                "14b1d82b1c851ea9a6623a20d9865677ecdac70c":{
                "balance": "20000009800000000000000000000"
            },  
                "aa25a7b683fe0564fe6b2a2574e10dc886ecb3ce":{
                "balance": "20000009800000000000000000000"
            }   
        },  
        "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "coinbase": "0x0000000000000000000000000000000000000000",
        "timestamp": "0x00",
        "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
        "gasLimit": "0xb2d05e00"
    }
    
    • 配置自动解锁账户的脚本

      在~/Library/Ethereum下创建password文件内容为创建账户的密码
      
    • 编写启动脚本

    #!/bin/bash
    geth --rpc --rpcaddr="0.0.0.0"  --rpcport "8545" --rpccorsdomain="*" --unlock '0,1' --password ~/Library/Ethereum/password --nodiscover --maxpeers '5' --n    etworkid '123' --datadir '~/Library/Ethereum' console --rpcapi "db,eth,net,web3,personal,admin,miner"
    
    • 启动网络
    ./start.sh
    
    • 通过JRPC与网络交互(均编写在脚本中,方便下次使用)
    curl -X POST  -H "Content-Type: application/json"   --data 
    '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x14b1d82b1c851ea9a6623a20d9865677ecdac7    0c","latest"],"id":1}' http://0.0.0.0:8545
    
    • 返回的结果
    localhost:eth liu$ ./curlexample.sh 
    {"jsonrpc":"2.0","id":1,"result":"0x409f9fadbc2695e2f02d4a82"}
    
    • 测试合约,后续需需要通过event的返回log的方式查看调用结果信息
    localhost:eth liu$ cat Hello.sol 
    pragma solidity ^0.4.17;
    
    contract Hello {
    
    event Print(uint);
    function multiply(uint input)public returns (uint) {
    emit Print(input * 7);
    return input * 7;
    }
      //print name
      function print(string name) public pure returns (string) {
        return name;
      }
    }
    
    • solc编译合约,出现问题,但不影响后续的操作
    localhost:eth liu$ solc Hello.sol 
    (node:1915) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
    (node:1915) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
    localhost:eth liu$ cat contracts/Hello.sol\:Hello.bin 
    608060405234801561001057600080fd5b506101f1806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806311114af114610051578063c6888fa114610133575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610174565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f85780820151818401526020810190506100dd565b50505050905090810190601f1680156101255780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013f57600080fd5b5061015e6004803603810190808035906020019092919050505061017e565b6040518082815260200191505060405180910390f35b6060819050919050565b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a72305820b7dcf3ffc23d38b70328fb068693613965fa00a36d684661ae2f53df694f1e570029
    localhost:eth liu$ 
    localhost:eth liu$ cat contracts/Hello.sol\:Hello.abi 
    [{"constant":true,"inputs":[{"name":"name","type":"string"}],"name":"print","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"input","type":"uint256"}],"name":"multiply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"}],"name":"Print","type":"event"}]localhost:eth liu$ 
    
    • 部署调用合约
    localhost:eth liu$ cat  curlsend.sh 
    #!/bin/bash
    curl -X POST -H "Content-Type: application/json"  --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{
      "from": "0x14b1d82b1c851ea9a6623a20d9865677ecdac70c",
      "gas": "0x76c000", 
      "data": "0x608060405234801561001057600080fd5b506101f1806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806311114af114610051578063c6888fa114610133575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610174565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f85780820151818401526020810190506100dd565b50505050905090810190601f1680156101255780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013f57600080fd5b5061015e6004803603810190808035906020019092919050505061017e565b6040518082815260200191505060405180910390f35b6060819050919050565b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a72305820b7dcf3ffc23d38b70328fb068693613965fa00a36d684661ae2f53df694f1e570029"
     }],"id":1}' http://0.0.0.0:8545
    localhost:eth liu$ 
    
    • 调用
    localhost:eth liu$ ./curlsend.sh 
    {"jsonrpc":"2.0","id":1,"result":"0x649cddcacd03f12d860a37b21b47af0ec90375e2eed81c132dc8d451bb09c8e2"}
    
    • geth客户端,产生提交的合约地址,后续调用合约要用

      合约地址0x234C5DB1913e7a046387222eF3960576D22A90c3
      
    > INFO [10-27|21:15:22.779] Submitted contract creation              fullhash=0x994e4af5dee931bdec20c422c06b9c58e11a2aa22377b704ea4cb669b230e0ce contract=0x234C5DB1913e7a046387222eF3960576D22A90c3
    > txpool.status
    {
      pending: 1,
      queued: 0
    }
    > 
    
    • 启动挖矿,确认交易
    > miner.start()
    > txpool.status
    {
      pending: 0,
      queued: 0
    }
    
    • 调用合约,脚本中to对应的value为合约地址,获得交易的hash值,需要挖矿确认交易

    合约地址:0x234C5DB1913e7a046387222eF3960576D22A90c3

    • 调用脚本中的data,为调用合约的签名信息(hash值),

      web3.sha3("multiply(uint256)").substring(0, 8)确定前4字节的数据:0xc6888f
      接着需要输入4字节的输入参数数据,假设传入6对应uint256数据为
      0000000000000000000000000000000000000000000000000000000000000006
      两组hash值拼接即为data数据
      
    localhost:eth liu$ cat curlcall.sh 
    #!/bin/bash
    curl -X POST -H "Content-Type: application/json"  --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{
      "from": "0x14b1d82b1c851ea9a6623a20d9865677ecdac70c",
      "to": "0x234C5DB1913e7a046387222eF3960576D22A90c3",
      "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"
     }],"id":1}' http://0.0.0.0:8545
    
    localhost:eth liu$ ./curlcall.sh 
    {"jsonrpc":"2.0","id":1,"result":"0x85dae51f6a405c049c63354f210fd718a043612a2695a65145feaeedac7dec22"}
    
    • 通过交易的hash值获取交易信息

      交易的hash值:
      0x85dae51f6a405c049c63354f210fd718a043612a2695a65145feaeedac7dec22
      
    localhost:eth liu$ cat curlget.sh 
    #!/bin/bash
    curl -X POST -H "Content-Type: application/json"  --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":[
     "0x85dae51f6a405c049c63354f210fd718a043612a2695a65145feaeedac7dec22"
    ],"id":1}' http://0.0.0.0:8545
    localhost:eth liu$ 
    
    • 查看交易,从logs.data中可以看到结果,该log是通过event的方式返回42(6*7)

      0x000000000000000000000000000000000000000000000000000000000000002a
      
    localhost:eth liu$ ./curlget.sh 
    {"jsonrpc":"2.0","id":1,"result":{"blockHash":"0x40b0928fee368e94adfecb3b33d0e29b12a36e5a525e203fd1b4ae2da58ed19e","blockNumber":"0x3ab","contractAddress":null,"cumulativeGasUsed":"0x592a","from":"0x14b1d82b1c851ea9a6623a20d9865677ecdac70c","gasUsed":"0x592a","logs":[{"address":"0x234c5db1913e7a046387222ef3960576d22a90c3","topics":["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],"data":"0x000000000000000000000000000000000000000000000000000000000000002a","blockNumber":"0x3ab","transactionHash":"0x85dae51f6a405c049c63354f210fd718a043612a2695a65145feaeedac7dec22","transactionIndex":"0x0","blockHash":"0x40b0928fee368e94adfecb3b33d0e29b12a36e5a525e203fd1b4ae2da58ed19e","logIndex":"0x0","removed":false}],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000200000000000000000000000002000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","root":"0x00ad10c4db648a69a37fdf87d3cdc29228807e00d9cd7d5d30b957f6303f2e27","to":"0x234c5db1913e7a046387222ef3960576d22a90c3","transactionHash":"0x85dae51f6a405c049c63354f210fd718a043612a2695a65145feaeedac7dec22","transactionIndex":"0x0"}}
    localhost:eth liu$ 
    
    • 在实验中发现,一些因版本更新造成API发生变化的问题,以及solidity部分语法变化。
    展开全文
  • 在DEFI数据分析应用中通常需要获取大量...MakeDAO的Multicall就是解决这一问题的最佳方案,它包含 链上合约与链下NPM包两个部分,可以将多个针对以太坊区块链查询请求合并为一个,从而有效缩短响应时间并降低et...
  • 首先使用npm下载solc npm install -g solc 这个主要是编译solidity文件生成对应的ABI和ABI BIN。如果使用这个需要到remix上面生成。 pragma solidity ^0.6.0; library SafeMath { function sub(uint256 a, uint...
  • 以太坊合约调用和交易执行

    千次阅读 2018-08-28 16:19:09
    合约部署到以太坊的区块链上后,是为了让用户调用和执行的。与合约创建一样,合约的执行也是由交易驱动的,如图: 对于驱动合约执行的交易,有几个关键点: 1、合约在创建时,会生成一个合约地址,所以,通过...
  • eth 以太坊合约之间相互调用

    千次阅读 2018-10-30 09:01:29
    准备: remix ...demo1.sol pragma solidity ^0.4.25;... * 有所有人的合约 * 所有权限管理都在这里定义 * event OwnershipTransferred(address, address) * modifier onlyOwner() */ contract ...
  • 四、调用无参数有返回值的合约方法 contract.method(function(error, result){ if(!error){ console.log(result) } }) 五、调用有参数有无返回值的合约方法 contract.setInfo(par1, par2, function...
  • 以太坊RPC调用智能合约

    千次阅读 2018-09-10 20:09:53
    1、 调用RPC接口 # 查看账户信息 curl -X POST -H "Content-Type":application/json --data '{"jsonrpc":"2.0", "method":"eth_accounts","params":[],"id":67}' 172.25.0.10:8545 # 查看账户余额 ...
  • 以太坊发布合约调用合约

    千次阅读 2018-07-26 14:00:26
    需要几个工具 MetaMask 一个轻钱包,至于如何安装网上一大把教程,我安装的是Chrome插件,安装好之后可以看到一个小狐狸的图标,然后点开: ... ...solidity IDE工具,...以太坊测试网络 直接在主网部署合约和调...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 755
精华内容 302
关键字:

以太坊合约调用