以太坊学习之开发编译部署调用智能合约

以太坊学习(4)开发编译部署调用智能合约 本文根据汪晓明的视频资料整理,ubuntu16.04测试正确。 1.打开geth控制台~$ geth --datadir ~/pengfan/eth --dev在另一个终端输入~$ geth --dev console 2>>file_to_log_output2.查看、设置编译器> eth.getCompilers() []设置solc为编译器> admin.setSolc("/usr/loca 阅读详情

本文根据汪晓明的视频资料整理,ubuntu16.04测试正确。 

1.打开geth控制台

~$ geth --datadir ~/pengfan/eth --dev

在另一个终端输入

~$ geth --dev console 2>>file_to_log_output

2.查看、设置编译器

> eth.getCompilers()
[]

设置solc为编译器

> admin.setSolc("/usr/local/bin/solc")
Error: exit status 1
    at web3.js:3119:20
    at web3.js:6023:15
    at web3.js:4995:36
    at <anonymous>:1:1

提示错误,更改路径成“/usr/bin/solc”

~$ whereis solc
solc: /usr/bin/solc /usr/local/bin/solc
> admin.setSolc("/usr/bin/solc")
"solc, the solidity compiler commandline interface\nVersion: 0.4.7+commit.822622cf.Linux.g++\n"

再次查看

>eth.getCompilers()
["Solidity"]
  • 1
  • 2

3.编写智能合约

>source="contract test { function multiply(uint a) returns(uint d) { return a * 7; }}"
  • 1

4.编译智能合约

> contract = eth.compile.solidity(source).test
  • 1

这里写图片描述

code——编译后的EVM字节码 
info——编译器返回的原数据 
abiDefinition——应用程序二进制接口定义 
compilerOptions——编译参数

5.准备工作:创建账户并激活

在以太坊上创建智能合约就是使用一个外部账户(EOA)向区块链中发送一个交易。

> personal.newAccount("123456")
"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"
> personal.listAccounts
["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"]
> eth.getBalance(personal.listAccounts[0])
0
> miner.start()
true
> eth.blockNumber
2
> eth.getBalance(personal.listAccounts[0])
15000000000000000000
> address=eth.accounts[0]
"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"
> personal.unlockAccount(address,"123456",10000)
true

这里写图片描述 
6.指定创建合约的账户

> address=eth.accounts[0]
"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"

7.部署合约

部署合约就是将编译好的合约字节码以外部账号发送交易到一个空地址的形式部署到以太坊区块链上


> abi=contract.info.abiDefinition

这里写图片描述 
8.

web3.eth.contract可以创建一个合约对象,这个对象可以在指定地址上初始化一个合约:

> MyContract=eth.contract(abi)
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  eth: {
    accounts: ["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"],
    blockNumber: 14,
    coinbase: "0x733bf98c0e218b430db0fe1d4c9ef04341444a82",
    compile: {
      lll: function(),
      serpent: function(),
      solidity: function()
    },
    defaultAccount: undefined,
    defaultBlock: "latest",
    gasPrice: 20000000000,
    hashrate: 41253,
    mining: true,
    pendingTransactions: [],
    syncing: false,
    call: function(),
    contract: function(abi),
    estimateGas: function(),
    filter: function(fil, callback),
    getAccounts: function(callback),
    getBalance: function(),
    getBlock: function(),
    getBlockNumber: function(callback),
    getBlockTransactionCount: function(),
    getBlockUncleCount: function(),
    getCode: function(),
    getCoinbase: function(callback),
    getCompilers: function(),
    getGasPrice: function(callback),
    getHashrate: function(callback),
    getMining: function(callback),
    getNatSpec: function(),
    getPendingTransactions: function(callback),
    getRawTransaction: function(),
    getRawTransactionFromBlock: function(),
    getStorageAt: function(),
    getSyncing: function(callback),
    getTransaction: function(),
    getTransactionCount: function(),
    getTransactionFromBlock: function(),
    getTransactionReceipt: function(),
    getUncle: function(),
    getWork: function(),
    iban: function(iban),
    icapNamereg: function(),
    isSyncing: function(callback),
    namereg: function(),
    resend: function(),
    sendIBANTransaction: function(),
    sendRawTransaction: function(),
    sendTransaction: function(),
    sign: function(),
    signTransaction: function(),
    submitTransaction: function(),
    submitWork: function()
  },
  at: function(address, callback),
  getData: function(),
  new: function()
}

