精华内容
下载资源
问答
  • 智能合约之间调用msg.sender解析

    千次阅读 2020-05-14 10:49:55
    msg.sender在构造函数中: //构造函数 constructor() public { owner = msg.sender; } function increse(address receiver, uint amount) public{ ...在构造函数中,msg.sender等于部署该合约的地址; ...

     

    msg.sender在构造函数中:

    //构造函数
    constructor() public {
        owner = msg.sender;
    }
    
    function increse(address receiver, uint amount) public{
        require( owner == receiver);
        balances[receiver] += amount;
    }
    

    在构造函数中,msg.sender等于部署该合约的地址;

    展开全文
  • solidity 智能合约之间调用

    千次阅读 2019-07-30 15:43:34
    智能合约之间调用 在区块链上,有些功能往往无法通过一个智能合约完成,此时便会用到智能合约之间调用。本篇文章带大家通过具体示例来了解一下智能合约之间调用。 在智能合约的编译过程中,有两种情况:调用者...

    智能合约之间的调用

    在区块链上,有些功能往往无法通过一个智能合约完成,此时便会用到智能合约之间的调用。本篇文章带大家通过具体示例来了解一下智能合约之间的调用。

    在智能合约的编译过程中,有两种情况:调用者和被调用者在一个sol文件中和分别在不同的文件中。

    同sol文件的智能合约调用

    在下面的智能合约中,Demo1和Demo在同一个文件中,可进行同时编译,然后逐个发布。

    pragma solidity ^0.5.10;
    
    contract Demo1{
        
        uint public data;
        
        function setData(uint _data) public {
            data = _data;
        }
    }
    
    contract Demo2{
        function toSetData(Demo1 demo1,uint _data) public {
            demo1.setData(_data);
        }
    }
    

    当发布完成,可通过第Demo2的toSetData方法进行Demo1方法的调用。传递的第一个参数为Demo1的智能合约地址,第二个参数为要设置的值。

    不同sol文件的智能合约调用

    在大多数情况下,两个智能合约不存在于同一个sol文件中,那么就需要使用另外一种形式来进行调用。还拿调用Demo1方法来举例,用另外一个sol文件中的Demo3来调用Demo1。

    首先需要声明接口,然后在Demo3中直接调用对应的接口。

    pragma solidity ^0.5.10;
    
    contract Demo1{
        function setData(uint _data) public;
    }
    
    contract Demo3{
        function toSetData(Demo1 demo1,uint _data) public {
            demo1.setData(_data);
        }
    }
    

    调用接口是传递的参数依旧同第一种情况。

    原文链接:https://www.choupangxia.com/2019/07/30/solidity-智能合约之间的调用/


    程序新视界

    关注程序员的职场生涯,大量优质学习资源、技术文章分享

    csdn-微信公众号

    展开全文
  • 智能合约内部调用另一个智能合约

    千次阅读 2018-10-16 19:11:18
    最近在看以太坊,顺便记录一下,这篇文章的目的是一个智能合约调用另一个智能合约的方法,写个demo记录一下 pragma solidity ^0.4.18; contract DataContract { mapping (address => uint256) public ...

    最近在看以太坊,顺便记录一下,这篇文章的目的是一个智能合约调用另一个智能合约的方法,写个demo记录一下

    pragma solidity ^0.4.18;
    
    contract DataContract {
        mapping (address => uint256) public balanceOf;
    
        function setBlance(address _address, uint256 v) public  {
            balanceOf[_address] = v;
        }
    
    }
    
    contract ControlContract {
        mapping (address => uint256) public tmp;
        DataContract dataContract;
    
        function ControlContract(address _dataContractAddr) public {
            dataContract = DataContract(_dataContractAddr);
        }
    
        function set(uint256 value) public {
            dataContract.setBlance(msg.sender, value);
            tmp[msg.sender] = value + 10;
        }
    }
    

     

    说明 DataContract合约提供了一个公共方法setBalance, ControlContract合约中会调用set方法来更新自己与DataContract保存的数据。

    首先部署DataContract合约,然后部署ControlContract合约,在创建的时候需要指定DataContract合约地址。

    首先调用set方法

    发送成功后就可以查看了

    至此一个合约调用另一个合约可以实现

    展开全文
  • 以太坊智能合约之间调用

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

    最近有个新的需求
    已经有一个代币合约如C,需要实现一个合约,在这个合约中调用代币合约C中的transfer函数,即转代币的函数。

    要在一个合约中调用另一个合约,可用用以下三种方式调用。

    • CALL:最常用调用,内置变量msg的值会被修改为调用者,执行环境为被调用者的运行环境。
    • DELEGATECALL:调用后内置变量msg的值不会修改为调用者,但执行环境为调用者的运行环境。
    • CALLCODE和DELEGATECALL: 是在调用者的上下文中执行, 可以修改调用者的storage; CALLCODE 阻止msg.sender和msg.value传递;
      而DELEGATECALL不阻止;

    在A的合约中,B.callcode(c的函数): c看到msg.sender是B;
    在A的合约中,B.delegatecall(c的函数): c看到msg.sender是A;

    可以看到,这三种方式都并不符合我们的需求。
    方法只有,先让用户调用代币合约C中的approve方法,再调用下面实现的合约中的depositToken方法。
    pragma solidity ^0.4.25;

    contract Deposit {
        
        bool public stopped = false;
        uint256 public totalDeposit=0;
        uint256 minDepositValue;
        address owner;
        address cTokenAddr=0x01c2ce7bd1bc34eed8a99d0ea0abee305362c143;
        uint256 minBlockGap;
        mapping(address => mapping(string=>uint256))  depositRecords;
        mapping(address=>mapping(string=>uint256))  withdrawRecords;
        uint256 public account=0;
        
        uint256 public blocknum ;
       
        constructor(uint256 _minValue,uint256 _minBlockGap) public {
            owner=msg.sender;
            minDepositValue=_minValue;
            minBlockGap=_minBlockGap;
        }
        
        event Withdraw(address indexed _from, string indexed _pk, uint indexed _value);
        event DepositToken(address indexed _from,address indexed _to,uint256 indexed _value);
    
    
        function depositToken(address _to,uint256 _value,string pk) public isRunning  validAddress returns (bool sucess) {
            require(_value>minDepositValue);
            bytes4 transferFromMethodId = bytes4(keccak256("transferFrom(address,address,uint256)"));
            if(cTokenAddr.call(transferFromMethodId,msg.sender,_to, _value)){
                 depositRecords[msg.sender][pk]+=_value;
                 totalDeposit+=_value;
                 emit DepositToken(msg.sender,_to,_value);
                 return true;
            }
            return false;
        }
        
        function setMinBlockGap(uint256 _blockGap) public onlyOwner {
            minBlockGap=_blockGap;
        }
    
        function withdraw(uint256 _value,string _pk) public onlyOwner isRunning  validAddress returns (bool sucess) {
            require(depositRecords[msg.sender][_pk]>_value);
            uint256 blockNumGap=getBlockNumGap(_pk);
            if(blockNumGap<minBlockGap)
                 return false;
                 
            bytes4 transferMethodId = bytes4(keccak256("transfer(address,uint256)"));
            if(cTokenAddr.call(transferMethodId,msg.sender, _value)){
                depositRecords[msg.sender][_pk]-=_value;
                withdrawRecords[msg.sender][_pk]=0;
                totalDeposit-=_value;
                emit Withdraw(msg.sender,_pk,_value);
                return true;
            }
            return false;
        }
    
      
        
        function getDeposit(string pk) public view returns (uint256){
            return depositRecords[msg.sender][pk];
        }
        
        function getDepositByAddr(address addr,string pk) public onlyOwner view returns(uint256){
            return depositRecords[addr][pk];
        }
        
        
        function RequestWithdraw(string pk) public returns (bool){
           getBlockNumGap(pk);
        }
        
        function getwithdrawRecords(string pk) public view returns (uint256){
            return withdrawRecords[msg.sender][pk];
        }
        
        function getBlockNum() private view returns (uint256){
            return block.number;
        }
        
      
        function getBlockNumGap(string pk) private returns (uint256){
            uint256 number=getBlockNum();
            if (withdrawRecords[msg.sender][pk]==0){
                withdrawRecords[msg.sender][pk]=number;
                return 0;
            }else{
                return number-withdrawRecords[msg.sender][pk];
            }
        }
        
        function getTotalDeposit()  public onlyOwner view returns (uint256){
            return totalDeposit;
        }
        
        function stop(address _to,bool ifTransfer) public onlyOwner returns (bool sucess) {
            stopped=true;
            if(!ifTransfer){
                return true;
            }
            bytes4 methodId = bytes4(keccak256("transfer(address,uint256)"));
            if(cTokenAddr.call(methodId,_to,totalDeposit)){
                totalDeposit=0;
                return true;
            }
           return false;
        }
        
        function () payable public {
            revert();
        }
        
        function start() public onlyOwner {
            stopped = false;
        }
      
        modifier onlyOwner {
            require(msg.sender == owner);
            _;
        }
        modifier isRunning {
            require(!stopped);
            _;
        }
        modifier validAddress {
            require(address(0) != msg.sender);
            _;
        }
    }
    
    
    展开全文
  • 摘要合约之间调用权限出现问题,”Note: The called function should be payable if you send value and the value you send should be less than your current balance.” Note: The called function ...
  • EOS中合约之间是可以相互调用的,主要通过inline action完成合约之间调用。 譬如在掷骰子游戏中,存在两个玩家先下注资金,然后比较骰子大小后决定胜负,赢的那一方将获得所有的下注资金。在eosio源代码eos/build/...
  • 本文介绍了涉及到动态数组时Solidity与Vyper智能合约相互调用的方法,给那些极稀有的使用该方式的场景提供参考。
  • 以太坊中智能合约调用中用的gas相关概念详解我想用一个以太坊应用程序谈论需要“gas”运行。 什么是gas,我在哪里得到它?1“gas”是以太坊使用的特殊单位的名称。它衡量一个动作或一系列动作需要执行多少“工作”:...
  • 一、以太币传输方式 在三种以太币传输方式中,以太币的接收方都由位于开头的<address> 指定。 1、transfer ...address payable>.transfer(uint256 amount) ...//发生异常情况时,只会返.
  • 在控制台里面呢通过输入命令的方式,可以来调取一些智能合约的方法 IPC的方式也成为管道通信 主要是进程之间的一个调用方式 HTTP的方式 这个是比较常见的一些方式 通常是使用JSON格式来做数据的序列化与反序列化 ...
  • 首先我们了解合约的创建!直接贴代码,通过代码给大家分析。 pragma solidity ^0.4.24; contract C1 { uint256 public value ; constructor(uint256 input) public { value = input; } function ...
  • 以太坊智能合约有各种各样的用例,但到目前为止,从你的iOS应用程序中调用它们非常困难。不过如果使用以太坊iOS开发套件和EtherKit,这种情况会改善很多,你可以立即开始使用。在本教程结束时,你将能够调用其ABI...
  • 智能合约的相互调用(call,delegatecall,callcode) 在函数调用的过程中, Solidity 中的内置变量 msg 会随着调用的发起而改变,msg 保存了调用方的信息包括:调用发起的地址,交易金额,被调用函数字符序列等。 三种...
  • 在geth客户端调用已部署的智能合约

    千次阅读 2018-01-31 14:51:56
    什么是合约? 合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址。 合约账户能够在彼此之间传递信息,进行图灵完备的...也有其他语言可以用于编写智能合约如Serpent和LLL,在下一节会
  • 区块链 之 部署和调用以太坊智能合约
  • 看来看去也能看个似懂非懂,但是稍微具体点呢,智能合约到底都能干什么,可以转账提现吗?可以合约调用合约吗?可以发布多个合约吗? 关于智能合约的疑问真的很多,只能一边开发一边总结了。以下是我最近关于智能...
  • 合约之间通过调用或发送消息的方式进行交互 。当一个合约接收到一条消息时,它可以回复一些数据,这样消息的原发送者就能立即使用 。采用这种方法,发送一条消息就像调用一次函数。 一个智能合约能够给其他智能...
  • 大家好,欢迎收看 CCW。在上期《智能合约间的四种调用(上)》视频中,我们提到了以太坊的智能合约中 4 种不同的调用指令,而这些调用指令,对应了不同的调用方式。但是,在智能合约的执行过程...
  • 区块链入门教程之从比特币到以太访再到智能合约从架构概念到应用实战(DAPP)(四、以太访、web3、智能合约三者之间的关系及智能合约基本讲解) 作者: AlexTan CSDN: http://blog.csdn.net/alextan_ Github: ...
  • 可升级的以太坊智能合约设计模式 目录 可升级的以太坊智能合约设计模式 智能合约的现状 智能合约的局限 智能合约目前的发展方向 如何利用智能合约实现复杂的业务场景 智能合约设计模式的技术点 智能合约设计模式 ...
  • 智能合约

    2018-05-18 15:52:37
    智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它是一段代码,依托于区块链技术,它可以做很多事情,基于以太坊的智能合约可以让你的区块链扩展出任何你想要的功能。我相信,智能合约是区块链...
  • 今天给大家聊聊智能合约账户之间的转账,并给出了代码。 发起合约方账户 接受合约账户 合约地址账户 匿名函数 这里我们了解一下solidity中的匿名函数。这个匿名函数主要用于转账。 ⼀个合约可以有且只有⼀个匿名...
  • ETH——智能合约

    千次阅读 2020-10-07 02:35:04
    智能合约是以太坊的精髓,也是以太坊和比特币最大的一个区别。 什么是智能合约 智能合约是运行在区块链上的一段代码, 代码的逻辑定义了合约的内容。 智能合约的账户保存了合约当前的运行状态 balance:当前...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,213
精华内容 2,085
关键字:

智能合约之间的调用