第1章 一台全球计算机
以太坊 历史 以太坊 发展阶段 以太坊 特色第2章 账户是什么
以太坊 基础知识 Keystore 与私钥保存 以太坊 常用钱包 以太坊 EIP-55 账户地址第3章 交易是驱动力
以太坊 交易是驱动力 以太坊 交易发送 以太坊 交易方法 以太坊 交易生命周期 共识与工作量证明 矿工与挖矿奖励第4章 数据结构
以太坊 数据结构 以太坊 Radix树 以太坊 Merkle树 Merkle Patricia树 以太坊 RLP编码 以太坊 状态树 以太坊 交易树 以太坊 收据树 以太坊 区块第5章 构建私链
以太坊 安装geth 以太坊 启动私链 以太坊 接收挖矿奖励 以太坊 转账与收款第6章 部署智能合约
以太坊 部署智能合约 以太坊 什么是智能合约 以太坊 安装编译器 Solc 编译智能合约 智能合约发布准备 部署智能合约 调用智能合约第7章 以太坊虚拟机
以太坊虚拟机 虚拟机的执行结果 虚拟机的执行资源 合约调用合约 虚拟机的输入输出 Gas 花费与退回 虚拟机指令集第8章 Solidity 语法
Solidity 语法练习 Solidity 基础语法 Solidity 语法进阶 Solidity 高级语法 Solidity 安全第9章 Truffle 开发
Truffle 合约开发 编译、测试工具安装 Truffle 启动样例 Truffle ERC20合约 Truffle ERC20合约测试Truffle 冷知识
Truffle 冷知识 短地址攻击 比特币的区块 以太坊与比特币账户的区别 “不可能的三角”问题 ETHASH 挖矿算法第1章 一台全球计算机
以太坊 历史 以太坊 发展阶段 以太坊 特色第2章 账户是什么
以太坊 基础知识 Keystore 与私钥保存 以太坊 常用钱包 以太坊 EIP-55 账户地址第3章 交易是驱动力
以太坊 交易是驱动力 以太坊 交易发送 以太坊 交易方法 以太坊 交易生命周期 共识与工作量证明 矿工与挖矿奖励第4章 数据结构
以太坊 数据结构 以太坊 Radix树 以太坊 Merkle树 Merkle Patricia树 以太坊 RLP编码 以太坊 状态树 以太坊 交易树 以太坊 收据树 以太坊 区块第5章 构建私链
以太坊 安装geth 以太坊 启动私链 以太坊 接收挖矿奖励 以太坊 转账与收款第6章 部署智能合约
以太坊 部署智能合约 以太坊 什么是智能合约 以太坊 安装编译器 Solc 编译智能合约 智能合约发布准备 部署智能合约 调用智能合约第7章 以太坊虚拟机
以太坊虚拟机 虚拟机的执行结果 虚拟机的执行资源 合约调用合约 虚拟机的输入输出 Gas 花费与退回 虚拟机指令集第8章 Solidity 语法
Solidity 语法练习 Solidity 基础语法 Solidity 语法进阶 Solidity 高级语法 Solidity 安全第9章 Truffle 开发
Truffle 合约开发 编译、测试工具安装 Truffle 启动样例 Truffle ERC20合约 Truffle ERC20合约测试Truffle 冷知识
Truffle 冷知识 短地址攻击 比特币的区块 以太坊与比特币账户的区别 “不可能的三角”问题 ETHASH 挖矿算法调用智能合约
我们已经创建了合约的实例,接下来围绕着该合约实例,我们就可以发送交易(消息)来通讯并且设置合约中的存储值了。
下面我们来获取 Vault 合约中的 vault 存储值。由于get方法并不会修改区块链上的存储区,所以呼叫这个方法是在 Geth 节点上通过查询立即实施的,并不会产生交易。
> myContractInstance.get.call() 0
此时 vault 值为 0 。我们来通过发送交易修改该值。我们调用合约的set方法。
> myContractInstance.set.sendTransaction(17, { from: eth.accounts[0], gas: 1000000})
"0x983d92b8ca0d3fc7b2e26ed3c0b6a93221adaa032dd6fe02a5b00378b190a898"
交易签名成功!函数调用返回了我们一个交易的哈希值,该交易已经发出。
当矿工成功接到交易后,会显示如下的日志,打包成功后,存储区被改变了。
INFO [09-16|23:19:01.430] Submitted transaction fullhash=0x983d92b8ca0d3fc7b2e26ed3c0b6a93221adaa032dd6fe02a5b00378b190a898 recipient=0x1f0723b71f5824567E9aCc1f1079E91FCd958a50
我们再来调用一次get方法来验证一下存储区。
> myContractInstance.get.call() 17
至此,我们已经对一个简单的智能合约进行了部署和调用。麻雀虽小、五脏俱全,任何复杂的智能合约在读取和写入操作时候不外乎也是由工具在幕后执行了上述的操作。读者可以领会到 bin和 ABI 两者在部署和调用过程中分别起到了实体和“说明书”的角色,bin 是实际运行在以太坊虚拟机中的二进制合约代码,而 ABI 则供调用者去寻找合约方法的参数和位置,方便使用者进行准确的调用。
下一章:以太坊虚拟机
想必读者已经对以太坊的全局结构有一个清晰的了解,也部署了一份简单的智能合约。在以太坊上最重要的活动除了转账以外,就是编译、运行智能合约(Smart Contract)。智能合约代表了一个以太坊世界里的独立管家。它按照自身代码指 ...
AI 中文社