9.将合约部署到区块链上

>myContract=MyContract.new({from:address,data:contract.code})
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  address: undefined,
  transactionHash: "0xc99efdc9ffb6f8283556b5de80c76f9bb3b37faf62bb8374ddf79480257866ac"
}

10.检查交易池,有一个待处理事项,要通过挖矿让交易生效,红色框中说明交易已经发送到区块链中了,等待矿工确认。

> txpool.status
{
  pending: 1,
  queued: 0
}
  • 这里写图片描述
> txpool.status
{
  pending: 0,
  queued: 0
}
> miner.stop()
true

11.合约写进区块链之后就可以调用了(合约交互),以下为合约调用代码,通过abi取合约对象

使用eth.contract来定义一个合约类,定义的合约类遵从ABI定义

> Multiply7=eth.contract(contract.info.abiDefinition)
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  eth: {
    accounts: ["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"],
    blockNumber: 24,
    coinbase: "0x733bf98c0e218b430db0fe1d4c9ef04341444a82",
    compile: {
      lll: function(),
      serpent: function(),
      solidity: function()
    },
    defaultAccount: undefined,
    defaultBlock: "latest",
    gasPrice: 20000000000,
    hashrate: 0,
    mining: false,
    pendingTransactions: [],
    syncing: false,
    call: function(),
    contract: function(abi),
    estimateGas: function(),
    filter: function(fil, callback),
    getAccounts: function(callback),
    getBalance: function(),
    getBlock: function(),
    getBlockNumber: function(callback),
    getBlockTransactionCount: function(),
    getBlockUncleCount: function(),
    getCode: function(),
    getCoinbase: function(callback),
    getCompilers: function(),
    getGasPrice: function(callback),
    getHashrate: function(callback),
    getMining: function(callback),
    getNatSpec: function(),
    getPendingTransactions: function(callback),
    getRawTransaction: function(),
    getRawTransactionFromBlock: function(),
    getStorageAt: function(),
    getSyncing: function(callback),
    getTransaction: function(),
    getTransactionCount: function(),
    getTransactionFromBlock: function(),
    getTransactionReceipt: function(),
    getUncle: function(),
    getWork: function(),
    iban: function(iban),
    icapNamereg: function(),
    isSyncing: function(callback),
    namereg: function(),
    resend: function(),
    sendIBANTransaction: function(),
    sendRawTransaction: function(),
    sendTransaction: function(),
    sign: function(),
    signTransaction: function(),
    submitTransaction: function(),
    submitWork: function()
  },
  at: function(address, callback),
  getData: function(),
  new: function()
}

12.指定特定地址,得到该地址上的合约实例

> myMultiply7=Multiply7.at(myContract.address)
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  address: "0x8bd328e25b6846e01dd855123374fb285454cf0a",
  transactionHash: null,
  allEvents: function(),
  multiply: function()
}

在实例中能够调用的函数有两个:allEvents和multiply。multiply显然是一开始我们定义合约的时候写的函数。我们可以使用两种方法来调用multiply函数:sendTransaction(3, {from: address})和call(3)。

> myMultiply7.multiply.sendTransaction(3, {from:address})
"0x71eed110365e80fb4d9436c30f5480fb5522afa629f629be816d4b07ef8d7c83"
> myMultiply7.multiply.call(3)
21
> myMultiply7.multiply.call(8)
56

