小二

小二 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

小二 发布了文章 · 7月15日

六、 Conflux Bounty介绍

bounty 是conflux基金会为每一个通证找到价值的赏金平台。conflux的粉丝们可以通过做贡献任务,获取FC 粉丝币,该币具有其一定的粉丝共识。也是conflux目前唯一一种获取FC的途径。

一、板块组成

bounty分为几个板块:技术、品牌、社群、资源、其他等。

技术板块:会发布一些技术相关的赏金任务,让技术粉丝可以在该板块下贡献自己的力量。比如开发一些dapp,开发钱包等。

品牌板块:主要是在各大网络平台分享conflux的各种最新公示,扩大conflux的影响力。目前每周都会有的奶茶任务、三明治任务等等。

社群板块:粉丝们通过自主建里兴趣爱好群,帮助其他粉丝们解答一些社群问题,以及活跃下日常气氛等任务。

资源板块:将身边一些企业以及资源引入conflux社区,扩建conflux生态等任务。

其他板块:主要是一些其他的零散任务。

二、FC介绍

FC可以提取到个人的钱包,目前FC已经在moondex上开放了交易对,大家可以进行交易等。

关于守护者,大家经常看到守护者V1,V2的字样可能不知道代表什么,V1守护者是粉丝币达到200后授予的一种身份证明。FC达到2000个以后,就能晋升V2守护者,V2守护者有些特殊福利。

获取FC的唯一方式:只有通过bounty能够获取, bounty链接 欢迎大家一起参与社区建设

三、感谢

感谢大家观看本期文章、对conflux感兴趣的小伙伴,欢迎添加我的微信 15832013094 ,备注“对conflux感兴趣”。

查看原文

赞 0 收藏 0 评论 0

小二 发布了文章 · 7月15日

五、基于conflux 插件钱包的应用

第一讲 conflux-portal 的安装与使用

区块链应用的形式主要以网页端、DAPP端为大部分场景,以及少量服务端场景。本节课程将教会大家如何Google Chrome 浏览器上创建一个在conflux公链上的钱包。需要大家进行下载插件、安装插件、通过助记词创建钱包,然后得到属于你个人的钱包的过程。

一、 下载插件

1、 conflux-portal 下载地址:https://github.com/Conflux-Ch...

2、 大家打开地址后进入到下载地址页面是下图的样子,如图:

大家不难发现本教程中最高的可以使用的版本是 0.2.2 那么我将会为大家演示如何安装并使用 conflux-portal-chrome-0.2.2.zip 版本的插件钱包。

3、 点击 conflux-portal-chrome-0.2.2.zip 将会下载谷歌的chrome的插件版本。

4、 下载好以后放在电脑的任何一个地方都可以,不建议放在系统盘,本教程放在D盘目录下了。

二、安装插件

1、 我们将压缩包进行解压(友情提示:大家不要直接解压本目录下面,需要指定一个目录解压,因为这个压缩包里面没有包裹一层,希望不要被坑,我是解压到conflux-portal-chrome-0.2.2目录下面了),下面打开大家的Google Chrome ,按照下图的三部打开扩展程序面板,如图:

2、 大家的扩展程序面板可能不是开发者模式,因此需要打开开发者模式,点击开发这模式旁边的按钮即可。

3、 打开以后的面板里面将会有‘加载已解压扩展程序’等栏目,我们继续点击这个栏目

4、 找到我们解压的目录,点击确定。安装步骤完成。

5、 上面的步骤完成后会自动跳转到如图的页面说明我们安装插件成功可以使用了,如图:

三、创建钱包

1、 接着上面步骤中的开始,我们点击‘开始使用’进入到conflux-portal使用页面,如图:

2、上图中有两个选择,我们可以导入之前已经创建的钱包,也可以创建一个新的钱包。相信阅读本教程的小伙伴大部分都没有自己的钱包呢,我将会先创建钱包,在进行导入钱包,方式进行讲解,有钱包的小伙伴可以直接跳到导入钱包教程。创建钱包会跳入下面页面,没啥好犹豫的直接 ‘I agree’ 同意就好了。如图:

4、 点击同意后会进入到下面页面,这里我们要输入密码两次,并且勾选同意协议按钮,一定要记住你的密码,不然丢失后,可是找不回来的。如图:

5、点击‘创建’后跳转到助记词页面,这个助记词一定要记住,记不住哪个小本本记起来。如图:

6、 点击显示密语,记下来就好了,本教程使用的是随便创建的一个钱包因此公布出来助记词也没关系,大家的助记词千万别泄露了,不然你的钱包要小心了。

able peanut rate myself menu funny logic focus hedgehog arrest real box

7、 下面还有一步就是将助记词完整的填入确认页面,这一步真的是多余的,我本人很不喜欢,但是没办法,谁叫我们是使用者呢,填写吧。如图:

8、输入正确的顺序后,也就创建成功了,如图:

9、 点击‘全部完成’进入钱包页面。如图:

10、 拥有一个自己的钱包是不是很简单,小伙伴们可以动起手来搞一个自己的钱包玩玩了。这个是本教程的公钥地址 “0x12Ea0fa7d2aCaA4ef52Ee7650bd16f56d60B51dC” 公钥地址是可以给任何人看的。密钥地址一定要本人收好。

四、导入钱包

我们创建完了钱包以后,助记词以及密码一定要记住,这样我们就可以在任何一个可以使用助记词登录的应用上登录账户了。下面我们将使用本教程中创建的钱包演示如何导入钱包。

1、插件钱包导入入口有两个一个是刚刚安装后出现的导入入口,还有可以通过插件的程序角标的入口,我们先以角标方式导入,下面页面是我将插件关闭后在打开后出现的,有一个“使用账户助记词导入”,如图:

2、点击这个“使用账户助记词导入”,进入下面页面,如图:

3、我们使用上面的助记词,填入,密码重新输入也可以,也可以使用我们之前的密码,都可以的。填写完成后我们进行点击恢复,就发现进入到上面创建成功后进入的页面了。

4、是不是很神奇,“0x12Ea0fa7d2aCaA4ef52Ee7650bd16f56d60B51dC” 得到的公钥地址是一样的。

五、 密码解锁

相信很多小伙伴有个疑惑上面我们设置的密码是干什么用的,对吧!实际上这个密码是你在你本次使用的浏览器上使用的,比如你将浏览器关闭了,在打开那么将会让你输入密码解锁,如图:

我们可以将上面输入的密码输入进去然后解锁。如果密码忘记,那么将使用助记词找回你的钱包,在重新设置密码。也就是重复上面第四步。

第二讲 js-conflux-sdk 调用

