发布网友 发布时间:2022-04-20 10:02
共2个回答
热心网友 时间:2023-07-07 19:01
在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约 的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。
跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠 的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如 何增加一个存取*,使得只有你才能修改这个数字。
代币的例子
接下来的合约将实现一个形式最简单的加密货币。空中取币不再是一个魔术,当然只有创建合约的人才能做这件事情(想用其他货币发行模式也很简单,只是实现细节上的差异)。而且任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。
注意
对于在线solidity环境来说,这不是一个好的例子。如果你使用在线solidity环境 来尝试这个例子。调用函数时,将无法改变from的地址。所以你只能扮演铸币者的角色,可以铸造货币并发送给其他人,而无法扮演其他人的角色。这点在线 solidity环境将来会做改进。
热心网友 时间:2023-07-07 19:02
我们使用solc库来编译合约代码。如果你还记得的话,之前我们提到过 web3js库, 它能够让你通过 RPC 与区块链进行交互。我们将在node控制台里用这个库编译和部署合约, 并与区块链进行交互。
首先,请确保ganache已经在第一个终端窗口中运行:~$ ganache-cli。
然后,在另一个终端中进入repo/chapter1目录,启动node 控制台,然后初始化 web3 对象,并向本地区块 链节点(http://localhost:8545)查询获取所有的账户:
~$ cd ~/repo/chapter1
~/repo/chapter1$ node
> Web3 = require('web3')
> web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
> web3.eth.accounts
['0x5c252a0c0475f9711b56ab160a1999729eccce97''0x353d310bed379b2d1df3b7275e200997016ba3''0xa3ddc09b5e49d654a43e161cae3f865261cabd23''0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5''0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798''0xda695959ff85f0581ca924e549567390a0034058''0xd4ee63452555a87048dcfe2a039208d113323790''0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14''0xba7ec95286334e8634e760fab8d2ec1226bf42''0x208e02303fe29be3698732e92ca32b88d80a2d36']
要编译合约,首先需要载入 Voting.sol文件的内容,然后使用编译器(solc)的compile()方法 对合约代码进行编译:
> code = fs.readFileSync('Voting.sol').toString()> solc = require('solc')> compiledCode = solc.compile(code)
成功编译合约后可以查看一下编译结果。直接在控制台输入:
> compiledCode
相当长一大段输出霸屏...
便以结果是一个JSON对象,其中包含两个重要的字段:
compiledCode.contracts[':Voting'].bytecode: 投票合约编译后的字节码,也是要部署到区块链上的代码。
compiledCode.contracts[':Voting'].interface: 投票合约的接口,被称为应用二进制接口(ABI:Application Binary Interface), 它声明了合约中包含的接口方法。无论何时需要跟一个合约进行交互,都需要该合约的abi定义。你可以在 这里查看ABI的详细信息。
在接下来的几节课,我们将会使用truffle框架来管理合约的编译过程以及与区块链的交互过程。但是, 在使用框架之前,深入了解其工作原理还是大有裨益的,因为框架会将这些脏活封装起来,在出现 故障时并不容易排查错误。
以上内容来自:以太坊DApp开发入门教程