使用sendTransaction(3, {from: address})返回的值为一个字符串,这个字符串代表的是发送的交易的hash值。使用这个方法调用合约将会使调用的结果成为全局共识的一部分 
使用call(3)这个方法调用合约只会在本地上运行

要改变合约状态,只能用第一种方法。

转自:https://blog.youkuaiyun.com/p03721/article/details/54176353

如果你希望高效的学习以太坊DApp开发,可以访问汇智网提供的最热门在线互动教程:

其他更多内容也可以访问这个以太坊博客。


一起学:以太坊智能合约开发 课程介绍 无论在科技圈还是金融圈,“区块链”俨然成了最热的词汇。2016年,区块链写入了国家的十三五规划中;2017年,央行基于区块链技术的数字票据交易平台测试成功;同年,工信部发布了首个区块链参考架构标准。
经过2017年如火如荼的投资盛宴,区块链开始逐渐走向应用落地,业内都在积极探索使用场景。如金融领域的资产贸易、支付系统、金融服务,其他领域的电子商务、社交通讯、游戏娱乐等等。同时,BAT、迅... 阅读详情

相关推荐

以太坊开发攻略六:智能合约的编译、部署

以太坊开发攻略一:准备篇上:各种相关工具安装和环境配置 以太坊开发攻略二:准备篇下:以太坊的编译、安装 以太坊开发攻略三:以太坊私有链的搭建(基于ethash共识挖矿) 以太坊开发攻略四:以太坊私有链的运行(基于ethash共识挖矿) 以太坊开发攻略五:以太坊的编程接口web3.js API的使用上:转账 我的个人博客更新更快噢~ 以太坊智能合约默认的编程语言是Solidity,运行环境是以太坊虚拟机。智能合约以交易的形式发送到以太坊网络中,以太坊会为每一个智能合约创建一个合约账户,讲合约的字节码保存在其中

qq_40967164的博客 1862

以太坊智能合约编译,部署以及打包调用【Mac系统】

本文主要讲解如何进行智能合约的编译,部署以及打包,首先,读者需要会编写智能合约,了解solidity语言以及以太币。 我这里环境是Mac系统,linux系统命令也是类似。 1.安装geth客户端以及操作 brew tap ethereum/ethereum brew install ethereum 默认安装目录:/usr/local/Cellar/ethereum/版本 在安装成功之后进入...

不清不慎的博客 1907

以太坊虚拟机EVM介绍,智能合约详解

指的是“一套以数字形式指定的承诺,包括合约参与方可以在上面执行这些承诺的协议”。早在1994年,美国计算机科学家尼克·萨博(Nick Szabo)就提出了智能合约的概念。智能合约是一种基于区块链技术的自动执行合约的计算机程序。它们是一组以代码形式编写的、在区块链上运行的规则和逻辑。智能合约定义了在满足特定条件时应该执行的操作,而无需中介方的干预。以太坊是最为著名的支持智能合约的区块链平台之一。在以太坊中,智能合约是用一种称为Solidity的编程语言编写的。

ydl1128的博客 5727

智能合约编写实例