1、检测conflux-portal插件


        async function checkConflux() {
            if (window.conflux === 'undefined') {
                if(confirm('检测到您的浏览器中并未安装conflux钱包插件,点击确定前往下载。\n\n 注:如果没有跳转看下是不是被浏览器拦截了')){
                    window.open("https://github.com/Conflux-Chain/conflux-portal/releases")
                }


                var body = document.getElementById("body");
                body.innerHTML = "本网址需要安装conflux钱包插件, 请 <a href='https://github.com/Conflux-Chain/conflux-portal/releases'>前往下载</a> conflux钱包插件";
                return false;
            }


            accounts = await conflux.enable();
            return true;
        }

2、获取contract合约

        var contract;
        function buildContract() {
            contract = confluxJS.Contract({
                abi: abiJson,
                address: "0x8067244e0b629610eb24cc9da4fe8b023fc02fd9",
            });
        }

3、call 调用

            let result = await contract.likeSupply();
            console.log(result.toString());

4、send调用

            await contract.startUp()
                .sendTransaction({ from: accounts[0] })
                .confirmed();

项目下载地址

项目地址链接

查看原文

赞 0 收藏 0 评论 0

小二 发布了文章 · 7月15日

四、Conflux 智能合约代付功能

Conflux引入了一些内置的内部合约,以便更好地进行系统维护和链上治理。而本文档将介绍如何使用这些内部合约。

后续文档使用 js-conflux-sdk 作为案例

一、通过赞助使用合约的方法

Conflux实现了一种赞助机制以补贴用户使用智能合约。因此,一个账户余额为0的新用户,只要执行赞助(通常由Dapps的运营商赞助),就能够直接调用智能合约。 通过引入内置的 SponsorControl 合约已记录对智能合约的赞助信息。

SponsorControl 智能合约为每个用户建立的合约维护以下信息:

  • sponsor_for_gas: 为提供燃料费用补贴的账户;
  • sponsor_for_collateral: 为提供存放抵押补贴的账户;
  • sponsor_balance_for_gas: 可用于燃料费用补贴的余额;
  • sponsor_balance_for_collateral: 可用于存放抵押补贴的余额;
  • sponsor_limit_for_gas_fee: 赞助者愿意为每笔交易提供的资助上限;
  • whitelist: 为合约愿意资助的正常账户清单,特殊的全0地址特指所有的正常账户。只有合约本身才有权更改该清单。

有两类资源可以被赞助:燃料费用及存储抵押物。

  • 对于燃料费用: 如果一笔交易使用非空的 sponsor_for_gas 调用智能合约且交易发送者处于合约的 whitelist 列表内,且交易指定的燃料费用在 sponsor_limit_for_gas_fee 范围内,交易的燃料消耗将从合约的 sponsor_balance_for_gas 中支付(如果足够的话),而不是由交易发送者的账户余额支付,如果 sponsor_balance_for_gas 无法承担燃料消耗,则交易失败。否则,交易发送者应支付燃料费用。
  • 对于存储抵押物: 如果一笔交易使用非空的 sponsor_balance_for_collateral 调用智能合约且交易发送者处于合约的 whitelist 列表内,在执行交易的过程中抵押担保物将从智能合约的 sponsor_balance_for_collateral 中扣除,并将这些修改后的存储条目所有者相应设置为合约地址。 否则,交易发送方应在执行过程中支付抵押担保物。

1、赞助更新

可以通过调用SponsorControl合同来更新燃料赞助费用和抵押担保物。要替换合约中的 sponsor_for_gas ,新的赞助人应当向合约转移比当前合约 sponsor_balance_for_gas 更多的资金,并为 sponsor_limit_for_gas_fee 设定一个新值。除非原有的 sponsor_limit_for_gas_fee 无法负担赞助,否则, sponsor_limit_for_gas_fee 的新值应不低于原有赞助者设置的限额。而且,转入的资金应当是新限额的1000倍及以上,这样至少可以补贴 1000 个调用C的交易。 如满足上述条件,则剩余的 sponsor_balance_for_gas 将退还给之前的赞助账户 sponsor_for_gas ,随后根据新赞助商的规范更新 sponsor_balance_for_gassponsor_balance_for_gas ,及 sponsor_limit_for_gas_fee

sponsor_for_collateral 的替换操作与上文描述非常类似,只是没有类似于燃料费用的限制。新的赞助人应当向C转入比现有赞助人提供的资金更多的资金作为合约的抵押担保物。那么当前赞助人 sponsor_for_collateral 的担保物将被全额退还,如 sponsor_balance_for_collateral 与合约使用的抵押担保总额之和,此外两个抵押担保字段均按照新赞助人的要求进行相应的变更。一个合约账户允许成为赞助人。

2、赞助接口

内建的合约地址为 0x8ad036480160591706c831f0da19d1a424e39469 。 内部合约的abi可以在 这里以及 这里获取。

  • set_sponsor_for_gas(address contract, uint upper_bound) :如果有人希望向合约地址 contract 赞助燃料费用, 他/她(也可以是合约账户)可以在调用该函数的同时向地址 0x8ad036480160591706c831f0da19d1a424e39469 传输代币。 参数 upper_bound 是指赞助者为单笔交易支付的燃料费用上限。 传输的代币量至少为参数 upper_bound 的1000倍。赞助者可能会被赞助更多代币同时设置更高的上界参数的赞助者所替换。当前赞助者也可以调用该函数并向该合约传输更多代币。在当前赞助者账户余额小于参数 upper_bound 时 , upper_bound 值将被动态调低。
  • set_sponsor_for_collateral(address contract_addr): 如果有人希望向地址为 contract 的合约赞助担保金,他/她(也可以是合约账户)可以在调用该函数的同时向地址 0x8ad036480160591706c831f0da19d1a424e39469传输代币。赞助者可能会被传输更多代币的新赞助者替换而当前赞助者也可通过调用该函数向合约传输更多代币。
  • add_privilege(address[] memory): 合约可通过调用该函数向白名单中加入部分正常账户地址。这意味着,若 sponsor_for_gas 被设置,合约会向白名单内的账户支付燃料费用,若 sponsor_for_collateral 被设置,则合约会向白名单内账户支付担保金。合约可通过使用特殊地址 0x0000000000000000000000000000000000000000 ,能够将所有账户加入到白名单中。
  • remove_privilege(address[] memory):合约可通过调用该函数从白名单中移除正常账户。

当调用函数时的交易值 set_sponsor_for_gasset_sponsor_for_collateral 代表发送者(新赞助者)愿意支付的代币数量。每个合约通过调用 add_privilegeremove_privilege 来维护它的白名单列表 whitelist

3、赞助样例

假设有一个如下所示的简单合约。

pragma solidity >=0.4.15;

import "https://github.com/Conflux-Chain/conflux-rust/blob/master/internal_contract/contracts/SponsorWhitelistControl.sol";

