主页 > imtoken安装下载地址 > 课程回顾 | roysue:第一个智能合约,部署在树莓派上
课程回顾 | roysue:第一个智能合约,部署在树莓派上
11月30日,在【传统安全X区块链】群直播课程中,看学讲师、看学区块链研究员Roysue为区块链和安全爱好者分享了一场知识盛宴《第一个智能合约》Deploy on the Raspberry Pi,让我们一起复习~
roysue:今天我们来学习第一个智能合约,也就是说前后端的交互是通过智能合约来实现的。 现在让我们实现一个最基本的操作,从 hello world 开始。 (2018/11/30)
我们的第一个智能合约
首先,我们将在以太坊上构建 Greeter,一个 Hello World 智能合约。 它被描述为“一种生活在以太坊上的智能数字资产,可以与任何与之交互的人进行对话”,即你说什么,它也说什么。
在第一部分中,我们描述了如何在 solidity 中编写智能合约。 类似于Java,会被编译成字节码,以太坊的虚拟机会执行这个字节码。 现在让我们安装编译器。 笔记本上也安装了编译器,命令行如下:
$ sudo add-apt-repository ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install solc
编译会占用大量的系统资源,在桌面平台上比在树莓派等平台上编译要快很多倍。 这里安装的solc是solidity语言编译器。 solc不仅有一个版本,还有很多分支。 我们在这里安装最原始的版本。 从solidity官网可以看到很多编译器都可以使用。 官方推荐的是Remix,安装步骤有文档说明。
其他版本的安装我们就不演示了,只演示正式版的安装。
solc编译器的安装
首先新建一个文件夹,
```js
mkdir solc
cd sol/
```
然后,创建一个新文件
```js
touch Greeter.sol
```
用你喜欢的编译器打开 Greeter.sol 文件并写入以下内容。
```js
contract Mortal {
/* Define variable owner of the type address */
address owner;
/* This function is executed at initialization and sets the owner of the contract */
function Mortal() { owner = msg.sender; }
/* Function to recover the funds on the contract */
function kill() { if (msg.sender == owner) selfdestruct(owner); }
}
contract Greeter is Mortal {
/* Define variable greeting of the type string */
string greeting;
/* This runs when the contract is executed */
function Greeter(string _greeting) public {
greeting = _greeting;
}
/* Main function */
function greet() constant returns (string) {
return greeting;
}
}
编译:
```js
>$ solc -o target --bin --abi Greeter.sol
ABI可以理解为符号。 在 Windows PE 中,符号集成在 Windows 可执行文件中。 在编译器中,符号没有集成到可执行文件中。
这张图是它的demo编译的结果。 尽管有一些注意事项,但仍会生成一个目标文件夹,其中包含四个文件:Greeter 和 Mortal 的 ABI 和 bin 文件。 我们只需要Greeter的这两个文件,因为它集成了Mortal的契约。
接下来就是将Greeter的ABI和bin打包到智能合约中。 可以将所有的命令一句一句的敲进去,这样就可以打包了; 也可以将所有命令保存为脚本,命名为greeter.js,直接加载脚本将ABI和binary打包到智能合约中。 让我们再来一次。
可以看到最终的编译结果是16进制的,并且符号都标注的很清楚。
var greeterFactory = eth.contract([{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"greet","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}])
var greeterCompiled = "0x" + "608060405234801561001057600080fd5b5060405161039b38038061039b83398101806040528101908080518201929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060019080519060200190610089929190610090565b5050610135565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100d157805160ff19168380011785556100ff565b828001600101855582156100ff579182015b828111156100fe5782518255916020019190600101906100e3565b5b50905061010c9190610110565b5090565b61013291905b8082111561012e576000816000905550600101610116565b5090565b90565b610257806101446000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b514610051578063cfae321714610068575b600080fd5b34801561005d57600080fd5b506100666100f8565b005b34801561007457600080fd5b5061007d610189565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100bd5780820151818401526020810190506100a2565b50505050905090810190601f1680156100ea5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610187576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102215780601f106101f657610100808354040283529160200191610221565b820191906000526020600020905b81548152906001019060200180831161020457829003601f168201915b50505050509050905600a165627a7a72305820467ac32dfa208b06ba97f3a7f72d039f2f912938b54b9881c603d80f6b004df40029"
var _greeting = "Hello DesignSpark!"
var greeter = greeterFactory.new(_greeting,{from:eth.accounts[0],data:greeterCompiled,gas:1000000}, function(e, contract){
if(e) {
console.error(e); // If something goes wrong, at least we'll know.
return;
}
if(!contract.address) {
console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
} else {
console.log("Contract mined! Address: " + contract.address);
console.log(contract);
}
})
var _greeting 可以定义你想说什么,greeterFactory 可以定义你的新实例16年挖以太坊教程,gas 是消耗单位,我们默认的账户实例要加载到区块链上。
console.error(e) 是打印的错误。 如果合约执行成功,我们会打印一条日志,表示合约已经执行,hash加载成功。 释放哈希,哈希将在矿工附近等待。 如果合约部署失败,或者合约被挖矿,合约地址将被暴露。
var greeterFactory = eth.contract()
var greeterCompiled = "0x" + ""
`ABI`是一个接口,可以理解为一个符号,而`bin`是纯粹的二进制。 所以接下来的编译部分是符号化的,部分是纯二进制的。
查看版本信息
solc --version
0.4.24版本的信息还是比较重要的,先完成实验吧。
安装一个可以读取目录的工具:
sudo apt install tree
接下来,如果我们确保在合适的节点上运行矿工,则解锁我们希望部署的联系人的计算机帐户。 在我们的例子中16年挖以太坊教程,我们在笔记本电脑的 geth 控制台上再次执行了 miner.start() 并决定通过 Raspberry Pi 部署合约。
所以我们在 Raspberry Pi 上输入:
> personal.unlockAccount(eth.coinbase, "")
> loadScript("greeter.js")
成功! 在同步消息中,我们可以看到正在发送合约消息,等待挖矿通知,然后是挖矿完成通知。
我们可以通过以下方式验证这一点:
> eth.getCode(greeter.address)
我们在树莓派上查看账户余额,发现略有下降。
资金将转到相应的矿工,在我们的例子中,是笔记本电脑上的帐户。
最后,我们可以执行合约:
> greeter.greet();
正如 Ethereum 网站上所述,这会立即返回,因为调用不会更改区块链上的任何内容并且没有 gas 成本。
在这种情况下,如果笔记本正在挖矿,加载合约,先将数据传输到树莓派,在树莓派上部署内容,然后在树莓派上输入命令。 运行节点信息,先解锁账号,加载一次greeter.js,加载后立马可以看到。
> personal.unlockAccount(eth.coinbase, "")
> loadScript("greeter.js")
挖矿时,同步信息会显示在节点上。
先挖矿吧
miner.start()
检查挖矿速度,
htop
您可以在合约地址上看到内容。
因为我们需要 gas 来部署智能合约。 我们可以执行合约:
> greeter.greet();
合约查询不会消耗wei。 如果涉及合约存储和缓存,会消耗wei。 所以我们可以在网上查询区块的信息,不会涉及到wei的消耗。
文末会有总结。 其实这个合约就是一个官方教程。 由于它不对区块链进行任何更改,因此不消耗气体。 最后我们可以研究文档和调试。
文档和调试
它的建议是,以太坊发展很快,任何合约都可能在诞生不久就过时,各种官网和wiki也会过时,即使是比较权威的人写的文章也会过时。 一个典型的例子是官网的一个2017的例子已经不再维护,被认为是过时的。
以太坊运行速度很快,各种改进将提高其稳定性和效率。 如果有问题,请检查您自己的文档是否已过时,以及以太坊的版本是否与文档匹配。 在测试链上,使用旧版本无所谓,但旧版本可能不适用于主网。
如果要删除刚刚做的所有实验,执行以下命令删除所有文件夹。
```js
$ geth removedb --datadir .designspark
```
重新创建一个文件夹,重新创建一个进程,就可以开始做自己的私有链了,重新创建一个创世块。
最后,让我们总结一下我们做了什么。
1. 理论上,树莓派运行智能合约,树莓派参与私有链。 即使树莓派参与私有链,采用轻同步模式,参与主网也没有问题。
2、私链是如何搭建的。
3.私链在两个账户之间转账,编译智能合约,在树莓派上应用智能合约,调用函数。
如果我们现在开始,我们可以加入更多的节点,运行更复杂的智能合约,做更复杂的事情。 我们这节课的任务就完成了。
后面我们会介绍智能合约的编写到部署,根据需求开发智能合约,最后讲智能合约的安全开发。
问题和答案
接下来,让我们一起来看看上期课程的精彩问答吧~!
学生:桌面是用solc还是remix编译合约程序?
r0ysue:Remix 在云端,不在桌面。 这只是一个网页,实际上我认为它是随机的。 它是这样写的:
然后编译,$solc -o target --bin --abi Greeter.sol:
学生:用solc编译后,应该是中间代码吧? 感觉你在部署一个交叉编译环境...
r0ysue:这张图是它demo编译的结果。 你知道什么是“交叉编译环境”吗? 交叉编译环境是指在x86机器上编译arm指令的代码。 换句话说,我们在 x86 机器上编译在 EVM 虚拟机中运行的字节码。 编译后就是EVM虚拟机的字节码。 在这一点上,remix 和 solc 的功能是一样的。 虽然有一些注意事项,但会生成一个目标文件架。 包含四个文件夹:Greeter 和 Mortal 的 ABI 和 bin 文件。
学生:你以后不打算用在树莓派上吗? 你的机器是x86系统,树莓派是arm系统。 你需要一个交叉编译环境来移植它。
r0ysue:编译完成后,就是EVM的字节码。 这个字节码可以在EVM的虚拟机中运行,而不是直接在arm上运行,不需要arm的机器码。
……
本教程视频已上传至看学学院【传统证券X区块链】专栏
()
我们邀请您参加下一次活动~
【传统证券X区块链】下期活动来啦~!
讲座时间为2018年12月8日19:00-20:00~
讲师:看雪讲师,看雪区块链团队成员,xrosherat,上海交通大学密码学实验室成员。
扫描下方海报二维码添加看学人员,进群免费学习~!
- 结尾 -
往期热点新闻:
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com