精华内容
下载资源
问答
  • 一个与以太坊区块链和生态系统进行交互的php接口。 安装 为开发人员设置最低稳定性 "minimum-stability": "dev" 然后 composer require sc0vu/web3.php dev-master 或者您可以在composer.json中添加此行 "sc0vu/web...
  • 区块链合约交互 web3

    千次阅读 2021-08-20 16:48:39
    1.合约交互之前需要先判断是否仍允许purchasePool合约从账户(钱包里的账户) 中提取的ERC20dfaContract 这本合约里(DFA)的金额 await this.contract.ERC20dfaContract.methods.allowance(this.address,this....

    遵循ERC20规则,

    钱包里可以有很多种类型的token:USDT,DFI,DFA

    1.合约交互之前需要先判断是否仍允许purchasePool合约从账户(钱包里的账户) 中提取的ERC20dfaContract 这本合约里(DFA)的金额

    await this.contract.ERC20dfaContract.methods.allowance(this.address,this.addressMap.AcceleratePool).call();

    ERC20dfaContract:这个是dfa合约地址

    ERC20dfaContract:new window.web3.eth.Contract(ERC20Token,address.DFAToken)

    purchasePool:这个是池子的合约地址

    purchasePool:new window.web3.eth.Contract(DistributionInAbi,address.AcceleratePool),

    ERC20Token:是ERC20的abi  ,  address.DFAToken:是创建合约的token地址,

    this.address这个是钱包的账户地址

    this.addressMap.AcceleratePool:这个是池子的token地址

    注:如果返回值是0,可以直接授权,如果不为0,就不可以授权,如果一定要授权需要将返回值置为0,再授权。

    2.授权(ERC20dfaContract这个合约允许这个池子(AcceleratePool)从它这里转走这么多钱)

    this.contract.ERC20dfaContract.methods.approve(this.addressMap.AcceleratePool,"转多少钱")

    .send({ from: this.address, gas: approveGas })

    .then((result) => {}).catch(() => {});

    3.充值(池子里的合约方法,自己写的合约,根据合约接口操作) 

    this.contract.purchasePool.methods.purchase(input).send({from:this.address,gas:getPurchaseGas}).then((result)=>{}).catch(()=>{})

    purchase:这个是合约里的充值的方法

    4.赎回 (池子里的合约方法,自己写的合约,根据合约接口操作)

    this.contract.purchasePool.methods.claim().send({ from: this.address, gas: claimGas }).then((result) => {}).catch(() => {});

    注:充值,赎回这些不是查询的,是需要消耗gas的,所以每次转账,赎回时需要查询消耗的gas (上文中的 getPurchaseGas)

    async getPurchaseGas(){return await this.contract.purchasePool.methods.purchase(this.input).estimateGas({from:this.address})},

    *这个是充值消耗gas例子

    展开全文
  • Web3与智能合约交互实战

    千次阅读 2018-05-16 16:26:15
    写在前面 在最初学习以太坊的时候,很多人都是...因此,我们需要一种友好的方式(比如一个web页面)来与智能合约交互,于是问题的答案就是web3.js。 Web3.js Web3.js是以太坊官方的Javascript API,可以帮助...

    最新内容会更新在主站深入浅出区块链社区
    原文链接:Web3与智能合约交互实战

    写在前面

    在最初学习以太坊的时候,很多人都是自己创建以太坊节点后,使用geth与之交互。这种使用命令行交互的方法虽然让很多程序员感到兴奋(黑客帝国的既视感?),但不可能指望普通用户通过命令行使用Dapp。因此,我们需要一种友好的方式(比如一个web页面)来与智能合约交互,于是问题的答案就是web3.js

    Web3.js

    Web3.js是以太坊官方的Javascript API,可以帮助智能合约开发者使用HTTP或者IPC与本地的或者远程的以太坊节点交互。实际上就是一个库的集合,主要包括下面几个库:

    • web3-eth用来与以太坊区块链和智能合约交互
    • web3-shh用来控制whisper协议与p2p通信以及广播
    • web3-bzz用来与swarm协议交互
    • web3-utils包含了一些Dapp开发有用的功能

    Web3与geth通信使用的是 JSON-RPC ,这是一种轻量级的RPC(Remote Procedure Call)协议,整个通信的模型可以抽象为下图。

    Web3 Communication Model

    搭建测试链

    在开发初期,我们并没有必要使用真实的公链,为了开发效率,一般选择在本地搭建测试链。在本文我们选择的Ganache(在此之前使用的是testrpc,Ganache属于它的升级版),一个图形化测试软件(也有命令行版本),可以一键在本地搭建以太坊区块链测试环境,并且将区块链的状态通过图形界面显示出来,Ganache的运行界面如下图所示。

    Ganache

    从图中可以看到Ganache会默认创建10个账户,监听地址是http://127.0.0.1:7545,可以实时看到Current BlockGas PriceGas Limit等信息。

    创建智能合约

    目前以太坊官方全力支持的智能合约开发环境是Remix IDE,我们在合约编辑页面编写如下代码:

    pragma solidity ^0.4.21;
    
    contract InfoContract {
        
       string fName;
       uint age;
       
       function setInfo(string _fName, uint _age) public {
           fName = _fName;
           age = _age;
       }
       
       function getInfo() public constant returns (string, uint) {
           return (fName, age);
       }   
    }
    

    代码很简单,就是简单的给nameage变量赋值与读取,接下来切换到 run 的 tab 下,将Environment切换成Web3 Provider,并输入我们的测试链的地址http://127.0.0.1:7545,这里对这三个选项做一简单说明:

    • Javascript VM:简单的Javascript虚拟机环境,纯粹练习智能合约编写的时候可以选择
    • Injected Web3:连接到嵌入到页面的Web3,比如连接到MetaMask
    • Web3 Provider:连接到自定义的节点,如私有的测试网络。

    如果连接成功,那么在下面的Account的选项会默认选择 Ganache 创建的第一个账户地址。接下来我们点击Create就会将我们的智能合约部署到我们的测试网中。接下来 Remix 的页面不要关闭,在后面编写前端代码时还要用到合约的地址以及ABI信息。

    安装Web3

    在这之前,先在终端创建我们的项目:

    > mkdir info
    > cd info
    

    接下来使用 node.js 的包管理工具 npm 初始化项目,创建package.json 文件,其中保存了项目需要的相关依赖环境。

    > npm init
    

    一路按回车直到项目创建完成。最后,运行下面命令安装web.js:

    > npm install web3
    

    注意: 在实际安装过程中我发现web3在安装完成后并没有 /node_modules/web3/dist/we3.min.js 文件,这个问题在 issue#1041中有体现,但官方好像一直没解决。不过可以在这里下载所需的文件,解压后将dist文件夹的内容拷贝到 /node_modules/web3路径下。

    创建 UI

    在项目目录下创建index.html,在这里我们将创建基础的 UI,功能包括nameage的输入框,以及一个按钮,这些将通过 jQuery 实现:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    
        <link rel="stylesheet" type="text/css" href="main.css">
    
        <script src="./node_modules/web3/dist/web3.min.js"></script>
    
    </head>
    <body>
        <div class="container">
    
            <h1>Info Contract</h1>
    
            <h2 id="info"></h2>
    
            <label for="name" class="col-lg-2 control-label">Name</label>
            <input id="name" type="text">
    
            <label for="name" class="col-lg-2 control-label">Age</label>
            <input id="age" type="text">
    
            <button id="button">Update Info</button>
    
    
        </div>
    
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
    
        <script>
           // Our future code here..
        </script>
    
    </body>
    </html>
    

    接下来需要编写main.css文件设定基本的样式:

    body {
        background-color:#F0F0F0;
        padding: 2em;
        font-family: 'Raleway','Source Sans Pro', 'Arial';
    }
    .container {
        width: 50%;
        margin: 0 auto;
    }
    label {
        display:block;
        margin-bottom:10px;
    }
    input {
        padding:10px;
        width: 50%;
        margin-bottom: 1em;
    }
    button {
        margin: 2em 0;
        padding: 1em 4em;
        display:block;
    }
    
    #info {
        padding:1em;
        background-color:#fff;
        margin: 1em 0;
    }
    

    ##使用Web3与智能合约交互
    UI 创建好之后,在<script>标签中间编写web.js的代码与智能合约交互。首先创建web3实例,并与我们的测试环境连接:

    <script>
        if (typeof web3 !== 'undefined') {
            web3 = new Web3(web3.currentProvider);
        } else {
            // set the provider you want from Web3.providers
            web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
        }
    </script>
    

    这段代码是web3.js Github提供的样例,意思是如果web3已经被定义,那么就可以直接当作我们的 provider 使用。如果没有定义,则我们手动指定 provider。

    这里可能会存在疑问:为什么 web3 会被事先定义呢?实际上,如果你使用类似 MetaMask(一个 Chrome 上的插件,迷你型以太坊钱包)这样的软件,provider 就会被自动植入。

    在上面代码的基础上,接下来设置默认的以太坊账户:

    web3.eth.defaultAccount = web3.eth.accounts[0];
    

    在上文中我们使用 Ganache 已经创建了 10 个账户了,这里我们选择第一个账户当作默认账户。

    接下来需要让我们的web3知道我们的合约是什么样的,这里需要用到合约的 ABI(Application Binary Interface)ABI可以使我们调用合约的函数,并且从合约中获取数据。

    在上文中我们已经在 Remix 中创建了我们的合约,这时重新回到 Remix,在 Compile 的 tab 下我们点击Details 出现的页面中我们可以拷贝合约的ABI,如下图所示。

    将其复制到代码中:

    var infoContract = web3.eth.contract(PASTE ABI HERE!);
    

    接下来转到 run 的tab,拷贝合约的地址,将其复制到下面的代码中:

    var info = InfoContract.at('PASTE CONTRACT ADDRESS HERE');
    

    完成这些我们就可以调用合约中的函数了,下面我们使用 jQuery 与我们的合约进行交互:

    info.getInfo(function(error, result){
        if(!error)
            {
                $("#info").html(result[0]+' ('+result[1]+' years old)');
                console.log(result);
            }
        else
            console.error(error);
    });
    
    $("#button").click(function() {
        info.setInfo($("#name").val(), $("#age").val());
    });
    

    以上的代码就简单地实现了对合约中两个函数的调用,分别读取和显示nameage变量。

    到此我们就完成了全部的代码,完整代码可以在 InfoContract 中找到。在浏览器中打开index.html测试效果如下图(输入名字和年龄后刷新)。

    本文的作者是盖盖,他的微信公众号: chainlab

    参考文献

    再次厚脸皮的给大家推荐,
    想要学习去中心化应用开发,这门课程不容错过区块链全栈-以太坊DAPP开发实战

    深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

    ☛ 我的知识星球为各位解答区块链技术问题,欢迎加入讨论。

    ☛ 关注公众号“深入浅出区块链技术”第一时间获取区块链技术信息。

    展开全文
  • 与智能合约交互

    千次阅读 2018-07-04 17:46:08
    与智能合约交互 概述 为了与合约交互而向Ethereum网络编写原始请求,那么您很快就会意识到,编写这些请求是笨重而麻烦的。 同样,你可能会发现管理每个请求的状态非常复杂。幸运的是,Truffle 为您解决了这种...

    与智能合约交互

    概述

    为了与合约交互而向Ethereum网络编写原始请求,那么您很快就会意识到,编写这些请求是笨重而麻烦的。
    同样,你可能会发现管理每个请求的状态非常复杂。幸运的是,Truffle 为您解决了这种复杂性,使得与合约的交互变得轻而易举。

    读写数据

    Ethereum网络对向网络写入数据和从网络读取数据进行了区分,这种区分在如何编写应用程序中起着重要作用。
    通常,写入数据称为交易( transaction ),而读取数据称为调用( call )。事务和调用的处理方式非常不同,具有以下特征。

    交易 (Transactions)

    交易从根本上改变了网络的状态。交易可以是简单到将以太币发送到另一个帐户,也可以是复杂到执行合约函数或向网络添加新合约。
    交易的定义特性是它写入(或更改)数据。交易的运行成本很高,称为“gas”,交易的处理需要时间。
    当您通过交易执行合约的功能时,您不能接收该函数的返回值,因为交易没有立即处理。一般来说,通过交易执行的函数不会返回值;
    它们将返回一个交易id。所以总的来说,交易(Transactions)特性如下:

    • 消费 gas (以太币 ether)
    • 修改网络状态
    • 不能马上执行
    • 不会暴露一个返回值(之返回一个交易id)

    调用 (Calls)

    调用正好相反。调用可以是在网络中执行代码,不会永久的改变数据(状态)。调用是免费的,它的特性就是读取数据。
    当你使用 call 调用一个合约中的一份方法时,函数会马上返回。总的来说 Calls 的特性:

    • 免费(不消耗 gas)
    • 不改变网络状态
    • 马上执行
    • 会暴露一个返回值

    选择使用 Tranaction 或 Call 很简单,取决于你是读取数据还是写入数据。

    合约抽象简介

    合约抽象是使用 Javascript 与 Ethereum 合约交互的 bread 和 butter 。
    简而言之,合约抽象是一种包装代码,它使与合约的交互变得容易,从而让你忘记了在引擎下执行的许多引擎和齿轮。
    Truffle通过 Truffle-contract 模块使用它自己的合约抽象,下面描述的就是这个合约抽象。

    为了理解合约抽象的作用,我们首先需要一个合约例子。我们将使用MetaCoin合约,通过 truffle unbox metacoin 提供给您。

    pragma solidity ^0.4.2;
    
    import "./ConvertLib.sol";
    
    // This is just a simple example of a coin-like contract.
    // It is not standards compatible and cannot be expected to talk to other
    // coin/token contracts. If you want to create a standards-compliant
    // token, see: https://github.com/ConsenSys/Tokens. Cheers!
    
    contract MetaCoin {
        mapping (address => uint) balances;
    
        event Transfer(address indexed _from, address indexed _to, uint256 _value);
    
        function MetaCoin() {
            balances[tx.origin] = 10000;
        }
    
        function sendCoin(address receiver, uint amount) returns(bool sufficient) {
            if (balances[msg.sender] < amount) return false;
            balances[msg.sender] -= amount;
            balances[receiver] += amount;
            Transfer(msg.sender, receiver, amount);
            return true;
        }
    
        function getBalanceInEth(address addr) returns(uint){
            return ConvertLib.convert(getBalance(addr),2);
        }
    
        function getBalance(address addr) returns(uint) {
            return balances[addr];
        }
    }

    除了构造函数(sendCoin、getBalanceInEth和getBalance)之外,该契约还有三个方法。
    这三个方法都可以作为 transaction 或 call 执行。

    现在让我们看看 Truffle 提供给我们的名为 MetaCoin 的 Javascript 对象,
    这是在 truffle console 中的:

    // Print the deployed version of MetaCoin.
    // Note that getting the deployed version requires a promise, hence the .then.
    MetaCoin.deployed().then(function(instance) {
      console.log(instance);
    });
    
    // outputs:
    //
    // Contract
    // - address: "0xa9f441a487754e6b27ba044a5a8eb2eec77f6b92"
    // - allEvents: ()
    // - getBalance: ()
    // - getBalanceInEth: ()
    // - sendCoin: ()
    // ...

    请注意,合约抽象包含与我们的合约中相同的功能。它还包含一个指向MetaCoin合同已部署版本的地址。

    执行合约方法

    使用合约抽象你可以很容易的在以太坊网络中调用合约。

    创建一个交易

    MetaCoin 中有三个方法可以执行。如果你自己看你会发现 setCoin 方法是用来在网络中发送币的。
    这个方法需要修改网络中的状态。

    我们调用 setCoin 方法时候我们使用 transaction 调用。在下面的例子中将会转账10个 Meta 币,
    就是说要永久的修改网络状态:

    var account_one = "0x1234..."; // an address
    var account_two = "0xabcd..."; // another address
    
    var meta;
    MetaCoin.deployed().then(function(instance) {
      meta = instance;
      return meta.sendCoin(account_two, 10, {from: account_one});
    }).then(function(result) {
      // If this callback is called, the transaction was successfully processed.
      alert("Transaction successful!")
    }).catch(function(e) {
      // There was an error! Handle it.
    })

    上面的代码有一些有趣的地方:

    • 我们直接调用合约抽象的 setCoin 方法。这个调用将会返回一个 transactin 结果。
    • 当交易成功执行以后,回调方法才会执行。这就让生命周期管理改变的简单,你不需要自己检查交易状态。
    • 我们将对象作为第三个参数传递给sendCoin。注意,在我们的Solidity合约中,sendCoin函数没有第三个参数。
      上面看到的是一个特殊的对象,它总是作为最后一个参数传递给一个函数,该函数允许您编辑交易的特定细节。
      在这里,我们设置了from address确保该交易来自account_one。

    创建一个调用 call

    继续使用 MetaCion 例子,注意 getBalance 函数是从网络读取数据的一个很好的候选函数。
    它不需要做任何更改,因为它只返回传递给它的地址的 Meta Coin 余额。让我们试一试:

    var account_one = "0x1234..."; // an address
    
    var meta;
    MetaCoin.deployed().then(function(instance) {
      meta = instance;
      return meta.getBalance.call(account_one, {from: account_one});
    }).then(function(balance) {
      // If this callback is called, the call was successfully executed.
      // Note that this returns immediately without any waiting.
      // Let's print the return value.
      console.log(balance.toNumber());
    }).catch(function(e) {
      // There was an error! Handle it.
    })

    这里有意思的地方:

    • 我们执行了 call 方法,告诉以太坊网络我们不会修改网络中的数据。
    • 我们接收到了一个返回值,而不是一个交易id。
    警告:
    我们把返回值转换为数字,因为这个demo中数字很小。通常给如果如果你要转换一个超大整形需要
    使用 JavaScript 提供 ```BigNumber``` 库,否则会报错或者抛出异常。

    捕获事件

    你的合约可以触发事件,你可以通过这些事件获得更多的了解你的合约在做什么。
    处理事件的最简单方法是处理触发事件的交易的结果对象,如下所示:

    var account_one = "0x1234..."; // an address
    var account_two = "0xabcd..."; // another address
    
    var meta;
    MetaCoin.deployed().then(function(instance) {
      meta = instance;  
      return meta.sendCoin(account_two, 10, {from: account_one});
    }).then(function(result) {
      // result is an object with the following values:
      //
      // result.tx      => transaction hash, string
      // result.logs    => array of decoded events that were triggered within this transaction
      // result.receipt => transaction receipt object, which includes gas used
    
      // We can loop through result.logs to see if we triggered the Transfer event.
      for (var i = 0; i < result.logs.length; i++) {
        var log = result.logs[i];
    
        if (log.event == "Transfer") {
          // We found the event!
          break;
        }
      }
    }).catch(function(err) {
      // There was an error! Handle it.
    });

    处理交易结果

    当我们创建交易时,将获得一个结果对象,该对象将提供关于交易的大量信息。
    具体来说,有以下信息:

    • result.tx (string) - 交易哈希值
    • result.log (array) - 解码后的事件
    • result.receipt (object)- 交易收据

    更多信息请查看 truffle-contract说明

    向网络中添加一个新的合约

    如果您已经有一个合约地址,您可以创建一个新的合约抽象来表示该地址的合约。

    var instance = MetaCoin.at("0x1234....");

    给合约转账

    你可能只想直接发送以太币 ether 到合约,或者触发合约的回退功能。
    你可以使用以下两个选项之一来实现这一点:

    方式一:
    直接向合约发送一个交易使用 instance.sendTransaction() 。这就像所有可用的合约实例函数一样,
    web3.eth.sendTransaction 方法相同,但是 web3.eth.sendTransaction 没有回调。
    如果你没有申明 to ,它将会被自动填充。

    instance.sendTransaction({...}).then(function(result){
        // same transction result object as above.
    });

    方式二:
    直接发送以太币也有简写:

    instance.send(web3.toWei(1, "ether")).then(function(result){
        // some result oject as above
    });
    展开全文
  • 经过了fabrict网络搭建,合约部署,接下里就是和合约交互。 我们上一章节中部署了官方给的fabcar合约项目,这里我们还是以这套合约为例做简单的交互介绍。 首先,fabcar的chaincode地址:...

    Fabric网络搭建好,合约部署好,接下来就是和合约交互。

    我们上一章节中部署了官方给的fabcar合约项目,这里我们还是以这套合约为例做简单的交互介绍。

    首先,fabcar的chaincode地址:https://github.com/hyperledger/fabric-samples/tree/main/chaincode/fabcar/javascript

    部署的方法上一章节介绍过,使用deployCC即可。

    这里我们假设已经部署好了fabcar的合约。

    接下来我们直接开始对合约进行操作,也就是调用合约里面的方法。

    新建项目

    首先我们使用npm创建一个node项目,npm init,在package.json加入3个包:

    {
      "name": "fabcar",
      "version": "1.0.0",
      "description": "FabCar application implemented in JavaScript",
      "engineStrict": true,
      "author": "Hyperledger",
      "license": "Apache-2.0",
      "dependencies": {
        "app-root-path": "^3.0.0",
        "fabric-ca-client": "^2.2.4",
        "fabric-network": "^2.2.4"
      }
    }
    

    说明下,fabric-network用于合约交互,里面有很重要的contract对象可以操作合约。fabric-ca-client用于fabric网络层面的一些交互,可以注册用户等。

    注册Admin用户

    const FabricCAServices = require('fabric-ca-client');
    const { Wallets } = require('fabric-network');
    const ROOT = require('app-root-path');
    const ccp = require(`${ROOT}/organizations/peerOrganizations/org1.example.com/connection-org1.json`);
    const walletPath = `${ROOT}/wallet`;
    
    async function main() {
        try {
            // Create a new CA client for interacting with the CA.
            const caInfo = ccp.certificateAuthorities['ca.org1.example.com'];
            const caTLSCACerts = caInfo.tlsCACerts.pem;
            const ca = new FabricCAServices(
                caInfo.url,
                { trustedRoots: caTLSCACerts, verify: false },
                caInfo.caName
            );
            // Create a new file system based wallet for managing identities.
            const wallet = await Wallets.newFileSystemWallet(walletPath);
            // Enroll the admin user, and import the new identity into the wallet.
            const enrollment = await ca.enroll({
                enrollmentID: 'admin',
                enrollmentSecret: 'adminpw',
            });
            const x509Identity = {
                credentials: {
                    certificate: enrollment.certificate,
                    privateKey: enrollment.key.toBytes(),
                },
                mspId: 'Org1MSP',
                type: 'X.509',
            };
            await wallet.put('admin', x509Identity);
            console.log('Successfully enrolled admin user');
        } catch (e) {
            console.error(e);
        }
    }
    
    main();
    

    这里我们注意到,需要引用一些外部文件,首先项目目录下创建一个wallet目录,存储用户钱包,也就是私钥,用于之后交互时的签名权。另外一个就是引入连接节点的配置文件,这个文件在organization下,我们必须要把第一章中用cryptogen生成的那个organization目录全部复制过来,注意是全部,否则会报错,可能是有什么关联引用吧。

    注册普通用户

    上面已经注册了admin用户,所以可以用admin用户再注册普通用户了,如下:

    const { Wallets } = require('fabric-network');
    const FabricCAServices = require('fabric-ca-client');
    const ROOT = require('app-root-path');
    const ccp = require(`${ROOT}/organizations/peerOrganizations/org1.example.com/connection-org1.json`);
    const walletPath = `${ROOT}/wallet`;
    
    async function main() {
        try {
            // Create a new CA client for interacting with the CA.
            const caURL = ccp.certificateAuthorities['ca.org1.example.com'].url;
            const ca = new FabricCAServices(caURL);
            const wallet = await Wallets.newFileSystemWallet(walletPath);
            const adminIdentity = await wallet.get('admin');
            const provider = wallet
                .getProviderRegistry()
                .getProvider(adminIdentity.type);
            const adminUser = await provider.getUserContext(adminIdentity, 'admin');
    
            // Register the user, enroll the user, and import the new identity into the wallet.
            const secret = await ca.register(
                {
                    affiliation: 'org1.department1',
                    enrollmentID: 'appUser',
                    role: 'client',
                },
                adminUser
            );
            const enrollment = await ca.enroll({
                enrollmentID: 'appUser',
                enrollmentSecret: secret,
            });
            const x509Identity = {
                credentials: {
                    certificate: enrollment.certificate,
                    privateKey: enrollment.key.toBytes(),
                },
                mspId: 'Org1MSP',
                type: 'X.509',
            };
            await wallet.put('appUser', x509Identity);
            console.log('Successfully registeredd');
        } catch (error) {
            console.error(error);
        }
    }
    
    main();
    

    合约读写

    const { Gateway, Wallets } = require('fabric-network');
    const ROOT = require('app-root-path');
    const walletPath = `${ROOT}/wallet`;
    const ccp = require(`${ROOT}/organizations/peerOrganizations/org1.example.com/connection-org1.json`);
    let conf = null;
    let contract = null;
    
    async function query() {
        const res = await contract.evaluateTransaction('queryCar', 'CAR1');
        console.log(JSON.parse(res.toString()));
    }
    
    async function change(name) {
        await contract.submitTransaction('changeCarOwner', 'CAR1', name);
    }
    async function main() {
        try {
            // load the network configuration
            const wallet = await Wallets.newFileSystemWallet(walletPath);
            conf = {
                wallet,
                identity: 'appUser',
                discovery: { enabled: true, asLocalhost: true },
            };
            const gateway = new Gateway();
            await gateway.connect(ccp, conf);
            const network = await gateway.getNetwork('mychannel');
            contract = network.getContract('fabcar');
            await query();
            await change('devil');
            await query();
            await gateway.disconnect();
        } catch (error) {
            console.error(error);
        }
    }
    
    main();
    

    对应输出结果:
    在这里插入图片描述

    展开全文
  • Truffle 官网文档--与你的合约交互

    千次阅读 2018-04-20 09:29:53
    简介许多情况下,我们想要与我们的合约进行交互,但是许多操作需要一些比较底层的技术积累,而且就算你自己写出来了(肯定不止一两条命令吧),你也会发现,管理这些命令也是相当麻烦的---比如你发现你的一条命令...
  • 尽管最近遇到了些麻烦,但以太坊仍然是区块链领域内智能合约的最大参与者,这似乎不会很快改变。 在我看来,技术本身具有很大的潜力,是从学术的角度看很有意思,但正如上面提到的问题和之前的许多问题是区块链技术...
  • 以太坊开发实战:通过truffle-contract与智能合约交互 与以太坊的智能合约交互,除了使用web3.js,还可以使用另外一个Javascript库,就是truffle-contract。truffle-contract对以太坊的智能合约做了更好的抽象,...
  • web3智能合约交互

    2021-04-09 17:34:04
    web3智能合约交互调用只读方法安装依赖调用方法代码示例发送交易安装依赖调用方法代码示例 调用只读方法 调用合约的只读查询方法,不需要发送任何交易。因此不会改变合约的状态。 安装依赖 npm install web3 npm ...
  • python与以太坊智能合约交互

    千次阅读 2020-11-05 15:21:23
    文章目录python与以太坊智能合约交互需要做一个轮询脚本思路上代码1.配置2.交易必备的方法和对象w3节点对象发送交易方法封装swapContract.pymain.py python与以太坊智能合约交互 先说一下为啥选择python,因为简单。...
  • 使用Go语言和以太坊智能合约交互

    千次阅读 2019-04-22 21:08:34
    尽管最近遇到了些麻烦,但以太坊仍然是区块链领域内智能合约的最大参与者,这似乎不会很快改变。 在我看来,技术本身具有很大的潜力,是从学术的角度看很有意思,但正如上面提到的问题和之前的许多问题是区块链技术...
  • web3.js与合约交互

    千次阅读 2018-07-13 17:36:15
    接下来我们将使用web3.js与现有合约交互,下面合约也是以太坊....javascript签名合约交易这篇文章使用的合约案例.如果您目前没有部署下面合约,你可以参考这边文章部署好合约.,然后按步骤实操. 示例合约 本文以...
  • 合约交互 原文地址 合约交互的操作可以定义为两类: read和write 在合约中 read 操作被称作 call ,write 操作被称为 transaction call操作不会花费coin(钱,这里被称为‘gas’),写操作会花费gas 总结transaction...
  • web3.js与智能合约交互

    千次阅读 2018-07-17 11:43:23
    1、web3与本地智能合约交互。 1.1首先引入核心JS  <script type="text/javascript" src="js/web3.min.js"></script> <script type="text/javascript" src="js/bignumber.min.js" ></script> web3.min....
  • 一个超级简到的示例合约如下: pragma solidity >0.4.24; contract Demo{ string name; uint age; //定义事件 event Instructor(string name, uint age); function set(string memory _name, uint _age) ...
  • :counterclockwise_arrows_button: 智能合约交互(读/写) :shinto_shrine: Infura支持,patial Websockets API支持 :hammer_and_pick: 将TxPool内容解析为本机值(以太坊地址和交易)-轻松获取待处理交
  • 文章目录铺垫知识环境搭建源码分析合约抽象通过web3.js与合约交互交易执行结果获取指定地址合约的合约抽象truffle向合约发送以太 铺垫知识 在以太坊网络中,通常把写入数据称为交易,而读取数据称为调用。 交易 有...
  • 271-react合约交互

    2019-02-21 17:03:30
    react合约交互 我们创建三个文件夹,对js文件进行一个管理 1.display display.js 2.eth interaction.js loadInstance.js 3.utils getWeb3.js 首先,我们把web3分离到getWeb3.js里面 getWeb3.js文件 ...
  • 在以太坊和其他区块链中,仍有很多被...在这篇文章中,我将介绍如何将python程序与以太坊智能合约集成。出于这样或那样的原因,可能也面临着这个问题,尽管以太坊提供了图灵完备语言,但并不是所有事情都能完成。...
  • 尽管这个库非常有用,但使用其提供接口与合约交互有些困难,特别是以太坊的新手。为降低学习曲线,Truffle使用Ether Pudding库,它也是基于Web3的基础之上,目的是为了让交互更简单。读写数据以太坊网络把在网络上读...
  • 通过web3dart软件包与以太坊智能合约进行交互的Flutter应用程序示例。 入门 该项目假定您的Flutter安装至少已升级到2.0版,以便能够在移动平台(Android和iOS),Web(Chrome)和台式机(在我们的示例中为Linux)上...
  • 用web3.js与智能合约交互(修改版)

    千次阅读 2018-09-21 01:49:44
    工具:Truffle v4.0.4  ganache-1.1.0-beta(ui界面版) nodejs 8.9.4 npm 5.6.0  web3 1.0.0 思路: ...1、先用truffle创建一个以太坊智能合约项目,部署在ganache测试网络。 2、用npm创建另外...
  • 用golang可以开发程序和以太坊智能合约进行交互,只是需要一些额外的步骤。 首先需要智能合约源码,其次需要abigen这个程序,这个程序可以通过编译go-ethereum程序得到。 在windows下通过把go-ethereum源码下载...
  • 用web3.js与智能合约交互

    千次阅读 热门讨论 2018-03-06 15:42:05
    首先放上官方API:https://web3js.readthedocs.io/en/1.0/index.html工具:Truffle v4.0.4 ganache-1.1.0-beta(ui界面版)nodejs 8.9.4npm 5.6.0 web3 1.0.0思路:1、先用truffle创建一个以太坊智能合约项目,...
  • 用web3j实现与智能合约交互

    千次阅读 2018-03-25 21:25:54
    web3j文档:https://web3j.readthedocs.io/en/latestjava-ipfs-api文档:https://github.com/ipfs/java-ipfs-api之前一直用nodejs调用web3.js与智能合约交互,但是没找到与Java项目进行交互的方法。原来以太坊是有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,988
精华内容 5,995
关键字:

合约交互