contract CommissionPrivilegeTest {
    mapping(uint => uint) public ss;

    // 添加白名单
    function add(address account) public payable {
        SponsorWhitelistControl cpc = SponsorWhitelistControl(0x8ad036480160591706c831f0DA19D1a424e39469);
        address[] memory a = new address[](1);
        a[0] = account;
        cpc.add_privilege(a);
    }

    // 移除白名单
    function remove(address account) public payable {
        SponsorWhitelistControl cpc = SponsorWhitelistControl(0x8ad036480160591706c831f0DA19D1a424e39469);
        address[] memory a = new address[](1);
        a[0] = account;
        cpc.remove_privilege(a);
    }
    
    // 测试支付
    function foo() public payable {
    }
    // 测试支付
    function par_add(uint start, uint end) public payable {
        for (uint i = start; i < end; i++) {
            ss[i] = 1;
        }
    }
}

部署合约后,地址为 contract_addr ,如果有人希望赞助燃料费用,他/她可以发送如下交易:

const PRIVATE_KEY = '0xxxxxxx';
const cfx = new Conflux({
  url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
  defaultGasPrice: 100,
  defaultGas: 1000000,
  logger: console,
});
const account = cfx.Account(PRIVATE_KEY); // create account instance

const sponsor_contract_addr = '0x8ad036480160591706c831f0da19d1a424e39469';
const sponsor_contract = cfx.Contract({
  abi: require('./contracts/sponsor.abi.json'),
  address: sponsor_contract_addr,
});
// 赞助燃料
sponsor_contract.set_sponsor_for_gas(contract_addr, your_upper_bound).sendTransaction({
  from: account,
  value: your_sponsor_value
}).confirmed();

// 赞助存储抵押物
sponsor_contract.set_sponsor_for_collateral(contract_addr, your_upper_bound).sendTransaction({
  from: account,
  value: your_sponsor_value
}).confirmed();

至于赞助者的存储抵押物,只需要更换 set_sponsor_for_gas(contract_addr, your_upper_bound) 函数为 set_sponsor_for_collateral(contract_addr) 函数并使用。

通过使用 add_privilegeremove_privilege 为合约维护白名单 whitelist 。含有全0的特殊地址 0x0000000000000000000000000000000000000000 意味着任何人都在 whitelist 内。 需要谨慎的使用它。

// 添加
you_contract.add(white_list_addr).sendTransaction({
  from: account,
})

// 移除
you_contract.remove(white_list_addr).sendTransaction({
  from: account,
})

在这一操作后,在调用 you_contract.foo()you_contract.par_add(1, 10) 时存在于 whiltelist 内的账户将不再支付任何费用。

二、管理

引入 AdminControl 合约的目的是为了更好地维护其他智能合约,特别是那些没有适当销毁程序而临时生成的智能合约:它记录了每个用户建立的智能合约的管理员,并根据相应管理员的要求进行销毁处理。

智能合约的默认管理员是合约的创建者,即使合约创建的交易发送者α。智能合约的当前管理员可通过向AdminControl合约发送请求,将其权限转移给另一个普通账户。合约账户不允许成为其他合约的管理者,因为这种机制主要是用于试探性的维护。任何带有自定义授权规则的长期管理都应该在合约内部实现,如作为处理销毁请求的特定功能。

在任何时候,现有合同的管理人addr 都有权通过调用AdminControl申请销毁合约。但是,如果用于存储合同的抵押物不为零,或 addr 不是合约的当前管理者,则该请求将被拒绝。如果 addr 是合约的当前管理者,且合约中的存储抵押品为零,则销毁请求会被接受,且处理流程如下:

  1. 合约余额将退还给 addr
  2. 合约中的 sponsor_balance_for_gas 会退还给 sponsor_for_gas
  3. 合约中的 sponsor_balance_for_collateral 会退还给 sponsor_for_collateral
  4. 合约的内部状态将被解除,并将相应的抵押物退还给拥有者;
  5. 该合约从世界范围内删除。

1、管理接口

合约地址为 0x8060de9e1568e69811c4a398f92c3d10949dc891。 内部合约的abi可以在这里以及这里获取。

  • set_admin(address contract, address admin): 设置 admin 为合约 contract 的管理员。函数调用者应为合约 contract 的管理员且账号状态正常。调用者要确保 contract 字段确实写入了合约地址且 admin 字段是正常的账户地址。否则,调用失败。
  • destroy(address contract): 销毁合约 contract 。函数调用者应为合约 contract 的管理员且账号状态正常。 若合约抵押担保非0,则销毁合约失败.否则,合约 contractbalance 退还给现任管理者处。 sponsor_balance_for_gas 将会退还到 sponsor_for_gassponsor_balance_for_collateral 则会退还到 sponsor_for_collateral

2、管理样例

考虑到您已经部署了一个合约,其地址为 contract_addr 。管理员可以调用 AdminControl.set_admin(contract_addr, new_admin) 以修改管理员,及调用 AdminControl.destroy(contract_addr) 以销毁合约。

const PRIVATE_KEY = '0xxxxxxx';
const cfx = new Conflux({
  url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
  defaultGasPrice: 100,
  defaultGas: 1000000,
  logger: console,
});
const account = cfx.Account(PRIVATE_KEY); // create account instance

const admin_contract_addr = '0x8060de9e1568e69811c4a398f92c3d10949dc891';
const admin_contract = cfx.Contract({
  abi: require('./contracts/admin.abi.json'),
  address: admin_contract_addr,
});
// 修改管理员
admin_contract.set_admin(contract_addr, new_admin).sendTransaction({
  from: account,
}).confirmed();

// 销毁智能合约
admin_contract.destroy(contract_addr).sendTransaction({
  from: account,
}).confirmed();

三、权益质押机制

Conflux引入权益质押机制的原因有两个:一、权益机制提供了一种对占用存储空间更好的收费方式(相比于“一次付费,永久占用”)。二、该机制还有助于定义分散治理中的投票权。

在高层,Conflux实现了一个内置的Staking 合约,记录所有账户的权益信息。通过向该合约发送交易,用户(包括外部用户和智能合约)可以存入/提取资金,也被称为合约内的权益。质押资金的利息在提款时发放,其数量取决于提款金额和质押时长。

1、利率

目前的年化利率为4%。
复利是以区块的颗粒度来实现的。

执行由账户 addr 在区块 B 发送的交易,并在区块 B' 提取价值 v 的资金,其利息计算公式如下:

interest issued = v * (4% / 63072000)^T

