介绍solidity 第一部分


一个简单的智能合约

首先来看个简单的例子

pragmasolidity^0.4.0;

contractSimpleStorage {

      uint storedData;

      function set(uintx) {

               storedData=x;

      }

      function get() constant returns(uint) {

               returnstoredData;

     }

}

pragmasolidity^0.4.0;//verson 0.4.0 or不破坏功能的newer verson (except 0.5.0),为了确保合同不会突然对新的编译器版本有不同的行为

在solidity意义上,合约是驻留在以太坊区块链傻姑娘的特定地址的代码(功能)和数据(状态)的集合。

要访问状态变量,不需要this.前缀

这个合同还没有做太多的事情(由于以太坊建造的基础设施),允许任何人存储一个单一的数字,世界上任何人都可以没有(可行的)一种方式阻止你发布这个数字。当然,任何人都可以set再次调用不同的值,并覆盖你的数字,但数字仍将存储在blockchain的历史。稍后,我们将看到如何强制实施访问限制,以便只有您可以更改号码。


Subcurrency示例

以下合同将实现加密货币的最简单形式。可以从稀薄的空气中生成硬coins,但只有创建合同的人才能够做到这一点(实施不同的发行计划很简单)。此外,任何人都可以相互发送coins,而不需要使用用户名和密码注册,只需要一个以太坊的密钥对。

pragma solidity^0.4.0;

contractCoin {

           // The keyword "public" makes those variables

          // readable from outside. 

         address public minter;

         mapping(address=>uint)public balances;

         // Events allow light clients to react on

         // changes efficiently.

         eventSent(addressfrom,addressto,uintamount);

         // This is the constructor whose code is

        // run only when the contract is created.

        functionCoin() {

               minter=msg.sender;

         }

        function mint(address receiver,uint amount) {

             if(msg.sender!=minter)return;

             balances[receiver]+=amount;

        }

        function send(address receiver,uint amount) {

                 if(balances[msg.sender]

                 balances[msg.sender]-=amount;

                 balances[receiver]+=amount;

                 Sent(msg.sender, receiver, amount);

        }

}

address public minter ;声明了可公开访问的类型为address的状态变量

address类型是160bit(位)的值,不允许有任何操作运算,适合存储属于外部人员的合同或密钥对的地址。

public关键字自动生成一个函数,允许您访问状态变量的当前值。函数如下所示:function minter() returns(address) {return minter; }

mapping(address=>uint)public balances; 这个类型将地址映射到无符号整数。映射可以被看作是哈希表,其被虚拟地初始化,使得每个可能的键存在并且映射到其字节表示全部为零的值。getter方法如下:

function balances(address _account) returns (unit){

                   Return  balances[_account];

}

event Sent(address from,address to,uint amount);用户界面(以及服务器应用程序)监听在区块链上发射的事件不用太多代价。一旦被激活,监听器会获取from,to,amount三个参数,为了监听这个事件,需要使用:

Coin.Sent().watch({},'',function(error,result) {

            if(!error) {

                  console.log("Coin transfer: "+result.args.amount+"                          coins were sent from "+result.args.from+" to                                 "+result.args.to+".");

                  console.log("Balances now:\n"+"Sender:                                        "+Coin.balances.call(result.args.from)+"Receiver:                         "+Coin.balances.call(result.args.to));

           }

})

特殊方法Coin是在创建合同期间运行的构造函数,之后不能被调用。它永久地存储创建合同的人的地址:msg(和tx、block)为全局变量,包含一些运行访问区块链的属性。msg.sender是当前(外部)方法调用的地址。

最后,像mint和send这些方法会以合约结束,然后可以被用户和合约调用。如果mint除了创建合同的账户之外的任何人调用,任何事情都不会发生。send可由任何人(已有一些硬币)向其他人发送硬币。注意,如果你使用这个合同向一个地址发送coins,你不会在区块链explorer上看到该地址的任何内容。因为你发送coins和更改余额的事实仅存储在这份特定coin合约的数据存储中。通过使用事件,创建一个跟踪新coin交易和余额的“blockchainexplorer”相对容易


区块链基础

区块链技术对于程序员来说不会很难理解,原因是大多数并发症(采矿,散列,椭圆曲线加密,对等网络...)都在提供一定的功能和承诺

交易

区块链是一个全球共享的事务型数据库。意味着每个参与到这个网络中的人都可以从数据库中读取条目。如果你想改变数据库中的数据,你需要创建一个被所有其他人接受的事务。交易这个词代表着你想要做的改变(假使你想要在同一时间改变两个值)不是完全被执行或者被应用的。同时,一旦你的交易被应用到数据库,别的交易不能改变它。

交易的处理满足数据库的原子性

此外,一次交易总是被发送方(创建者)加密签名。这直接保护了对数据库的特殊修改。在电子货币例子中,简单的检查确保只有持有账户密钥的人才能从中转帐

区块

需要克服的主要障碍在比特币术语中称为“双重花费攻击”,如果网络中存在两个交易都想清空一个账户,发生冲突,会发生什么?

交易的顺序会为你决定选择哪个,这些交易会被绑定到区块中,它们会被执行和分发到所有参与的节点。如果两个交易相互矛盾,那么第二笔交易将会被拒绝,而不是成为这个交易的一部分。

这些块在时间上形成一个线性序列,这也是“区块链”一词的来源。块以相当规则的间隔添加到链中-对于Ethereum大概是17秒。

作为“订单选择机制”(被称为“采矿”)的一部分,可能会发生块不时地回滚,但仅仅发生在区块链的顶部。顶部区块添加的越多,越不可能。所以你可能将你的交易回滚甚至从区块链中移除,但是你等待的时间越长,可能性越小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容