区块链学习 - solidity合约部署

2018-02-06 03:07:05

区块链原理

通过https://anders.com/blockchain/hash.html可以直观的了解hashblock(区块)、blockchain(区块链)、distributed(分布)、tokens(代币)各个概念。

开发环境配置

1、 MetaMask钱包

1.MetaMask是什么?

MetaMask是一款在谷歌浏览器Chrome上使用的插件类型的以太坊钱包,该钱包不需要下载,只需要在谷歌浏览器添加对应的扩展程序即可,非常轻量级,使用起来也非常方便。

2.MetaMask安装

chrome浏览器安装MetaMask,直接用MetaMask创建钱包或者通过myetherwallet.com创建钱包,然后用MetaMask导入钱包私钥即可。 开发测试时,最好新建一个测试钱包,万一自己的币搞没就裂了~~

3.MetaMask常用功能

如上图所示,第一个为正式网络,也就是ETH的公链,真实的币就存在公链上。后两个是两个测试网络,点击后便会切换到测试网络,钱包的地址也会随之改变。为了测试方便,在测试网络的钱包中免费获取一些测试用的代币。

4.测试代币获取

Ropsten Test Network测试网络下,点击BUY->ROPSTEN TEST FAUCET会跳转到https://faucet.metamask.io/页面,可以请求获取测试用的eth代币,也可以给别人发送测试代币。操作完成后钱包会显示相应的测试代币数量。

Kovan Test Network测试网络下,获取测试代币的方式是:加入gitter中的faucet组织,链接为https://gitter.im/kovan-testnet/。加入后,MateMask钱包在Kovan Test Network测试网络下,复制当前测试环境下的钱包地址,然后在gitter的社区中,发送自己的钱包地址(@管理员epheph),这位雷锋大兄弟会给你的钱包发送5个测试代币,最后别忘了来句日常感谢~

2、solidity开发环境配置

atom编辑器安装以下两个插件: autocomplete-solidity language-ethereum

3、solidity代码示例

solidity代码文件后缀为.sol 以下是完整的,最简单的solidity合约代码:

// pragam 关键字
// solidity 当前语言
// 0.4 主版本
// .19 副版本
// ^向上兼容,solidity (0.4.19~0.4.99)都可以编译,0.5则不能编译
pragam solidity ^0.4.19;

// construct 关键字声明类
contract Person {  
    uint age = 0; // 默认类型为internal
    string internal name = "佩奇";
    string public homeAddress = "北京市朝阳区";    // public声明的属性,会自动生成同名的get函数,返回该属性值
    string private company = "孔壹学院";

    // 构造函数,与类名同名,首次初始化时调用
    function Person() public {
        age = 18;
    }

    // set方法
    function setCompany(uint a) public {
        age = a;
    }
    // get方法
    function getCompany() view public returns (uint) {
        return age;
    }

    function getCurrentAddres() view public returns (address) {
        // msg.sender 返回当前操作合约的钱包的地址
        return msg.sender;
    }

    // 普通函数
    function kill() public{
        // 析构函数,调用时销毁当前合约
        selfdestruct(msg.sender);
    }
}

contract ChildPerson is Person {  
    function test() public {
        age = 100;
        name = "AWM";
    }
}

solidity代码中一定要加;!!!!!!,包括第一句pragam solidity ^0.4.19;

  
属性访问权限:
public:  
1.会生成一个和属性名同名的get函数,这个函数返回属性自己  
2.合约内部可直接访问  
3.子类可继承属性

internal:  
1.合约内部可直接访问in  
2.子类可继承属性

private:  
1.合约内部可直接访问  

4、部署合约

  1. 打开http://remix.ethereum.org/网站,url后会自动补齐当前最先版的solidity``sdk版本,注意自己写的代码向上兼容性。

  2. 将上述代码直接粘贴到左侧编辑器中,会自动编译查错,正常编译通过后,可以在右侧面板点击run选项。各选项解释如下:

    • Environment指合约要部署的网路环境,JavaScript VM是本地的测试网络;injected Web3是发布到公链。

    • Account指部署合约的钱包地址,因为部署合约需要往公链上写数据,所以需要消耗代币。选择本地测试网络的话,有默认的五个免费的钱包,里面各有100以太币。选择部署到公链的话,通过选择MateMask的网络环境(主网或两个测试网络),Account会显示对应的网络环境下的钱包地址(钱包中必须要有代币才行)

    • Gas limitValue默认即可

  3. 完后下方可以选择solidity代码中声明的类,也就是我们要部署到网络中的类,对应上述代码就是PersonChildPerson两个类选择其一。

  4. 之后点击create,支付完所需的代币手续费后,等待部署完成即可,部署成功后便可以在下方看到合约的地址信息,及合约中暴露出来的各种方法,如getAgesetAge等,可以调用这些方法从部署在网络上的合约中写入数据(花费代币)及读取数据(免费),调用kill方法时会执行析构函数selfdestruct,从网络中销毁合约。

至此,一个简单的合约,从代码编写到部署上线的整套流程结束。

Golang channel进阶

将向管道中写入数据的称为“生产者”,从管道中读取数据的称为“消费者”。 1、生产者与消费者关系 在上篇文章中,生产者与消费者是1:1及n:1的关系,那么能不能实现1:n的关系嘞?即一个生产者向管道添加数据,多个消费者从管道读取?示例如下: 1:2案例: package main import ( "fmt" ) // 生产者 对 消费者 :1 -> 2 func main() { c := make(chan int) done := make(chan bool) // 生产者:大黄 go func() { for i := 0; i < 100; i++ { fmt.

solidity函数类型及truffle使用

1、solidity类的多继承、重写 solidity类具有多继承的特性: pragma solidity ^0.4.19 contract Animal1 { uint age; } contract Animal2 { string weight; } contract Dog is Animal1, Animal2 { /** Dog 会继承 Animal1 及 Animal2 两个类 */ } 重写与其他语言相通,即子类的同名函数会覆盖从父类继承的方法: pragma solidity ^ 0.4 .19; contract Animal { function testFunc() public pure returns(string) { return "Animal testFunc"; } } /** 子类重写了从父类继承过来的方法,会以子类的方法为基准 */ contract Dog