其中 T = BlockNo(B)−BlockNo(B') 是以区块数目衡量的质押时长,而 63072000 是在区块生成时间为 0.5 秒前提下 365 天生成区块数目的期望值。

2、质押以获取投票权益

详细请看Conflux Protocol Specification.

3、质押接口

合约地址为 0x843c409373ffd5c0bec1dddb7bec830856757b65。内部合约的abi信息可以在这里以及这里获取。

  • deposit(uint amount) :调用者可以通过调用该函数将部分代币存入Conflux内嵌的权益质押合约。目前的年化利率为4%。
  • withdraw(uint amount) : 调用者可通过调用该函数从Conflux内嵌的权益质押合约中提取代币。运行该函数将会触发利息结算。权益质押资金和利息将会按先申请先服务的顺序及时转入到用户账户中。
  • vote_lock(uint amount, uint unlock_block_number) :该函数与Conflux的投票权益相关。权益质押用户可以通过选择投票数额及锁定的到期日锁定一定数目的CFX费用。参数 unlock_block_number 会以创世区块产生以来的区块数目度量。

4、质押样例

const PRIVATE_KEY = '0xxxxxxx';
const cfx = new Conflux({
  url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
  defaultGasPrice: 100,
  defaultGas: 1000000,
  logger: console,
});
const account = cfx.Account(PRIVATE_KEY); // create account instance

const staking_contract_addr = '0x843c409373ffd5c0bec1dddb7bec830856757b65';
const staking_contract = cfx.Contract({
  abi: require('./contracts/staking.abi.json'),
  address: staking_contract_addr,
});
// 存储质押
staking_contract.deposit(your_number_of_tokens).sendTransaction({
  from: account,
}).confirmed();

// 撤回质押
staking_contract.withdraw(your_number_of_tokens).sendTransaction({
  from: account,
}).confirmed();

// 锁定质押
staking_contract.vote_lock(your_number_of_tokens, your_unlock_block_number).sendTransaction({
  from: account,
}).confirmed();
查看原文

赞 0 收藏 0 评论 0

小二 发布了文章 · 7月15日

三、部署智能合约到conflux公链

一、准备合约

本节课程教大家如何讲智能合约部署到conflux公链上,首先大家可以看到下面的这个智能合约是不是很简单。我们将会以这个合约演示部署到conflux公链的过程。

pragma solidity ^0.5.0;

contract Counter {
    uint public count=0;
    event SelfEvent(address indexed sender, uint current);

    constructor() public {
    }

    function inc(uint num) public returns (uint){
        return count += num;
    }

    function self() public {
        emit SelfEvent(msg.sender, count);
    }
}

二、conflux的sdk安装

我们使用js-conflux-sdk作为本教程的web教程,交互首先我们需要进行安装nodejs作为我们的运行环境。飞机票一张收下吧,我们安装好nodejs后,就可以来玩我们的sdk了。废话不多说,直接开始撸。

我们使用WIN + R键打开命令行,然后创建一个文件夹(温馨提示切换到非系统盘玩切换方式“D:”就切换到D盘了)使用“mkdir my-project && cd my-project” 创建好项目后自动进入文件夹,然后我们运行“npm init” 进行初始化node项目,这一步会让你确认一些东西,如果你是小白一路回车(Enter键)就好。如果你是前端大神,我也没啥好教的我也不太懂。为了稳定我们使用固定版本号方式安装依赖,我们运行 “npm install js-conflux-sdk@0.9.2” 命令进行安装js-conflux-sdk的0.9.2版本依赖(可以使用“npm uninstall package-name” 命令删除对应依赖)。前置准备到这里基本已经完成。

三、编写调用合约js代码

下面请看我的目录结构跟随我一起来学习,下面的目录结构请不要直接看到了就创建,因为你不知道都是什么意思,看玩我的解释在回头创建。

image

小伙伴应该已经发现了 node_modules、package-lock.json、package.json 这些文件是我们在进行安装 sdk依赖时自动生成的。其他文件目前都没有,我们来按顺序生成他们。

先创建sol这个文件夹,然后创建这三个文件。test.sol就是上面我们的合约代码直接拷入文件中。abi.json和code.json两个文件是通过这个工具 remix 在线生成的。我来说下生成过程。
首先我们将里面的文件全部删除,然后点击这里找到我们的项目目录下的test.sol 文件

我们应该看到下方我框出来的两个按钮了吧,那两个按钮就是abi.json和code.json文件的来源。abi.json我们可以直接复制过去,code.json文件我们要改点东西。

首先我们看到的code文件应该是这样的

{
    "linkReferences": {},
    "object": "608060405260...c63430005110032",
    "opcodes": "PUSH1 0x80 PUSH1 ... 1100 ORIGIN ",
    "sourceMap": "27:337:0 ... 37;;;;;;"
}

代码有省略,太长不好看,我们看到object这个key值了吧,我们把它的值考出来然后在头部加0x 就好了放在code.json文件中。code.js文件中只存放object的内容前面加0x,也就是下面的代码,其他信息都不要,千万记住了。这点很重要!!!!

"0x608060405260...c63430005110032"

就是这样的。然后我们在写另外两个call和deploy两个文件

先写deploy文件


// 私钥地址
const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e';
// 合约地址
const CONTRACT = '';
const { Conflux } = require('js-conflux-sdk');

async function main() {
  const cfx = new Conflux({
    url: 'http://mainnet-jsonrpc.conflux-chain.org:12537',
    defaultGasPrice: 100,
    defaultGas: 1000000,
  });
  const account = cfx.Account(PRIVATE_KEY); // create account instance
  console.log(account.address); 

  // create contract instance
  const contract = cfx.Contract({
    abi: require('./sol/RC20.abi.json'),
    bytecode: require('./sol/RC20.code.json'),
  });

  const receipt = await contract.constructor()
    .sendTransaction({ from: account })
    .confirmed();
  console.log(receipt.contractCreated); 
}
main().catch(e => console.error(e));

打开项目cmd窗口在上面的目录下 运行命令 “node deploy.js”就将合约部署上去了

receipt.contractCreated 这个会打印出合约地址。

查看原文

赞 0 收藏 0 评论 0

小二 发布了文章 · 7月6日

二、学习基础智能合约

第一讲 介绍

1、 智能合约是什么?

智能合约并非现实中常见的合同,而是存在区块链上,可以被触发执行的一段程序代码,这些代码实现了某种预定的规则,是存在于区块链执行环境中的“自治代理”。智能合约需要被触发,代码才会执行,不被触发他的状态将会始终保持一个状态,并且部署后的智能合约将不可被修改。智能合约语言的语法和js脚本语言很像,因此有过js开发经验的小伙伴们学习起来会很快。

2、 编程工具的介绍。

我们都知道“预先善其事、必先利其器”的道理,现实中织布是需要织布机才能完成织布,同样的我们的智能合约学习也是要有编程工具的使用的。我们本套课程都将以 remix 为编程工具进行讲解课程。remix 就是我们手里的织布机,能织出什么布就看我们这些使用 remix 的程序员了。
地址为(http://remix.ethereum.org/)可以直接在浏览器中开发,很方便,只要有一个 google chrome 谷歌浏览器就可以开发了。

remix 有几个主要的常用面板,分别是文件面板、编译器、运行器、以及占用最大一部分的文本编辑器组成。

文件面板:我们可以在这个面板进行创建文件、选择文件等管理文件的操作。
编译器:我们可以将sol文件进行编译,编译不通过将不能执行合约,并且可以得到code.json以及abi.json。我们可以将他们在支持sol语言的公链上运行。
运行器:可以将sol智能合约部署在eth链上,并且能对合约的方法进行调用等操作。
文本编辑器:我们的代码就是写在这个位置的,后面基本大部分时间你将面对的是这个页面。

3、 我的第一个智能合约程序

下面的智能合约是我们第一个合约程序,因此我们命名为 “FirstContract.sol” 文件名

pragma solidity ^0.6.0;

// first contract
contract FirstContract {
    // first method
    function firstMethod() public pure returns (string memory) {
        return 'I am first method !!!';
    }
}

上面代码很多小伙伴应该不是很懂什么意思,不懂没关系,我来给大家一行一行讲解。
pragma solidity ^0.6.0;
这一行是说明使用solidity 0.6.0版本写的,可以运行在0.6.0到0.7.0之间的版本上。
contract FirstContract {
这一句是定义一个叫 FirstContract 名称的合约。
function firstMethod() public pure returns (string memory){
这一行是定义一个方法叫做 firstMethod, 该方法有返回值,类型是 string 类型的。

    return 'I am first method !!!';

这一行是这个方法将会返回 “I am first method !!!”。

看起来可能还是会有小伙伴们有不明白的地方,但是我们先只教这么多,关于什么是string,string 就是字符串的意思,字符串你就可以当作是任意的abcde这些字母等还有标点符号写在了单引号或者双引号中。这就是字符串最通俗易懂的解释了,小伙伴们,大家可以动手试试自定义一些字符串让他返回。

第二讲 智能合约结构

在solidity中,合约有点类似面向对象语言中的类,每个合约中包含状态变量、函数、函数变量、函数修饰器、事件、结构、和枚举类的声明,合约也可以继承其他的合约。大家可能对类和类中的结构的概念没有什么了解,我简单给大家举个例子。一个类可以比作是汽车,汽车里面的油就是变量,然后油门、刹车等就是函数,我们踩油门相当于调用类中的函数,汽车动起来,油减少,相当于变量值改变了。

我们来根据上面的描述写一个汽车的合约。先使用remix 创建一个CarContract1.sol文件,然后设定一个CarContract1名字的合约。汽车有了,还要有一个油箱,设定一个变量_gasoline,作为油箱。然后我们再给汽车加一个油门,写一个startUp函数作为油门。现在有了油箱但是不知道有多少油,再加gatGasoline函数作为一个仪表盘。咱们只有油箱没有油汽车也跑不了,在加一个加油的接口,给汽车加油,使用addGasoline函数进行加油。下面就是我们完整的小汽车的代码。

CarContract1.sol

pragma solidity ^0.6.0;

contract CarContract1 {
    uint256 _gasoline;
    
    function startUp() public {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
    }
    
    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }
    
    function addGasoline(uint256 gasoline) public {
        _gasoline = _gasoline + gasoline;
    }
    
}

1、 状态变量

小汽车合约中的_gasoline就是我们定义的状态变量,类型是 uint256 类型。 该变量是存储在链上的,也就是说他的数据是被保存起来的,每次改动都会记录下来。因此我们在进行调用 addGasoline 函数时,会给这个小汽车加油成功,_gasoline 的值会变化,同样的我们调用 startUp 函数时,_gasoline 的值也会变化。

2、 函数

在CarContract1小汽车中,startUp()、getGasoline()、addGasoline(uint256 gasoline) 都是函数。这些函数有的是没有参数的,又叫无参函数,比如:startUp()、getGasoline()。有的是有参数的,就叫有参函数,比如:addGasoline(uint256 gasoline)。这些函数,有的有返回值,有的没有返回值,根据具体场景来定,一般call操作都是有返回值的,call操作不会改变合约状态。只有send操作,才会进行改变合约的状态。

3、 函数变量
我们都知道加不同的型号汽油会有不一样的效果,我们来给汽车换下不同的型号汽油,在汽车上我们放置一个桶名字是_bucket,用来装另一个型号的汽油。如果我们自己的两个容器里面有一个是空的,我们可以直接进行转换汽油。但是我们自己的两个容器中都有油的时候,两个容器很明显不能进行交换汽油,这个时候我们需要向隔壁的老李借一个桶 __tempBucket,这样三个容器就能进行转换油箱里面的汽油和桶里面的汽油进行对换了,换完以后把桶还回去。

我们进行在进行造一个新的小汽车名字是CarContract2,增加一个桶,设定变量为_bucket,作为桶。还需要记录当前汽车的油的型号。设定变量 _gasolineType 为当前油类型,默认是 1类型。设定一个函数 changeGasolineType,进行交换汽油类型,在设定一个函数进行查看当前汽车的类型 getGasolineType 。至此我们小汽车升级成功。

CarContract2.sol

pragma solidity ^0.6.0;

contract CarContract2 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    
    function startUp() public {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
    }
    
    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }
    
    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }
    
    function changeGasolineType() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");
        
        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }
        
        _gasolineType = -1 * _gasolineType;
    }
    
    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }
    
}

