精华内容
下载资源
问答
  • 今天在技术群里跟大家做技术交流,发现还是有很多人还是对以太坊的智能合约调用关系不是很清楚。所以我打算专门写一篇博文来说一下这个问题。 直接上代码: 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的账户地址转出来的。

    展开全文
  • 首先使用npm下载solc npm install -g solc 这个主要是编译solidity文件生成对应的ABI和ABI BIN。如果使用这个需要到remix上面生成。 pragma solidity ^0.6.0; library SafeMath { function sub(uint256 a, uint...
  • (六)以太坊开发,合约之间调用

    千次阅读 2018-07-03 09:36:22
    1、代码 pragma solidity ^0.4.0; contract D { uint public x; uint public amount; ... function D(uint _a) payable{ ...2、创建合约E,并且存入100ETHER 3、执行合约E的creat D函数 ...扣除E合约相应以太
    1、代码
    
    pragma solidity ^0.4.0;
    
    contract D {
        uint public x;
        uint public amount;
        
        
        function D(uint _a) payable{
            x = _a;
            amount = msg.value;
        } 
    }
    
    
    contract E {
        event e(uint x,uint amount);
        
        D d = new D(4);
        
        function E(uint _u) payable{
            e(d.x(),d.amount());
            D d1 = new D(_u);
            e(d1.x(),d1.amount());
        }
        
        function creatD(uint _x,uint _amount){
            D d2 = (new D).value(_amount)(_x);
            e(d2.x(),d2.amount());
        }
    }

    2、创建合约E,并且存入100ETHER

    3、执行合约E的creat D函数


    4、查看合约事件


    5、执行成功,扣除E合约相应以太币


    展开全文
  • eth 以太坊合约之间相互调用

    千次阅读 2018-10-30 09:01:29
    准备: remix ...demo1.sol pragma solidity ^0.4.25;... * 有所有人的合约 * 所有权限管理都在这里定义 * event OwnershipTransferred(address, address) * modifier onlyOwner() */ contract ...

    准备:
    remix

    说明: demo1.sol 和 demo02.sol 使用相同账户进行部署

    demo1.sol

    pragma solidity ^0.4.25;
    
    /**
     * 有所有人的合约
     * 所有权限管理都在这里定义
     * event	OwnershipTransferred(address, address)
     * modifier	onlyOwner()
     */
    contract Ownable {
        
    	address public owner;
    
    	constructor () public {
    		owner = msg.sender;
    	}
    
    	/**
    	 * 判断当前用户是否是合约所有人
    	 */
    	modifier onlyOwner () {
    		require(msg.sender == owner);
    		_;
    	}
    }
    
    
    contract demo1 is Ownable {
        
        event test(address a);
        
        function test01() public  onlyOwner returns(uint256)  {
            
            emit test(msg.sender);
            return 2;
        }
        
        function test02() public returns(uint256) {
            return 100;
        }
    }
    

    demo1.sol 编译

    from:0xca3...a733c, to:demo1.(constructor), value:0 wei, data:0x608...00029, 0 logs, hash:0x26e...49872
     status 	0x1 Transaction mined and execution succeed
     contractAddress 	0xde6a66562c299052b1cfd24abc1dc639d429e1d6
     from 	0xca35b7d915458ef540ade6068dfe2f44e8fa733c
     to 	demo1.(constructor)
     gas 	300000000 gas
            
     transaction cost 	223805 gas 
     execution cost 	131201 gas 
     hash 	0x26ef317470455cf2d7896a368457d8c81616eb5b414a74bd06da31dd74c49872
     input 	0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061022a806100536000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631b18f9521461005c578063671c7d68146100875780638da5cb5b146100b2575b600080fd5b34801561006857600080fd5b50610071610109565b6040518082815260200191505060405180910390f35b34801561009357600080fd5b5061009c6101d0565b6040518082815260200191505060405180910390f35b3480156100be57600080fd5b506100c76101d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561016657600080fd5b7fbb29998e780fd657e5ebd4526fde6268a7318596399e4e76708e80a468c28fd633604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16002905090565b60006064905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820efa3ff9395f1d21b08cda2313eae24568f4bbf49fe1c1b7d5d9bb9deeddde5e00029
     decoded input 	{}
     decoded output 	 - 
     logs 	[]
     value 	0 wei
    

    contractAddress 0xde6a66562c299052b1cfd24abc1dc639d429e1d6 这个是我们另一个合约需要的

    demo2.sol

    pragma solidity ^0.4.25;
    
    
    /**
     * 有所有人的合约
     * 所有权限管理都在这里定义
     */
    contract Ownable {
    	address public owner;
    
    	constructor () public {
    		owner = msg.sender;
    	}
    
    	/**
    	 * 判断当前用户是否是合约所有人
    	 */
    	modifier onlyOwner () {
    		require(msg.sender == owner);
    		_;
    	}
    }
    
    contract FountainTokenInterface is Ownable {
        
        function test01() public  onlyOwner returns(uint256);
        function test02() public returns(uint256);
    }
    
    
    contract demo2 is Ownable {
       FountainTokenInterface fountain = FountainTokenInterface(0xde6a66562c299052b1cfd24abc1dc639d429e1d6);
       
       function test03()  public returns(uint256)  {
           uint256 tt = fountain.test01();
           return tt + 100;
       }
       
       function test04()  public returns(uint256)  {
           uint256 tt = fountain.test02();
           return tt +200;
       }
        
    }
    

    demo2.sol 编译

    creation of demo2 pending...
    [vm] from:0xca3...a733c, to:demo2.(constructor), value:0 wei, data:0x608...80029, 0 logs, hash:0x336...c26eb
     status 	0x1 Transaction mined and execution succeed
     contractAddress 	0x1526613135cbe54ee257c11dd17254328a774f4a
     from 	0xca35b7d915458ef540ade6068dfe2f44e8fa733c
     to 	demo2.(constructor)
     gas 	300000000 gas
            
     transaction cost 	301217 gas 
     execution cost 	193105 gas 
     hash 	0x336a770173b5ece478e595499cecc372d7a1f58065ce7b7c0cf0c9f1c31c26eb
     input 	0x608060405273de6a66562c299052b1cfd24abc1dc639d429e1d6600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102fa806100a86000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b1461005c578063a67d1a55146100b3578063bee82aae146100de575b600080fd5b34801561006857600080fd5b50610071610109565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100bf57600080fd5b506100c861012e565b6040518082815260200191505060405180910390f35b3480156100ea57600080fd5b506100f36101fe565b6040518082815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663671c7d686040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156101b757600080fd5b505af11580156101cb573d6000803e3d6000fd5b505050506040513d60208110156101e157600080fd5b8101908080519060200190929190505050905060c8810191505090565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631b18f9526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561028757600080fd5b505af115801561029b573d6000803e3d6000fd5b505050506040513d60208110156102b157600080fd5b8101908080519060200190929190505050905060648101915050905600a165627a7a72305820b72f21fe3b8a58099688a2bb6c125183097f076c2328e2cb87db4fe71b7cdeb80029
     decoded input 	{}
     decoded output 	 - 
     logs 	[]
     value 	0 wei
            
    

    调用test04:
    [vm] from:0xca3…a733c, to:demo2.test04() 0x152…74f4a, value:0 wei, data:0xa67…d1a55, 0 logs, hash:0xbab…4b92e

     status 	0x1 Transaction mined and execution succeed
     from 	0xca35b7d915458ef540ade6068dfe2f44e8fa733c
     to 	demo2.test04() 0x1526613135cbe54ee257c11dd17254328a774f4a
     gas 	300000000 gas
            
     transaction cost 	23586 gas 
     execution cost 	2314 gas 
     hash 	0xbaba194b9d0bb19d1198ea010302fe4b8ba4b9a07f0683f59eaf1281d084b92e
     input 	0xa67d1a55
     decoded input 	{}
     decoded output 	{
    	"0": "uint256: 300"
    }
     logs 	[]
     value 	0 wei
    

    调用test03
    from:0xca3…a733c, to:demo2.test03() 0x152…74f4a, value:0 wei, data:0xbee…82aae, 0 logs, hash:0x6cf…03b5d

    transact to demo2.test03 errored: VM error: revert.
    revert	The transaction has been reverted to the initial state.
    Note: The constructor should be payable if you send value.	Debug the transaction to get more information
    
    展开全文
  • 以太坊合约调用和交易执行

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

    合约部署到以太坊的区块链上后,是为了让用户调用和执行的。与合约创建一样,合约的执行也是由交易驱动的,如图:
    这里写图片描述

    对于驱动合约执行的交易,有几个关键点:

    1、合约在创建时,会生成一个合约地址,所以,通过交易调用合约的时候,就以合约地址为目的地址;

    2、在交易的data域,会标明要调用合约的哪个函数,并且提供了该函数所需要的参数;

    3、调用合约的交易,同样可以发送一笔以太币给合约,金额在value字段显示;

    然后,我们再看看一笔交易(不光是合约执行的交易,指所有交易)发出去后,到底是怎么执行的。

    1、交易向以太坊全网广播;

    2、其他节点收到这笔交易后,会检查几个方面,以确认这笔交易是否有效:

    1)交易数据都需要RLP编码,所以首先检查它是不是正确格式化的RLP;

    2)验证签名是否有效;

    3)检查交易序号nonce是否等于发送账户的nonce;

    4)检查交易的gaLimit设置是否符合要求,它一定要大于等于以下几项之和(gas最小值):a、最小值21,000gas;b、与发送代码和数据长度相关的gas费用:值为0的字节,每字节费用为4gas,每个非零字节为68gas;c、如果交易用于合约创建,还需要额外的32,000gas;

    5)检查发送者账户的余额是否足够支付所设置的gas;

    3、验证通过后,矿工从发送者的余额中扣除gas最小值,将发送者账户中的nonce加1,表示这个账户又多发起了一笔交易;

    4、如有代码调用(其实合约创建和合约调用都需要执行代码,合约创建会启动一个合约创建函数),代码会送到EVM虚拟机执行,并在整个执行过程中,以太坊会一直保持跟踪以下几项:

    1)自毁集:需要删除的账户;

    2)日志系列:虚拟机代码执行的归档和检查点;

    3)退款余额:交易完成后要退给发送账户的以太币。为什么还有钱退?因为以太坊中的永续存储需要费用,所以同样地,如果该交易释放了一些存储也会有退款;

    5、代码执行完毕后,如果一切正常,会打包到区块(跟比特币一样,以太坊也是POW挖矿模式,所以以上几步虽然所有节点都在进行,但最后只有在POW竞争中获胜的节点所打包的区块才会广播到全网,并被其他节点验证后认可,其他节点做的操作也和打包的矿工一样,验证交易是否有效,然后也在自己的EVM上跑代码,看看得出的结果是不是一致);

    6、 根据交易结果,整个以太坊网络刷新账户状态,当然,具体完成得靠每个节点在自己机器上同步刷新;

    好了,以太坊的账户和交易就讲到这里了,明天我们来看看以太坊的区块长什么样,因为账户和交易最终都是“存储”到区块里的。

    展开全文
  •     在以太坊中,若需要合约合约之间的调用,则可以使用call、callcode和delegatecall方法,它们之间的联系如下: 调用方式 修改storage 调用者的msg.sender 被调用的msg.sender 执行的上下文 推荐 call ...
  • 文章目录一、智能合约概述1.1 智能合约是什么1.2 solidity语言二、外部账户调用智能合约三、一个合约调用另一个合约3.1 直接调用3.2 使用address类型的call()函数3.3 代理调用delegatecall()函数3.4 payable3.5 ...
  • 四、调用无参数有返回值的合约方法 contract.method(function(error, result){ if(!error){ console.log(result) } }) 五、调用有参数有无返回值的合约方法 contract.setInfo(par1, par2, function...
  • 以太坊部署调用合约

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

    千次阅读 2018-07-26 14:00:26
    需要几个工具 MetaMask 一个轻钱包,至于如何安装网上一大把教程,我安装的是Chrome插件,安装好之后可以看到一个小狐狸的图标,然后点开: ... ...solidity IDE工具,...以太坊测试网络 直接在主网部署合约和调...
  • 1.通过在线IDE并使用Solidity语言进行一个简单智能合约的编写与编译 https://chriseth.github.io/browser-solidity pragma solidity ^0.4.18; contract helloworld { uint data; function set(uint x) { data =...
  • 以太坊智能合约之间的调用

    千次阅读 2019-06-22 19:11:10
    已经有一个代币合约如C,需要实现一个合约,在这个合约调用代币合约C中的transfer函数,即转代币的函数。 要在一个合约调用另一个合约,可用用以下三种方式调用。 CALL:最常用调用,内置变量msg的值会被修改为...
  • java调用以太坊私链上的合约方法

    千次阅读 2020-07-10 22:46:01
    使用 java调用以太坊私链上的合约方法 引入java依赖 pom <!--web3j--> <dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>3.4.0&...
  • 以太坊合约生成java代码过程,以及常见问题,web3j, solitidy
  • 开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI。本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI? 数字猫合约 ABI ABI(Application ...
  • <p>I've tried to follow the <a href="https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts" rel="nofollow noreferrer">go-ethereum guide for this</a> but it ...
  • 文章目录一、安装Web3.js二、连接geth节点三、编写和编译智能合约四、发布智能合约五、调用智能合约六、自动编译智能合约 一、安装Web3.js   Web3.js是一套用Javascript实现的API,用于与以太坊节点进行通信,并...
  • 用golang可以开发程序和以太坊智能合约进行交互,只是需要一些额外的步骤。 首先需要智能合约源码,其次需要abigen这个程序,这个程序可以通过编译go-ethereum程序得到。 在windows下通过把go-ethereum源码下载...
  • 以太坊底层通过EVM模块支持合约的执行与调用调用时根据合约地址获取到代码,生成环境后载入到EVM中运行。通常智能合约的开发流程是用solidlity编写逻辑代码,再通过编译器编译元数据,最后再发布到以太坊上。 ...
  • Flutter和以太坊智能合约 通过web3dart软件包与以太坊智能合约进行交互的Flutter应用程序示例。 入门 该项目假定您的Flutter安装至少已升级到2.0版,以便能够在移动平台(Android和iOS),Web(Chrome)和台式机(在...
  • rpc接口调用以太坊智能合约 传送门: 柏链项目学院   在以太坊摸爬滚打有些日子了,也遇到了各种各样的问题。这几天主要研究了一下如何通过rpc接口编译、部署和调用合约。也遇到了一些困难和问题,下面将向大家...
  • 转载请注明出处:... 目录 1.在合约调用指定地址的另一已部署合约 后面的讲解已在下面的在线IDE中验证过: https://remix.ethereum.org/#optimize=false&version=soljson-v0.4.25+commit.59db...
  • 在这篇文章中,我将给出一个简单但有希望有效的演示,说明JavaScript开发人员如何创建一个能够调用智能合约的网页,并通过单击即可向其汇款(以太币)。 要做到这一点,用户将需要使用支持Web3的浏览器,因此可以...
  • 以太坊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 # 查看账户余额 ...
  • 函数调用一般分外部调用和内部调用两种, 外部调用是通过JSON-RPC接口实现对合约函数的调用, 有3种调用方式: testInstance.testFunc.sendTransaction(); testInstance.testFunc(); testInstance.testFunc.call(); ...
  • 以太坊智能合约有各种各样的用例,但到目前为止,从你的iOS应用程序中调用它们非常困难。不过如果使用以太坊iOS开发套件和EtherKit,这种情况会改善很多,你可以立即开始使用。在本教程结束时,你将能够调用其ABI...
  • 以太坊智能合约中的IPFS 这是一个简单的博客应用程序,是将以太坊的智能合约连接到IPFS上存储的JSON数据库的概念证明。 通信基于服务。 怎么跑? 准备博客合同 首先,您必须部署合同。 这是一个如何通过节点部署到...
  • 以太坊合约的简单ABI编码/解码。 安装 通过Node上的npm: npm install simpleabi 用法 待定 参考 样品 待定 版本号 0.0.1 0.0.2,将值解码为安全整数 0.0.3,解码布尔值类型 0.0.4,使用类型编码,编码调用 0.0.5...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,649
精华内容 3,859
关键字:

以太坊合约调用