智能合约:从 Python 调用智能合约

以太坊带来了智能合约的进步,其是可公开验证的代码。如果我们改变合约状态,我们将花费一些gas。现在,让我们创建一个Python程序,它可以在以太坊上调用智能合约。因为我们不想实验中支付费用,所以我们将运行Ganache,这是一个本地以太坊实例。

首先,我们去Remix.ethereum.org并添加我们的代码:

我们添加的代码中包括add(), sub(), mul(), sqr()和sqrt()函数:

pragma solidity ^0.8.0;contract mymath {function sqrt(uint x) public view returns (uint y) {uint z = (x + 1) / 2;y = x;while (z < y) {y = z;z = (x / z + z) / 2;}
}
function sqr(uint a) public view returns (uint) {uint c = a * a;return c;}
function mul(uint a, uint b) public view returns (uint) {uint c = a * b;return c;}
function sub(uint a, uint b) public view returns (uint) {return a - b;}
function add(uint a, uint b) public view returns (uint) {uint c = a + b;return c;
}}

现在编译我们的智能合约,并生成ABI(应用程序二进制接口)。通过ABI,我们可以创建智能合约中所有数据元素和函数。这通常用JSON格式定义。在我们的例子中,ABI是(可以从Remix中的ABI复制按钮中复制):

 {"inputs": [{"internalType": "uint256","name": "a","type": "uint256"},{"internalType": "uint256","name": "b","type": "uint256"}],"name": "add","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint256","name": "a","type": "uint256"},{"internalType": "uint256","name": "b","type": "uint256"}],"name": "mul","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint256","name": "a","type": "uint256"}],"name": "sqr","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint256","name": "x","type": "uint256"}],"name": "sqrt","outputs": [{"internalType": "uint256","name": "y","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint256","name": "a","type": "uint256"},{"internalType": "uint256","name": "b","type": "uint256"}],"name": "sub","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"}

接下来,我们运行 Ganache:

然后可以选择Ganache作为我们的环境:

下一步部署智能合约:

现在可以看到合约已经部署到了Block 2。合约已部署到以下地址:

0x1aC3CD1b37898ed4D3005f3C12b4425A6eFFDc30

对于Ganache,我们在端口 8545运行它,并可以通过web.Web()连接到它。然后可以将ABI数据压缩为一个字符串。我们可以使用we3.eth.contract()调用该合约:

import web3w3 = web3.Web3(web3.HTTPProvider('http://127.0.0.1:8545'))
abi="[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"mul\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"sqr\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"sqrt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"sub\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]"
c = w3.eth.contract(address='0x1aC3CD1b37898ed4D3005f3C12b4425A6eFFDc30', abi=abi)a=5
b=4rtn= c.caller().add(a,b)
print(f"{a}+{b}={rtn}")
rtn= c.caller().mul(a,b)
print(f"{a}*{b}={rtn}")
rtn= c.caller().sub(a,b)
print(f"{a}-{b}={rtn}")
rtn= c.caller().sqr(a)
print(f"sqr({a})={rtn}")
rtn= c.caller().sqrt(a)
print(f"sqrt({a})={rtn}")

现在我们可以简单地调用智能合约中的函数,形式如下:

rtn= c.caller().add(a,b)
print(f"{a}+{b}={rtn}")

下面的代码运行示例验证了对智能合约的调用:

% **python web.py**
5+4=9
5*4=20
5-4=1
sqr(5)=25
sqrt(5)=2

我们需要做的就是编译智能合约并部署它,然后记录智能合约和ABI的地址,最后调用智能合约中的功能。

Source:https://medium.com/@billatnapier/calling-smart-contracts-from-python-977a8a9190e2

关于

ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。

Layer 2道友 - 欢迎对Layer 2感兴趣的区块链技术爱好者、研究分析人与Gavin(微信: chinadefi)联系,共同探讨Layer 2带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”