上面的小汽车2代正式出炉,我来给大家讲下做了那些升级,首先我们的changeGasolineType内部定义了 __tempBucket 变量,该变量就是函数变量,是临时创建的并且不会被记录在链上的变量,也就是我们用完就还给隔壁老李了,还回去的时候桶是空的。

4、 函数修饰器

我们的小汽车还是很简单,我们在给他加一点东西,规定小汽车要想启动必须关闭车门。

下面我们再一次修改我们的小汽车,加一个_doorStatus状态变量作为我们的车门状态。再加连个函数getDoorStatus()、changeDoorStatus(),用来控制开门/关门并且查看门的状态。并且加入一个whenDoorClose()作为我们的判断器。

pragma solidity ^0.6.0;

contract CarContract3 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    
    bool _doorStatus;
    
    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;
        
    }
    
    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
    }
    
    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }
    
    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }
    
    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");
        
        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }
        
        _gasolineType = -1 * _gasolineType;
    }
    
    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }
    
    
    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }
    
    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }
}

上面我们的3代小汽车已经完成了,whenDoorClose() 就是我们定义的函数修饰器 使用modifier 来定义的。

5、 事件

每次都到没有油了才去加油,我们加一个功能,当行驶时油量低于5的时候我们要进行预警。

我们加入一个 gasolineAlarm 事件,该事件有一个参数,当前的油量。这样我们在启动的函数中加入这个事件的调用,判断本次使用后的油量是否小于等于5,是的话进行调用该事件

pragma solidity ^0.6.0;

contract CarContract4 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    
    bool _doorStatus;
    
    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;
        
    }
    
    event gasolineAlarm(uint256 gasoline);
    
    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
        if (_gasoline <= 5) {
            emit gasolineAlarm(_gasoline);
        }
    }
    
    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }
    
    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }
    
    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");
        
        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }
        
        _gasolineType = -1 * _gasolineType;
    }
    
    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }
    
    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }
    
    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }
}