前言本文主要介绍智能合约的工作原理及其部署过程。合约部署流程一般来说,部署智能合约的步骤为1: 启动一个以太坊节点 (例如geth或者testrpc)。 使用solc编译智能合约。 => 获得二进制代码。 将编译好的合约部署到网络。(这一步会消耗以太币,还需要使用你的节点的默认地址或者指定地址来给合约签名。) => 获得合约的区块链地址和ABI(合约接口的JSON表示,包括变量,事件和可以调用的方法

张童鞋 4万+

以太坊智能合约之如何执行智能合约?

区块链技术在顶级技术中占据主导地位的主要原因在于其去中心化。虽然区块链的主要目的是在没有中心的情况下维护交易记录,但为了实现自动化,智能合约被引入。那么在写完智能合约之后呢?在本文的这个以太坊智能合约教程中,我们将了解如何使用Truffle Ethereum和以太坊专用网络来执行智能合约。 我们将在以太坊智能合约教程中查看以下主题: 使用案例:保险流程中的智能合约 智能合约的好处 安装先决条件 ...

mongo_node的专栏 4052

以太坊搭建私有链和部署智能合约

以太坊搭建私有链和部署智能合约 文章目录以太坊搭建私有链和部署智能合约1. 实验环境2. 以太坊安装2.1 安装相关组件2.2 安装及配置Golang环境2.3 克隆并编译geth2.4 安装及配置cmake环境2.5 防火墙2.6 时钟同步3. 私有链创世区块搭建4. 私有链节点加入5. 区块字段解释5.1 最新区块5.2 各个字段解释5.3 补充6. 日志输出解释(默认日志等级)6.1 挖矿...

Wonderful_sky的博客 5360

区块链学习(2) 智能合约部署到以太坊私有链并交互(mac版)

创建私有链 私有链的创建在上一篇文章有提到,请直接戳这里. 合约代码编写 合约代码是用的solidity语言写的。solidity语言跟java语言类似,所以会java的来写solidity,还是很方便的。这里我把solidity英文官网和中文文档都列出来了,然后找了一个例子直接拿来用了,一个简单的乘法。有更多需求的请自行查阅文档。 新建一个文件test.sol,在文件中如下编写: ...

罗小辉的专栏 4404

深入探索基于以太坊的智能合约开发与测试:从基础到实战

智能合约(Smart Contract)是以太坊平台上运行的自主执行代码,类似于传统合同的“自动化”。在以太坊中,智能合约不仅保存状态,还能自动执行逻辑操作。通过以太坊的虚拟机(EVM),智能合约被部署在区块链网络上,所有交易都是公开和不可篡改的。基于以太坊的智能合约开发涉及多个方面,包括合约编写、编译、部署、与合约交互以及测试等。在整个开发流程中,开发者必须特别注意智能合约的安全性和性能问题,确保合约的代码无漏洞且逻辑严谨。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1498

Linux环境以太坊私有链搭建

一、软件的安装 1.安装node和npm 首先执行下面语句进行安装: curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - sudo apt-get install -y nodejs 安装完成通过查看版本进行检查: node -v npm -v Node.js官网:https://nodejs.org/en/ 2.安装...

weixin_43832070的博客 2357

以太坊智能合约学习笔记:使用Truffle框架开发部署智能合约

truffle是一个智能合约的开发框架,具体的就不介绍了,我们主要是说说怎么使用这个框架来进行智能合约的开发,官网戳这里。 安装 创建项目 编译合约 部署 部署到geth 部署到truffle的内建测试网络 部署到Ganache 交互 geth控制台合约交互 truffle的内建测试网络交互 Ganache测试网络交互 网页交互 安装 首先我们要先安装npm和truf...

mumufan05的专栏 1万+

Linux环境下带界面以太坊客户端搭建与使用指南

将常用操作写入JavaScript脚本,提升效率:var tx = {to: to,sendEther(eth.accounts[0], "0x<目标地址>", 1);运行脚本:总结本章从账户创建到交易操作,再到智能合约部署与调用,全面覆盖了以太坊私有链下的账户与交易管理流程。通过实际操作与代码示例,读者应已掌握Geth命令行工具的使用、账户管理技巧、交易签名广播机制、合约部署调用流程,以及脚本自动化操作方法。这些技能将为后续开发去中心化应用(DApp)打下坚实基础。

weixin_42601134的博客 981

【区块链】实战·以太坊智能合约编程引导

区块链前沿技术实战+理论讲解,以案例剖析最热区块链以太防智能合约编程技术。带领学员实操演练,指导学员现场调试,并且提供完整的虚拟机文件,以保证学员下载后可以正常使用源码。通过完成简单合约,从运行环境、代码、deploy、调用/测试,来让开发者理解实实在在的合约,建立开发者合约与代码、合约与应用上的联系。&gt;&gt;&gt;立即免费报名课程安排第一课时,实例,代码实例:买卖,一手交钱,一手交货。...

优快云学习 800

Solidity入门-函数初级

函数在所有的语言中都是一种常见类型。Solidity中的函数关键字是function,我们先来看一个最简单的例子: pragma solidity ^0.4.0; contract SimpleFunc { function hello(uint i){ //todo } } 函数的参数 函数的入参定义与变量类似。我们可以省略未使用到的参数变量名,如下例所示: pragma solidity ^0.4.0; contract Simple { //函数的入参如变量的定义方式 //未使用的参数可以省略变量名 function InputP

以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践

文章目录初探以太访智能合约remix小demo以太坊核心概念交易/事务( Transaction )区块参考 初探以太访智能合约 remix小demo https://remix.ethereum.org 目前尝试 Solidity 编程的最好方式是使用 Remixo Remix 是一个基于浏览器的 Solidity IDE , 它集成了 Solidity 编译器、运行环境 ,以及调试和发布工具。 使用浏览器打开网址 https://remix.ethereum.org 官方demo // SPDX-Lic

西京刀客 4060

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 775

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2882

以太坊如何部署智能合约

以太坊社区开发并开源了非常好用的在线 Solidity 集成开发环境Remix,可以方便的在 Remix 中编写、部署、测试智能合约,Remix 提供了强大的自动完成,语法高亮,实时编译检查错误等。打开remix,界面如下: 在代码区输入一下合约代码: pragma solidity ^0.4.21; contract Phone { string public model; ...

zengchen73的专栏 1万+

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 462

区块链开发(二)部署和运行第一个以太坊智能合约

区块链开发(二)部署并运行第一个以太坊智能合约 李赫2016年8月10日         网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境,然后部署Geth或者Eth节点,然后一步一步生成钱包、ABI、合约地址进行部署,对初学者来说晦涩难懂而且容易失败,本文主要介绍如何在图形化界面下一键部署和调用智能合约。对于其他区块链知识,请参考我

李赫的专栏 4万+

OpenWRT系统启动流程全解析:从procd到ubus的完整链路(附源码分析)

本文深入解析了OpenWRT系统从内核移交控制权到用户空间服务就绪的完整启动链路。核心聚焦于进程管理器procd与通信总线ubus的协同工作机制,通过源码分析揭示了状态机转换、服务注册与事件分发的内在逻辑,为系统定制、启动优化与故障调试提供了清晰指南。

weixin_28335283的博客 531

内网渗透—横向移动&IPC横移&Impacket套件&CS插件

以上便是IPC横移的知识。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1890

使用geth在以太坊私链中部署合约并调用智能合约的函数

使用geth在以太坊私链中部署合约并调用智能合约的函数 在上一个教程中我们已经创建了一个私链了,接下来我们将在这个私链上创建用户并挖矿,再使用此用户来部署智能合约,并调用其中的函数 环境:linux操作系统 首先打开geth控制台 sudo geth --datadir "./" --nodiscover --networkid 528 --ipcdisable --port 3333 --rpc --rpcport 4444 --rpcapi="db,eth,net,web3,personal"

qq_43533623的博客 5483

第1章第11节:创建可容纳多行滚动文字的输入框TextEditor [SwiftUI快速入门到实战]

TextField可以让用户输入单行的文字内容,若想输入多行的文字内容,可以使用能够容纳多行滚动文字的 TextEditor。 定义一个字符串属性,用来存储用户输入的文字内容。接着定义一个布尔属性,用来标识是否弹出警告窗口,以显示用户输入的内容。 TextEditor是由UIKit中的UITextView演变而来,因此可以在init方法中,通过UITextView修改TextEditor的外观属性。 添加一个VStack视图,作为子视图的容器。 创建一个TextEditor,Te..

互动教程网[www.hdjc8.com] 832
上一篇: 以太坊开发入门,完整入门篇
下一篇: 星际文件存储IPFS是如何颠覆云存储的?
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值