智能合约:从 Python 调用智能合约相关推荐

  1. 在英文版的remix部署,拿到部署地址在中文版的remix 中 合约地址中输入地址,再部署可以实现调用 java调用智能合约Unmatched arguments from index 2

    目录 java调用智能合约 在英文版的remix部署,拿到部署地址

  2. Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

    Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作. 有三个内置的标准合约模板,分别是ERC20.ERC721 ...

  3. 以太坊Dapp通过web3js部署调用智能合约

    通过web3js部署调用智能合约 1.在线编译智能合约 2.部署合约 3.调用合约 参考视频:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1 1.在线编 ...

  4. 智能合约 web3j Java_Java使用web3j调用智能合约

    1.Java程序引入相关依赖,后面用于调用智能合约中的函数 org.web3j core 5.0.0 org.web3j codegen 5.0.0 org.fisco-bcos solcJ 0.5. ...

  5. 区块链之java调用智能合约(一)编译智能合约

    前言 首先,还是一贯的思路,带着问题学习. 在最后,附带上我的Gitee代码,因为国内访问github有时候真的很蛋疼. 提问 1.Solidity是什么? 2.java如何调用Solidity? 解 ...

  6. 智能合约开发以及调用过程的注意事项

    智能合约特征: 1 合约一旦部署完成,就无法修改. 2 调用合约时触发既定的合约规则,并且执行过程是原子性执行(All or Nothing) 3 以太坊中合约是公开可见的,出发合约的交易也是透明存储 ...

  7. 【智能合约】Go语言调用智能合约 | geth

    目录 1. 获取abi文件 2. 安装abigen工具 3. remix连接私有链 4. 合约部署 5. 初始化私有链节点创世块 6. 合约部署 7. 调用 1. 获取abi文件 合约的接口 在rem ...

  8. 智能合约(一)————智能合约入门

    1.智能合约的基本组成 1.1.程序版本 1.2. 合约声明 1.3.状态变量 1.4.合约方法 在这里constant相当于他声明这个局部变量不能更改,但是他并没有实际作用(实际就只是警示作用) 2 ...

  9. 在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑

    前言 这篇文章咱们先简单的叙述下官方刚发布的最新版本中的native部署java语言编写的智能合约的过程然后再说下存证合约的代码实现逻辑,下一篇文章咱们说下如何根据自己公司的业务逻辑定义合约里面的数据 ...

最新文章

  1. fastjson使用中遇到的
  2. 西游记里学化学,请收下我的膝盖~ | 今日最佳
  3. php如何处理查询请求,PHP如何处理Web请求流程
  4. Linux实验室 CentOS关机大法
  5. [Android] Android 任务栈 【转载】
  6. AndroidManifest.xml 注意事项
  7. 20.Mybatis之逆向工程
  8. C语言之二维数组定义、初始化、赋值、求最大最小、求和
  9. tex常用函数 上下行对齐_latex 部分右对齐
  10. AtCoder Beginner Contest 228
  11. 【最优化导论】全局搜索算法
  12. chrome突然无法复制粘贴了
  13. 数据驱动的互联网营销和运营专用名词速览
  14. 第一行代码-第二版(郭霖著)笔记二(Activity)
  15. 云服务器几核CPU几G内存几M带宽够用
  16. 误操作rm -rf /*之后该如何挽救,除了跑路还能怎么办
  17. ESP8266 WIFI模块调试及在QT Windows下的通讯
  18. 如何在远程工作中保持企业文化的凝聚力
  19. npm和yarn清除缓存
  20. HTC Vive unity 教程【转载】

热门文章

  1. 企业和个人拥有专利的好处,你绝对想不到
  2. 英文面试:期望薪水篇
  3. 爱拼t6输入法 v3.10 完整版 免费下载
  4. 计算机毕业设计ssm缺陷管理系统d6ltf系统+程序+源码+lw+远程部署
  5. python中车票的例题_python练习题
  6. 2021年1月23日松果出行一面
  7. [附源码]计算机毕业设计JAVA网上零食商城
  8. 职场内卷之下,打工人如何突出重围?
  9. 剑指 Offer II 047. 二叉树剪枝
  10. es中的ActionListener