我们已经更新到第四代小汽车了,四代小汽车的gasolineAlarm 就是我们定义的事件,事件是会在虚拟机上记录一条日志的,我么可以通过查询日志的方式得到事件内容。

6、 结构

我们的汽车感觉成熟了,这个时候我们要给我们的汽车打上一些特性,比如颜色,比如车轮数,比如车门数等等。

我们在小汽车里面加入CarInfo结构体,里面可以定义color颜色,wheelNum 车轮数等等,然后我们加入设置和获取的函数:setCarInfo()、getCarInfo(), 这样我们的小汽车就有了一些参数了。

pragma solidity ^0.6.0;

contract CarContract5 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    bool _doorStatus;
    
    struct CarInfo {
        string color;
        uint8 wheelNum;
    }
    
    CarInfo _carInfo;
    
    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;
        
    }
    
    event gasolineAlarm(uint256 gasoline);
    
    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
        if (_gasoline <= 5) {
            emit gasolineAlarm(_gasoline);
        }
    }
    
    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }
    
    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }
    
    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");
        
        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }
        
        _gasolineType = -1 * _gasolineType;
    }
    
    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }
    
    
    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }
    
    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }
    
    function setCarInfo(string memory color, uint8 wheelNum) public {
        _carInfo.color = color;
        _carInfo.wheelNum = wheelNum;
        
        //_carInfo = CarInfo(color, wheelNum);

    }
    
    function getCarInfo() public view returns(string memory color, int wheelNum) {
        color = _carInfo.color;
        wheelNum = _carInfo.wheelNum;
    }
}

我们的5代小汽车加入了CarInfo就是结构体,结构体中不能进行设置初值,我们能把一类的属性等进行分类的放在结构体中,可以充当我们的数据模型。

7、 枚举类

我们的小汽车想要开门,需要打开车锁,车锁是一种状态,开/关。

我们加入枚举类DoorSwitch,定义两个状态open,close 。在定义whenDoorSwitch函数修饰器,进行判断。

pragma solidity ^0.6.0;

contract CarContract6 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    bool _doorStatus;
    
    enum DoorSwitch{ open, close }
    
    DoorSwitch _doorSwitch;
    
    struct CarInfo {
        string color;
        uint8 wheelNum;
    }
    
    CarInfo _carInfo;
    
    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;
        
    }
    
    modifier whenDoorSwitch() {
        if (!_doorStatus) {
            require(_doorSwitch == DoorSwitch.open, "door switch is close");
        }
        _;
    }
    
    event gasolineAlarm(uint256 gasoline);
    
    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
        if (_gasoline <= 5) {
            emit gasolineAlarm(_gasoline);
        }
    }
    
    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }
    
    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }
    
    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");
        
        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }
        
        _gasolineType = -1 * _gasolineType;
    }
    
    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }
    
    
    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }
    
    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }
    
    function setCarInfo(string memory color, uint8 wheelNum) public {
        _carInfo.color = color;
        _carInfo.wheelNum = wheelNum;
        
        //_carInfo = CarInfo(color, wheelNum);
    }
    
    function getCarInfo() public view returns(string memory color, int wheelNum) {
        color = _carInfo.color;
        wheelNum = _carInfo.wheelNum;
    }
    
    function setDoorSwitch(DoorSwitch doorSwitch) public {
        _doorSwitch = doorSwitch; 
    }
}

我们已经更新到6代小汽车了,在6代小汽车中我们加入了DoorSwitch车门的开关,使用的就是枚举定义的,在实际项目中枚举定义的话,一般使用在状态和类型的定义上,方便进行管理。

到此我们的小汽车已经完成了,经历了6代的更新,相信大家对于本节课程有空了一定的了解了。智能合约包含的状态变量、函数、函数变量、函数修饰器、事件、结构、枚举类都已经在制作和升级小汽车中使用了。

第三讲 数据类型

在solidity中有专门的数据类型,什么是数据类型呢,我们可以认为数字是类型,是否是类型,地址是类型等。在solidity中存在以下常用的类型,uint/int、bool、 address、 mapping、bytes、string、fixed/ufixed 常用的类型。

pragma solidity ^0.6.0;


contract Test {
    uint v1 = 1;
    int v2 = -2;
    bool v3 = true;
    address v4 = 0x8a5fa31F2bf83812ECd8E5Ef1878dD12bBaDb40C;
    mapping(uint => uint) v5;
    bytes v6 = "0x123"; 
    string v7 = "asd";
    fixed v8 = 1.3;
    ufixed v9 = 1.2;
}

1、 uint/int类型

uint/int 类型都是整型,也就是都是整数。1、2、3、4类似的数没有小数点。区别是uint是没有符号的。看代码中的 v1 就是无符号整数,v2就是有符号整数。默认是0

2、bool

bool 中文是布尔类型,表示是/否的类型。v3就是bool类型,只有两个值 true/false,默认是false

3、address

address是地址类型,存储地址的,账户地址,合约地址等,都可以。

4、mapping

映射类型示例中的代码不是很全,我来解释下,实际上他是一个key-value模型,也就是一个key对应一个value。比如我们说小明,我们就是到小明这个人。就是这个道理。

5、bytes

定长数组,就是说他的长度是固定的,不能改变,设定是多少就是多少。

6、string

字符串类型,可以放字符串,长度是255位二级制数。

7、fixed/ufixed

浮点类型,就是带有小数点的,1.2、1.4、1.9这类数值。也是分为有无符号项。

第四讲 控制语句

在solidity中可以使用以下控制结构,有 if,else,while,for,break,continue,return,? : 我们来以此介绍这些结构。

1、if else语句

大家肯定好奇什么是if else语句。他就是我们说的如果 否者。也就是说如果我怎么样否者我怎么样。注意else只能与if一同使用,大家一起来看下面代码:

pragma solidity ^0.6.0;


contract Test {
    uint256 temp;
    
    function test1(bool doorSwitch) public {
        if (doorSwitch) {
            temp = 1;
        }
    }
    
    function test2(bool doorSwitch) public {
        if (doorSwitch) {
            temp = 1;
        }
        temp = 2;
    }
    
    function test3(bool doorSwitch) public {
        if (doorSwitch) {
            temp = 1;
        } else {
            temp = 2;
        }
    }
    
    function getTemp() public view returns(uint256){
        return temp;
    }
}

上面代码中我们定义了三个测试方法,以及一个获取temp值的方法。第一个测试方法表示如果我们传进去的doorSwitch是true,门是开的,那么temp就等于1,否者doorSwitch等于false的话temp值不变。第二个测试方法表示如果我们传进去的doorSwitch是true,门是开的,那么temp就先等于1,然后等于2,否者doorSwitch等于false的话temp直接等于2。第三个测试方法表示如果我们传进去的doorSwitch是true,门是开的,那么temp就等于1,否者doorSwitch等于false的话temp等于2。

2、while语句

while 语句是循环语句,表示满足条件就一直循环,一般我么会和break来使用,当达到某种情况进行跳出循环,可以让循环体自动结束循环。

pragma solidity ^0.6.0;


contract Test {
    function test1() public {
        int a = 1;
        while(true) {
            if (a == 5) {
                break;
            }
            a++;
        }
    }
    
    function test2() public {
        int a = 1;
        while(a != 5) {
            
            a++;
        }
    }
}

上面两个函数内部都有一个循环,实际上两个循环的效果是一样的,有一些细微的差别,需要根据具体业务场景分析了,不建议使用while 一不小心死循环就不好玩了。

3、for循环

for循环概念直接上代码大家好理解些。

pragma solidity ^0.6.0;


contract Test {
    function test1() public {
        for(uint8 i = 0; i < 10; i ++) {
            ...
        }
    }
}

上面就是一个常用的for循环使用方式,循环10次 “...” 的内容。

4、continue 语句

continue语句是跳过本次循环进入下一次循环,来看代码:

pragma solidity ^0.6.0;


contract Test {
    function test1() public {
        for(uint8 i = 0; i < 10; i ++) {
            if (i == 3) {
                continue;
            }
            
            ...
        }
    }
}

上面的代码是如果i = 3后跳过这次循环。

5、return 语句

return 是返回的命令当遇到return时就是表示结束了。看代码:

pragma solidity ^0.6.0;


contract Test {
    function test1() public {
        for(uint8 i = 0; i < 10; i ++) {
            if (i == 3) {
                return;
            }
            
            ...
        }
    }
}

上面的代码可以看出,运行到i = 3时,程序直接结束。

6、 结束

到此我们的控制语句基本学习结束。这些概念每个语言都差不多,所以很重要。多练小伙伴!

结束

学习完上面的课程大家对于智能合约基本已经学习好了,但是还是缺乏使用,只是知道有啥东西,什么时候用不知道,这个时候需要大家进行锻炼了,多写一些小东西练习。

查看原文

赞 0 收藏 0 评论 0

小二 发布了文章 · 7月6日

一、Conflux 网页钱包创建

相信每一位新加入的小伙伴都有一个疑问,去中心化的钱包到底是什么,如何拥有一个自己钱包,如何使用这个钱包吧,下面我将会为大家讲解如何创建钱包、导入钱包、使用钱包三个方面讲解下。

一、创建钱包

首先大家进入钱包网站登录页面 (大家可以将该网址收藏), 可以看到页面上有两个选择,一个是创建钱包,一个是进入钱包(即导入钱包),我们先讲创建钱包然后在讲如何导入钱包。

我们点击创建钱包,将会弹出下面页面中的密码输入框,这里大家输入一个记得住得的密码(如果记不住写在小本本上藏起来),本教程输入密码为 000000000 然后点击继续。

我们会进入下面的页面,提示大家进行下载Keystore文件,大家点击下载就好了,这里的keystore千万不要丢了,和上面密码一样很重要。在进行导入钱包时,会根据大家的keystore文件以及密码进行计算出大家的私钥,因此很重要,最好备份到U盘中,以及打印一份。

下面是本次教程下载的keystore文件。

{"version":3,"id":"74e5b4a2-4894-4144-837c-61479487a565","address":"ad9af053f4ffed7a061226663ec50ce46736da9a","crypto":{"ciphertext":"eaeced1cd595adb51832c03feca291794eb593270e733776543ea4f095110bfb","cipherparams":{"iv":"73ca3e626b5625817679f43e2a81ec10"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"4e914d37a14cd522dc70dd88e079170481e82d45418cfd34a5c1ccbf8d0a409c","n":8192,"r":8,"p":1},"mac":"16769410e64e4ed4e0b89c43a84a338569696f46cf9ec604b82c87d4e99385ea"}}

我们下载好以后,会进入看到下面的页面弹窗。我们点击进入钱包。

点击进入钱包后,会进入个人的钱包页面,这个钱包中有CFX(测试币)、以及FC(合约币)。会发现都是0余额,很正常,刚刚创建嘛,是0就对了。

到此我们就有了一个钱包了,是不是很简单,温馨提示大家,密码 + keystore文件很重要,不要搞没了,没了就找不回来了。也不要公开,别人拿到了以后,就相当于知道你的钱包了,就可以把你的余额等都转走。

二、导入钱包

上面我们讲解了如何创建钱包,下面我们来讲解下如何导入钱包,已经使用钱包的小伙伴已经发现了吧,当我们刷新浏览器页面时,会直接进入到钱包登录页面,这个时候我们已经创建了钱包,肯定不会在创建一个了,那么我们就看下如何进入钱包(即导入钱包)吧。我们点击进入钱包,

会弹出下面页面,我们继续点击继续按钮

会让我们选择文件,这里直接选择我们在上面创建的钱包时,下载的keystore文件,点击打开

这里会让我们输入密码,就是上面创建钱包时的密码,输入密码后点击进入

是不是进入了大家熟悉的钱包页面啦!

导入钱包是不是很简单,这会知道keystore和密码重要性了吧!!!

三、钱包使用

小伙伴是不是还是很懵,我有了钱包能做什么,我来给大家介绍下钱包如何使用。大家可以看到下面钱包页面上我标注的10个功能序号。我将为大家介绍这10个功能。

功能1,复制钱包公钥地址,这个钱包公钥地址,可以进行公开,这个合约地址就是大家进行接受转账的地址,每个人都有一个唯一的公钥地址。

功能2, 钱包公钥地址二维码,可以使用支持扫码的dapp进行扫码来解析出来你的公钥地址,同样是可以公开的。

功能3, 区块浏览器,可以在该页面查询某个账户地址余额,出块情况,交易hash等等信息。

功能4,钱包私钥,这个私钥很重要,和上面的keystore+密码是一样重要的,可以直接通过私钥,进行进入你的钱包中,因此,不能进行公开。

功能5,cfx发送, 这里点击发送后会让我们输入转出cfx余额,以及发送地址,还有燃油费等信息,大家可以在测试网建两个账号相互转转,挺有意思的。

功能6,cfx接收,这个就是功能1和功能2的集合体。

功能7,申领测试币,可以申请测试币,每次会申请100测试币,大家随便使用,反正上线后会清除的,没啥用。

功能8,fc发送,这个功能可以在两个账户间来回转下,大家不要随便转给别人,不然就找不回来了。这里的fc是真正的可以在上线后也是能用的。

功能9,fc接收,和功能6一样的东西。

功能10,这个是查看合约信息的情况的入口。可以看到总量等信息。

四、钱包转账

我们以CFX钱包账户来进行转账,转给某个社区的小伙伴的账户地址(0x10898FD8a20C28A2F2Ea46428cAfBD2B58c1E363)这个小伙伴是谁我也不知道。我们点击CFX下面的发送按钮。进入下面页面

我们在发送至中填入这个小伙伴地址,发送cfx为10cfx.

点击发送看到下面的弹窗,我们这次不点击那个确定点击下面查看详情

可以看到进入了区块浏览器中了。里面的交易hash是本次交易的hash通过这个可以查找到本次交易情况,发送方就是你本人的公钥地址,接收方是对方的公钥地址,价值就是你转了多少cfx,差不多知道这些信息已经够了。

到此我们钱包课程已经基本介绍结束。

五、结束

感谢小伙伴们阅读本文。有对conflux感兴趣的小伙伴可以添加我微信好友(15832013094),我拉大家进入conflux社区群。一起共同学习进步。

查看原文

赞 0 收藏 0 评论 0

小二 发布了文章 · 7月6日

基础智能合约第一讲(智能合约介绍)

1、学习本套课程后,你能收获什么?

学习本教程后,你将会使用solidity语言编写一些小的智能合约,达到对智能合约的一个入门级的要求水平。通过本教程可以使大家关于智能合约方面的兴趣增加,后面可以通过自主学习,或是我们高级课程,在智能合约这条路上更进一步。也就是我们本套教程是基础课程。适合智能合约小白人员。

2、 智能合约是什么?

智能合约并非现实中常见的合同,而是存在区块链上,可以被触发执行的一段程序代码,这些代码实现了某种预定的规则,是存在于区块链执行环境中的“自治代理”。智能合约需要被触发,代码才会执行,不被触发他的状态将会始终保持一个状态,并且部署后的智能合约将不可被修改。智能合约语言的语法和js脚本语言很像,因此有过js开发经验的小伙伴们学习起来会很快。

3、 学习了智能合约后我们可以做什么?

我们将可以作为区块链应用的底层人员,来完成开发任务,智能合约是去中心化应用的核心关键部分。如果抽象来讲,智能合约是应用程序的数据库以及服务器。

4、 编程工具的介绍。

我们都知道“预先善其事、必先利其器”的道理,现实中织布是需要织布机才能完成织布,同样的我们的智能合约学习也是要有编程工具的使用的。我们本套课程都将以 remix 为编程工具进行讲解课程。remix 就是我们手里的织布机,能织出什么布就看我们这些使用 remix 的程序员了。
地址为http://remix.ethereum.org/ 可以直接在浏览器中开发,很方便,只要有一个 google chrome 谷歌浏览器就可以开发了。

remix 有几个主要的常用面板,分别是文件面板、编译器、运行器、以及占用最大一部分的文本编辑器组成。

文件面板:我们可以在这个面板进行创建文件、选择文件等管理文件的操作。
编译器:我们可以将sol文件进行编译,编译不通过将不能执行合约,并且可以得到code.json以及abi.json。我们可以将他们在支持sol语言的公链上运行。
运行器:可以将sol智能合约部署在eth链上,并且能对合约的方法进行调用等操作。
文本编辑器:我们的代码就是写在这个位置的,后面基本大部分时间你将面对的是这个页面。

5、 我的第一个智能合约程序

下面的智能合约是我们第一个合约程序,因此我们命名为 “FirstContract.sol” 文件名

pragma solidity ^0.6.0;

// first contract
contract FirstContract {
    // first method
    function firstMethod() public pure returns (string memory) {
        return 'I am first method !!!';
    }
}

上面代码很多小伙伴应该不是很懂什么意思,不懂没关系,我来给大家一行一行讲解。

pragma solidity ^0.6.0;

这一行是说明使用solidity 0.6.0版本写的,可以运行在0.6.0到0.7.0之间的版本上。

contract FirstContract {

这一句是定义一个叫 FirstContract 名称的合约。

function firstMethod() public pure returns (string memory){

这一行是定义一个方法叫做 firstMethod, 该方法有返回值,类型是 string 类型的。

return 'I am first method !!!';

这一行是这个方法将会返回 “I am first method !!!”。

看起来可能还是会有小伙伴们有不明白的地方,但是我们先只教这么多,关于什么是string,string 就是字符串的意思,字符串你就可以当作是任意的abcde这些字母等还有标点符号写在了单引号或者双引号中。这就是字符串最通俗易懂的解释了,小伙伴们,大家可以动手试试自定义一些字符串让他返回。

6、 智能合约部署

小伙伴们目前应该在当前页面吧!
图片

我们点击solidity按钮,进入solidity。

图片
我们进入编译器面板勾选(2)(3)选项, (2)是自动编译,(3)是自动优化。
图片

老师在这里创建了 FirstContract.sol文件,然后文件内容是上面的代码。下面我们将他进行部署到ETH网络。
图片
分为四部、先看保证我们要发布的合约在文本编辑面板中。然后点击运行的那个侧边图标进入运行面板,然后确定我们 (3)里面的合约是我们将要部署的合约,然后点击deploy按钮进行部署。
图片
部署成功后会在上面标记的(1),(1)位置多出这些内容,1的位置就是我们部署的智能合约,可以进行操作智能合约的方法。(2)的位置是本次部署情况。在前面有一个绿色的对好就说明我们部署成功了。我们点击(1)的位置,会将面板展开。如下图:
图片
我们点击 firstMethod 按钮以后会在下面一点展示返回信息也就是(2)的位置,返回的就是我们定义的 “I am first method !!!” ,(3)是本次执行call信息,一般我们执行失败后,会通过这里就行查看错误,这里不过多赘述。

7、 本期作业

大家按照本节中的智能合约模仿进行部署属于你们的智能合约,要求:合约名称为 ConfluxTask,方法名为 creatorDesc,返回为 “My Creator is XXX !!!” XXX是你们自己的微信号。

示例:
图片

8、 结束语

感谢小伙伴们阅读本文。有对conflux感兴趣的小伙伴可以添加我的微信(15832013094)或是龙老师微信(ye_pj2013),会拉大家进入conflux成神学院群。conflux成神学院所有课程永久免费,并且还有可能获得一定的外快,加入我们大家一起共同学习进步。

查看原文

赞 0 收藏 0 评论 0

小二 关注了专栏 · 7月6日

Java 小词典

百无一用是书生,春鸟秋虫自做声。

关注 927

小二 关注了专栏 · 7月6日

python无止境

公众号:Python猫

关注 229

小二 关注了用户 · 7月6日

TalkingData @talkingdata

TalkingData成立于2011年,是国内领先的数据服务提供商。TalkingData秉承“数据改变企业决策,数据改善人类生活”的愿景,围绕TalkingData SmartDP数据智能平台(TalkingData数据中台)构建“连接、安全、共享”的数据智能应用生态,致力于用数据+科技的能力为合作伙伴创造价值,帮助商业企业和现代社会实现以数据为驱动力的智能化转型。

关注 2081

认证与成就

  • 获得 0 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-02-15
个人主页被 37 人浏览