区块链开发(三)编写调试第一个以太坊智能合约@
李赫 2016-09-13 10:02 发布在 技术指南,竞争币 6 17757
一、 智能合约IDE简介
目前以太坊上支持三种语言编写智能合约,
Solidity:类似JavaScript,这是以太坊官方推荐语言,也是最流行的智能合约语言。具体用法参加Solidity文档,地址:https://solidity.readthedocs.io/en/latest/
Serpent:类似Python风格,文档地址:https://github.com/ethereum/wiki/wiki/Serpent
LLL:类似Lisp风格,目前已经被终止了。
可以根据不同的习惯选择不同的高级语言,目前最流行的是Solidity。本文所有的智能合约均为Solidity语言编写。
目前能够编写智能合约的IDE有常见几种:
Mix:是早期以太坊主要的开发IDE,可以支持智能合约和DAPP的编写、调试,部署,全图形化界面,但是随着原创主持人Gavin Wood的离开,慢慢边缘化,最终被停止开发,整个团队转向Remix项目,出于对未来的考虑,不建议学习Mix。
Remix:是原Mix团队的新作品,目前只有简单的Debug功能上线,未来可以重点关注一下。
browser-solidity:该项目是智能合约浏览器版本的开发环境,可以支持在浏览器中直接开发、调试和编译,对于初学者来说,可以快速上手,不需要安装,非常方便,直接访问地址使用:https://ethereum.github.io/browser-solidity/,本文采用此IDE进行开发。
Ethereum Studio:第三方公司开发的企业版智能合约在线IDE,功能强大,免费使用,可以作为企业级开发的一个工具,访问地址:https://live.ether.camp/
Visual Studio 2015:没错,就是微软的VS 2015,微软已经把以太坊的智能合约编写功能整合了,可以看出微软对以太坊的重视。
二、 编写第一个智能合约
1、 智能合约语法学习方法
智能合约的语法和示例可以在Solidity的文档网站http://solidity.readthedocs.io/en/latest/查看,基本上把这些在线文档看完,已经算精通了,剩下的只是实践编写代码。
2、 示例合约代码
首先,我们先给出一个示例代码,后面将以这个代码为例解释说明智能合约的编写和调试。
——————————————————————————————-
contract Votelihe {
struct Candidate {
uint votecount;
string name;
}
struct Voter {
bool voted;
}
mapping(address => Voter) public voters;
Candidate[] public candidates;
function Votelihe() {
candidates.push(Candidate({
name: “lihe”,
votecount: 0
}));
candidates.push(Candidate({
name: “dandan”,
votecount: 0
}));
}
function Vote_candidate(uint8 numCandidate)
{
if(voters[msg.sender].voted ||numCandidate>candidates.length)return;
candidates[numCandidate].votecount+=1;
voters[msg.sender].voted=true;
}
function Getcount() returns(string,uint,string,uint){
return(candidates[0].name,candidates[0].votecount,candidates[1].name,candidates[1].votecount);
}
}
————————————————————————————————–
该代码创建了一个投票程序,对两个候选人lihe和dandan进行投票,每个人只有一次投票的机会,最后反馈lihe和dandan的得票结果。各个函数说明如下:
function Votelihe():构造函数,智能合约只运行一次
function Vote_candidate():对候选人进行投票,每个投票者只能投一票
function Getcount():返回当前候选的得票数
3、 使用IDE编写智能合约
首先我们打开browser-solidity,IDE的主要功能如下:
将示例代码拷贝到左侧的代码编辑框,IDE将自动检测语法错误,并显示在右侧的窗口上,如下图所示:
可以看到,提示有未声明的对象,是在14行的错误,很明显是我一个结构对象candidates误写为candidates2了,修改一下即可校验通过。
注意,在浏览器里编写代码,他是自动保存在本地浏览器缓存里面的,只要清除浏览器缓存,代码不会丢失。
三、调试第一个智能合约
目前browser-solidity有两种常用的调试方式,一个是采用本地虚拟机调试模式,一个是连接到本地的私有链进行调试。
1、 本地虚拟机调试模式
本地虚拟机调试,就是不连接任何一个节点,在内存虚拟出一个以太坊节点进行调试,优点是速度快,配置简单,缺点是因为只是虚拟调试,可能最后放到真正的区块链节点上运行智能合约会和预想的结果不同。
首先在DEBUG环境设置中,选择JavaScript VM以设置本地虚拟调试模式,如下图:
设置成功后,可以在账号状态栏看到可以用的账户列表,如下图
智能合约代码编写好后,点击“Create”按钮部署智能合约到内存中,并进行调试,如果部署成功,会出现智能合约的函数运行按钮和参数输入框,然后就可以调试你的智能合约了,如下图:
运行函数后,会出现相应的交易数据,可以完成整个智能合约调试。
如果想逐步调试智能合约,那么选择小虫子图标,切换到逐步调试界面,即可实现单步运行智能合约,注意这里的单步运行不是指代码而是指智能合约编译后的OPCODE,如下图。
2、 连接到本地私有链调试
连接到本地私有链调试,就是通过RPC接口,连接本地的以太坊节点,实际部署并调试智能合约,缺点是速度较慢,配置复杂,优点是能够真实运行智能合约,最大程度的防止出错,关于私有链的配置,请参考我原先发表的文章《区块链开发(一)搭建基于以太坊的私有链环境》。
首先在DEBUG环境设置中,选择Web3 Provider以设置本地虚拟调试模式,同时默认会给出一个连接地址为http://localhost:8545,如果你配置的私有链RPC端口修改了,记得要改成对应的端口,如下图:
然后,切换到账号状态栏,此时显示的可用账号,应该都是你部署的私有链里面的账号,如果不是,说明没有成功连接私有链。可能的原因有两个,一是私有链提供的端口是用http访问,而browser-solidity的网页访问地址是https,解决的方法就是将browser-solidity访问地址改为http协议的地址即可http://ethereum.github.io/browser-solidity/;二是系统的时间没有和网络同步,使用windows系统自带的时间同步功能同步一下即可。
四、 其他常见智能合约资源
下面一些例子网站去参考一些成熟的代码,方便快速迭代学习,常见的例子网站如下:
https://github.com/ethereum/wiki/wiki/Solidity-Collections
http://ether.fund/contracts/
https://github.com/chriseth/solidity-examples
https://github.com/ethereum/dapp-bin
https://github.com/fivedogit/solidity-baby-steps
http://dapps.ethercasts.com
http://ether.fund/contracts
开发框架常用的有3个:
Truffle:说明书地址http://truffle.readthedocs.io/en/latest/
以太坊目前很流行的开发框架Truffle的说明书,这个框架比较流行。
Dapple:说明书地址http://dapple.readthedocs.io/en/master/
这个开发框架是在gitter chart上看到的,感觉用的人不多,先观察
Meteor:说明书地址https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor
这个开发框架是以太坊官方推荐的,写进了以太坊的官方wiki,值得学习,当然,以太坊官方经常转换方向,以后换别的也没准..
巴比特资讯http://www.8btc.com/ethereum-smart-contract
Wednesday, December 6, 2017
区块链开发(三)@
samrt contact test
开源工具和语言
一、brewMacOS包管理器
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
二、Solidity以太坊智能合约语言
brew install solidity
The GitHub credentials in the macOS keychain may be invalid.
Clear them with:
printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
Or create a personal access token:
https://github.com/settings/tokens/new?scopes=gist,public_repo&description=Homebrew
三、geth运行以太坊节点
liyuechun:Downloads yuechunli$ cd go-ethereum-1.5.9
liyuechun:go-ethereum-1.5.9 yuechunli$ pwd
/Users/liyuechun/Downloads/go-ethereum-1.5.9
liyuechun:go-ethereum-1.5.9 yuechunli$ make geth
建立私链
1. 创建一个文件夹来存储你的私链数据
liyuechun:1015 yuechunli$ mkdir privchain
liyuechun:1015 yuechunli$ pwd
/Users/liyuechun/Desktop/1015
liyuechun:1015 yuechunli$ ls
privchain
liyuechun:1015 yuechunli$
2. 使用geth
来加载
geth --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --dev --datadir privchain
INFO [10-15 03:14:50] IPC endpoint opened: /Users/liyuechun/Desktop/1015/privchain/geth.ipc INFO [10-15 03:14:50] HTTP endpoint opened: http://127.0.0.1:8545
privchain
文件夹里面,你会看到geth
, geth.ipc
, 和 keystore
。liyuechun:1015 yuechunli$ cd privchain/
liyuechun:privchain yuechunli$ ls
geth geth.ipc keystore
liyuechun:privchain yuechunli$
- 保持节点的运行,不要关闭终端,重新打开一个终端,使用
geth attach
连接节点,并且打开geth console
liyuechun:privchain yuechunli$ geth attach ipc:/Users/liyuechun/Desktop/1015/privchain/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.1-stable-05101641/darwin-amd64/go1.9.1
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0
>
3. 相关api命令
> personal.listAccounts
[]
>
> personal.newAccount('liyuechun')
"0xb6d7d842e7dc9016fa6900a183b2be26fc90b2d8"
>
liyuechun
是你账户的密码,输入你自己喜欢的密码。> personal.listAccounts
["0xb6d7d842e7dc9016fa6900a183b2be26fc90b2d8"]
>
4. web3命令
> web3.eth.coinbase
"0xb6d7d842e7dc9016fa6900a183b2be26fc90b2d8"
>
5. 编写智能合约代码
pragma solidity ^0.4.4;
contract test {
function multiply(uint a) returns(uint d){
return a * 7;
}
}
6. 获取智能合约字节码和abi
6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029
{
"contract_name": "test",
"abi": [
{
"constant": false,
"inputs": [
{
"name": "a",
"type": "uint256"
}
],
"name": "multiply",
"outputs": [
{
"name": "d",
"type": "uint256"
}
],
"payable": false,
"type": "function"
}
],
"unlinked_binary": "0x60606040523415600e57600080fd5b5b60978061001d6000396000f300606060405263ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663c6888fa18114603c575b600080fd5b3415604657600080fd5b604f6004356061565b60405190815260200160405180910390f35b600781025b9190505600a165627a7a723058203da73c4161a1751d52899e2da724076a62a935cb5e7ed4b29f7f49560675ab8d0029",
"networks": {},
"schema_version": "0.0.5",
"updated_at": 1508016118593
}
7. 在bejson中转义成字符串
{\"contract_name\":\"test\",\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"}],\"unlinked_binary\":\"0x60606040523415600e57600080fd5b5b60978061001d6000396000f300606060405263ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663c6888fa18114603c575b600080fd5b3415604657600080fd5b604f6004356061565b60405190815260200160405180910390f35b600781025b9190505600a165627a7a723058203da73c4161a1751d52899e2da724076a62a935cb5e7ed4b29f7f49560675ab8d0029\",\"networks\":{},\"schema_version\":\"0.0.5\",\"updated_at\":1508016118593}
7. 通过abi创建合约对象
> var contractInfo = JSON.parse('{\"contract_name\":\"test\",\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"multiply\",\"outputs\":[{\"name\":\"d\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"}],\"unlinked_binary\":\"0x60606040523415600e57600080fd5b5b60978061001d6000396000f300606060405263ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663c6888fa18114603c575b600080fd5b3415604657600080fd5b604f6004356061565b60405190815260200160405180910390f35b600781025b9190505600a165627a7a723058203da73c4161a1751d52899e2da724076a62a935cb5e7ed4b29f7f49560675ab8d0029\",\"networks\":{},\"schema_version\":\"0.0.5\",\"updated_at\":1508016118593}')
> myContract = web3.eth.contract(contractInfo.abi)
{
abi: [{
constant: false,
inputs: [{...}],
name: "multiply",
outputs: [{...}],
payable: false,
type: "function"
}],
eth: {
accounts: ["0x2abf46d8b0d940cdeedd55872bc0648add40227d"],
blockNumber: 384,
coinbase: "0x2abf46d8b0d940cdeedd55872bc0648add40227d",
compile: {
lll: function(),
serpent: function(),
solidity: function()
},
defaultAccount: undefined,
defaultBlock: "latest",
gasPrice: 0,
hashrate: 0,
mining: false,
pendingTransactions: [],
protocolVersion: "0x3f",
syncing: false,
call: function(),
contract: function(abi),
estimateGas: function(),
filter: function(fil, callback),
getAccounts: function(callback),
getBalance: function(),
getBlock: function(),
getBlockNumber: function(callback),
getBlockTransactionCount: function(),
getBlockUncleCount: function(),
getCode: function(),
getCoinbase: function(callback),
getCompilers: function(),
getGasPrice: function(callback),
getHashrate: function(callback),
getMining: function(callback),
getPendingTransactions: function(callback),
getProtocolVersion: function(callback),
getRawTransaction: function(),
getRawTransactionFromBlock: function(),
getStorageAt: function(),
getSyncing: function(callback),
getTransaction: function(),
getTransactionCount: function(),
getTransactionFromBlock: function(),
getTransactionReceipt: function(),
getUncle: function(),
getWork: function(),
iban: function(iban),
icapNamereg: function(),
isSyncing: function(callback),
namereg: function(),
resend: function(),
sendIBANTransaction: function(),
sendRawTransaction: function(),
sendTransaction: function(),
sign: function(),
signTransaction: function(),
submitTransaction: function(),
submitWork: function()
},
at: function(address, callback),
getData: function(),
new: function()
}
8. 检查coinbase账号余额
> account1 = web3.eth.coinbase
"0x2abf46d8b0d940cdeedd55872bc0648add40227d"
> web3.eth.getBalance(account1)
0
>
> miner.start();
null
>
miner.stop();
9. 停止挖矿,并且查余额
> miner.start();
null
> miner.stop();
true
> web3.eth.getBalance(account1)
1.152e+21
>
10. 解锁coinbase账号,我们通过coinbase账号来付费部署合约
liyuechun
: 换成你的密码。> personal.unlockAccount(account1, 'liyuechun')
true
>
11. 预估手续费
> bytecode = "6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
"6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
> web3.eth.estimateGas({data: bytecode})
Error: invalid argument 0: json: cannot unmarshal hex string without 0x prefix into Go struct field CallArgs.data of type hexutil.Bytes
at web3.js:3104:20
at web3.js:6191:15
at web3.js:5004:36
at :1:1
> bytecode = "0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
"0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
> web3.eth.estimateGas({data: bytecode})
98391
>
0x
。手续费大概为98391
wei
。12. 部署合约,为了方便理解,设置一个回调函数
> contractInstance = myContract.new({data: bytecode gas: 1000000, from: account1}, function(e, contract){
if(!e){
if(!contract.address){
console.log("Contract transaction send: Transaction Hash: "+contract.transactionHash+" waiting to be mined...");
}else{
console.log("Contract mined! Address: "+contract.address);
console.log(contract);
}
}else{
console.log(e)
}
})
Contract transaction send: Transaction Hash: 0x5e2aebbf400d71a32e807dc3f11f1053b6ee3b2a81435ed8ace2fa54eebb9f3d waiting to be mined...
{
abi: [{
constant: false,
inputs: [{...}],
name: "multiply",
outputs: [{...}],
payable: false,
type: "function"
}],
address: undefined,
transactionHash: "0x5e2aebbf400d71a32e807dc3f11f1053b6ee3b2a81435ed8ace2fa54eebb9f3d"
}
>
13. 你的合约等待挖矿,开始挖矿,等一会儿,停止
> miner.start()
null
> Contract mined! Address: 0xbf8b24283f2516360d3a4ba1db0df78ae74689db
[object Object]
> miner.stop()
true
>
14. 检查合约是否部署成功
> eth.getCode(contractInstance.address)
"0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a7230582067d7c851e14e862886b6f53dad6825135557fb3a4b691350c94ea5b80605f6770029"
>
15. 调用合约方法
> contractInstance.multiply.call(6)
42
>
call
的原因是因为multiply
函数没有添加constant
。pragma solidity ^0.4.4;
contract test {
function multiply(uint a) returns(uint d){
return a * 7;
}
}
Friday, September 15, 2017
基因说
《基因那些事儿》文字版 知道大家有没有注意到一个问题,近一两百年,是人类科技成果的“爆发期”,两次工业革命、信息技术的爆炸式发展,让人类拥有了非常强大的外在力量,只要愿意的话,毁灭个地球可能都不是问题。但是,从生物角度上看,我们人类本身,跟两千年以前比,并没有什么实质性的变化,有些能力甚至还在退化,你像视力、听力,可能比古代的平均水平差远了。你别看火箭能上太空,但是医院连我脸上的痘都治不好,更别说搞什么进化永生了。这反映了一件事儿:人类对于自身的研究水平,远远滞后于对外部这些东西的研究水平。所以今天,咱们就来聊聊和人类自身相关的科技,基因技术。 其实咱把眼光放得开阔一点,科技和创新真的远远不局限于电子产品,甚至不局限于互联网这个圈子。麻省理工评论(《MIT Technology Review》)去年评选了全球50家最具创新性的公司,除了苹果、Amazon、Tesla这些明星公司,还有近五分之一的公司,是做生物技术的,它们几乎全都跟“搞基”有关。我不说你可能都没听过,什么23andMe, illumina,OxfordNanopore,等等等等,名儿都特奇怪。而且最近,国内跟基因技术有关的概念股也是一路飘红,可见人类上九天揽过月,下五洋捉过鳖,今天终于到了对自己感兴趣的时候。 咱们一般人理解的基因公司,也就是做做基因检测,比如跟女朋友才认识四个月就有了自己的孩子,感觉很幸福,这时候你可能要测一测。其实基因技术还有更高级的应用,最重要的,就是治病保命。很多疑难杂症,病根儿出现在基因上,所以也只能通过基因技术得以解决,比如癌症,再比如一些遗传病,你像先天性失明;第二种,把生态环境变得更适合人类生存,比如榜单里边有个公司叫Intrexon,专门研究转基因蚊子,这种蚊子的后代死得很快,基本上出生就死了,研究它干什么用呢,抑制病毒传播,你像寨卡病毒,主要是通过蚊虫叮咬传染的,只要把这种转基因蚊子放到病毒爆发的地区,慢慢就会让这些有毒的蚊子断子绝孙;最后,基因技术还有一个伦理敏感的应用,那就是人类的基因优化,增强智商,强化体魄,培养出一些美国队长那样的超级战士,不是没有可能。要实现这一切,核心技术有两个:基因测序,以及基因编辑,这才是MIT榜单里大部分基因公司在干的事儿。 要聊这两个技术,咱们还是先简单说一下,基因到底是什么东西。说得装逼一点,基因是遗传信息的基本单位,是染色体或基因组的一段DNA序列。翻译成人话:你要把这世界看成一大网游,咱们都是游戏里的人物,那基因就是你的一段代码。如果说,零和一是电子世界的基本码,那么,DNA上的四种碱基分子,ATCG,就是生物世界的基本码;就是这些分子的特定排列顺序,决定了你的一切。 我们人体里大约有30亿对ACTG,2.5万个基因,它里边所蕴含的信息,那可海了去了,从你十八代祖宗从哪儿来,一直到你的颜值、性向,再到你容易得什么病,长寿还是短寿,其实在你出生的时候,差不多就都决定好了。但是,这么多信息,它的体积有多大呢,咱们做个小学数学题,在生物信息学中,四种碱基用二进制的00、01、10、11来表示,每个碱基分子的容量是2比特,8比特是1字节,所以它的体积应该是30×109×2÷8÷1000÷1000=750M,你的整个基因组,其实只有一部小电影那么大,还不是高清的,顶多是个720p。 那人类基因跟计算机代码比起来,有一个厉害的地方:信息存储效率特别高。二进制的一个数位上只有1和0两种选择,但是DNA一个数位上可以有ACTG 4个选择。你想啊,同样是10位数,二进制最多有210种组合,要是DNA,组合数可就是410,数学好的可以自己算算。更吊的是,0和1是虚拟的,虽然肉眼看不到,但是存在实体结构。DNA可是有空间结构的,旋转折叠不停歇。人体的基因组虽然小到肉眼根本看不到,但要是和拉面一样拉直了,能拉2米长,这伸缩能力,那可是完爆蚁人。所以除了序列信息以外,空间结构所蕴含的信息也相当丰富,这么一来DNA信息的存储效率就相当高了。现在,有些计算机科学家,玩生物跨界,借鉴DNA分子的存储方法,用ATCG来替代0和1,搞出了一种新的高效存储技术,叫DNA存储技术,微软正在做,据说一个立方毫米的DNA就能存储十亿字节的数据,这种技术如果得到大规模应用,那就厉害了,我们的手机这些智能设备的性能,可能还会有非常大的进步空间。但话又说回来,跟很多新技术一样,在未来很长一段时间里,它确实也没什么卵用,SSD还是主流,所以现实很骨感,毕竟人类的基因理论一共只有六十年,还没有新中国建国时间长呢。 好,欢迎回到科技相对论,我是王自如,咱们刚说到,基因其实就是一串代码,里边有很多很重要的信息,既然它是代码,那就意味着,它是有可能被读取和修改的。这就是咱们前边提到过的,基因测序,和基因编辑的技术。 基因测序 咱们先说基因测序,其实就是读代码,解读你的遗传信息。说到这儿,有个著名的例子,宅男女神,安吉丽娜·朱莉。她就做过这个基因测序,结果发现自己是一个“乳腺癌易感基因突变体携带者”,得乳腺癌的概率高达87%,另外还有50%的概率,会得卵巢癌。她一想,她的母亲、姥姥,还有大姨妈,都是得癌症去世的,所以毅然决然地,就直接把乳腺组织给切除了,你别想错了啊,乳腺,只是一个腺体,切除不影响外观。 不知道大家注没注意到,有些公司,非常低调,你一般发现不了,等你发现的时候,它已经默默地垄断了全球百分之七八十的市场,你比如前两年的大疆,要不是它那年业绩太好,过年给员工发奔驰当年终奖,拉了一波仇恨,可能还没多少人知道它呢。基因测序行业也有这么一公司,叫Illumina,跟小黄人那个开发商名字差不多(Illumination),逼格太高没有官方译名,我为了念着方便,就先管它叫小黄人公司,你注意这不是官方称呼啊。这个小黄人公司在基因测序这行的影响力,那就等于手机里边的三星苹果,无人机里边的大疆,默默地占领了全球百分之七十的市场份额。小黄人今天之所以能这么牛,是因为它有个厉害的产品,叫高通量测序仪,就是一种能读取DNA的设备,具体原理太复杂,咱就不讲了啊,说多了容易露馅。咱们说它为啥牛。 基因测序的难度有三个:成本、速度、数据解读。咱们先说成本。如果你对科技感兴趣,可能听过这个词儿,叫“人类基因组计划”,是一帮顶尖生物学家在上世纪90年代初提出来的,要解读人体的30亿对基因组,搞清楚它们都是干啥用的,当时的预算成本是多少,27亿美元。这件事儿干完以后,个人基因测序的成本大大降低,但一般人还是玩不起:零三零四年,你要做个个人的基因组测序,光成本就要三千到五千万美元,给你做这玩意,人家公司还得盈利吧,你得花个大几千万,才能做,等于好几十套深圳南山中心区的房,都是富豪玩的,一般人玩不起。又过了几年,技术进步,成本下降了一万倍,大概也要五六千美元,这时候,小黄人公司推出了一个新的测序平台,把成本降到了1000美元,到了今年年初,它们又更新了测序仪的产品线,声称要把测序成本控制在100美元以内。十五年的时间,成本从27亿到100块,你看这个速度,跟摩尔定律比,也不差啥了吧。就是因为成本的降低,基因测序技术才能从军用和科研下放到民用,你上网一搜,很多基因检测,产前诊断服务都冒出来了,而且连医院都不用去,直接京东上买就OK了。 而且,小黄人之所以能得到今天的行业地位,除了机器做得好,后边还有一个更重要的东西,那就是咱们经常提到的,大数据。一切规律都是从数据里分析出来的,你要想得到一个准确的基因检测结果,没有数据,那白搭。小黄人生产测序仪,一定会获得大量基因数据,它控制了数据,就等于站在了整个基因测序的产业上游,不抱它的大腿,你普通小公司根本解读不了基因密码。所以你看,数据无论在那个行业,都是非常重要的。 基因编辑 人类的欲望是无穷无尽的。既然人类能够解读这些遗传密码,肯定就要想办法去修改它们,这就是基因编辑技术。 前段时间,出了个让我们觉得挺不是滋味的事儿,河北科技大学,有个叫韩春雨的副教授,在牛逼杂志《自然:生物技术》上发表了一篇文章,就是关于新型基因编辑技术的。当时被称为“革命性的,有诺奖潜力的研究成果”,一时间是风光无限,什么2个亿的科研资金,长江学者提名,都来了,他也是欣然接受,结果全世界几个实验室尝试以后发现,这个韩副教授的关键实验数据,无法被重复验证,这也让人开始怀疑他的研究成果,而且更讽刺的是,现在连韩副教授自己都无法复制自己的实验数据了,这不是piapia打脸么?要知道对于这种“实用技术”来说,前无古人,后无来者可不是啥好事儿。所以,前两天这韩副教授就把稿子暂时给撤下来了。不管这事儿是学术造假,还是另有隐情,咱们还是不客气地说,韩春雨在研究成果有很大争议,未经证明的时候,就忙着接受各种荣誉,这吃相实在是有点难看。 回到技术上,现在世界上主流的基因编辑技术,叫CRISPR,利用这种技术,可以对生物的基因序列进行修改。为了方便你出去装逼,咱们还是简单说一下它的原理。它其实是利用了细菌的免疫系统,非常巧妙。 咱们上一季讲过人体免疫,有很多病,人只要得过一次,就不会再得了,比如水痘。这是因为,你的身体会记住曾经入侵过的病毒长啥样,下次它刚一出现,还没来得及让你生病呢,免疫系统就认出,这个是坏人,把它赶跑了。细菌的免疫系统也有这种功能。一个细菌,受到病毒攻击以后,没死,就会把这个外来病毒的DNA插到自己的DNA序列里边,存起来,相当于制造一个“黑名单”。下次再有病毒过来搞事情,它就先做个DNA识别,看看这个病毒的DNA在不在黑名单上,如果在的话,马上把它拖出去斩了。那么重点来了,你发现了吗:细菌的免疫系统可以实现对DNA的写入和删除,科学家一看,这真是厉害了,我要是能人工写一份“黑名单”进去,把病毒基因换成个人类基因,不就可以让细菌帮忙改变人类基因了吗,这就是CRISPR。这个技术的时间不长,四五年前,有个叫张峰的华人科学家,刚刚证明了,经过特定的改造后,CRISPR确实能用来编辑动物细胞中的基因,当时科学界一下就炸开了,这件事意味着,我们人类,终于不只是听天由命了,我们真正开始掌握了改造自身的技术,虽然一切才是刚刚开始。 当然,CRISPR还远远不完美,严格来说,它并不能百分百做到任何位置任何序列的编辑,对黑名单的编写标准也有“格式”上的要求,而我们前边提到的,韩春雨提出的那个技术(NgAgo),之所以会被看作是CRISPR的替代品,就是因为它没有这么多破事儿,只要是基因都能编辑,听起来很让人动心,只不过这到底是不是韩春雨一个人的自嗨乌托邦,那还是等时间来告诉我们吧。 基因技术的应用层次 好,欢迎回到科技相对论,我是王自如。咱们刚才聊到了当下热门的两种基因技术:基因测序和基因编辑,实现了对人类基因的阅读和修改。那么,掌握了这些技术,人类究竟会怎么把它应用到自己身上?咱们大胆地设想一下,可能有三个层次:第一,自我修复,治病,让你身体健康;第二,物种优化,通过基因技术,提升人的各项能力,比如智商,视力,肌肉力量,达到一个理想中人的状态;第三,成神。基因技术和其他技术结合,能不能碰撞出一些火花,比如让人实现永生,或者具备一些像X战警那种超能力,胜天半子,这就是科幻里的事儿了,咱们想想就得了。先说说第一个层次,自我修复:所谓的基因疗法,到底能不能治癌症。 去年有个让人非常感慨的事儿:魏则西。二十多岁的小伙子,独生子,不幸患上了滑膜肉瘤,被某搜索引擎的的竞价排名系统坑了。某武警医院(武警北京总队第二医院)的医生,说他们医院有一种“生物免疫疗法”,能治这个病。结果家里的钱都花完了,病也没有治好,当时在知乎上面的生命倒计时直播,让人看着心里真不是滋味。事件的详细过程和原因,谁该对这个事儿负责,网上有很多分析,咱们就不再赘述了。只说莆田系医生嘴里这个可以治疗癌症的“生物免疫疗法”,它其实就是一种基因细胞疗法。莆田系医生用的这种方法不靠谱,但客观来看,细胞疗法其实是挺大一个类别,可不要因为某度虚假宣传一棒子打死正牌军,在未来几年之内,基因细胞疗法确实将会成为治疗部分癌症的关键技术。这里我觉得有必要提一句,科技是严肃的,我们要保持清醒的头脑,小心某度,远离庸医。 谈到细胞疗法的正牌军,CAR-T现在可是最火的一项技术,而这技术火起来,可离不开一个小姑娘。EmilyWhitehead,(小姑娘的官网在此,http://emilywhitehead.com)2010年在Emily快5岁生日的时候,不幸被诊断为急性淋巴细胞白血病,一种极其可怕的血液癌症,而且,她在第一轮化疗的时候就受到了严重的感染,非常危险,医生计划给她骨髓移植,但在这期间,她的病情又急转直下,连骨髓移植都做不了了,当时所有医生都没办法了,只好死马当活马医,虽然话是糙了点,但在绝症面前,往往需要向死而生的一份决心。 我们知道,肿瘤细胞之所以能够肆虐,其实是因为他们确实跟正常细胞长得比较像,免疫细胞识别不出来,就干不掉它。但是,肿瘤细胞表面确实有些特殊的分子结构,如果能想办法,教会免疫细胞识别肿瘤细胞,就可以进行针对性的杀灭。这就是CAR-T疗法。小样儿,别以为为穿上马甲我就不认识你了。 这种疗法在当时是一种非常疯狂的试验性疗法,是没有选择的选择。它的技术关键,就在于一种经过基因改造的免疫细胞,可以说是究极版的免疫细胞。宾夕法尼亚大学的科学家把埃米莉的血抽出来,把免疫细胞都收集了起来,借助CRISPR等基因编辑技术对免疫细胞进行了彻底改装,教会它们如何识别特定肿瘤细胞,并重新输回Emily的身体里,这些经过改装的细胞就叫CAR-T细胞。结果,在Emily7岁的时候,所有血液指标就都已经恢复正常,现在也没有任何复发的迹象。 当然,我们这是简化的版本,Emily在治疗期间也不是没有遇到困难,涡轮增压版的免疫细胞可以在患者的血液和骨髓中增殖,每个CAR-T细胞可以杀死1000至90000个肿瘤细胞,真正的一夫当关万夫莫开。不过这么强的杀伤力难免会波及正常细胞,在回输后,Emily因为发烧住院,被送进特护病房插上呼吸机。医生通知家属埃米莉活过当晚的可能性只有千分之一,好在小姑娘挺过来了,也算是医学史上的奇迹。后来宾夕法尼亚大学与全球制药巨头诺华合作,对CAR-T进行优化开发,针对儿童和年轻人的 难治性复发性急性淋巴细胞白血病 治愈率超过了8成。 虽然CAR-T对于血液癌症的效果很好,但它现在并不能治疗所有癌症。要变成一种普及的癌症疗法,它现在还有三个比较大的阻碍。第一,要想让CAR-T识别并杀灭肿瘤细胞,科学家得先要把这个癌症研究透彻,得知道这个癌症细胞和正常细胞的基因究竟哪里有区别,要不然CAR-T进去了可是伤敌一千自损八百,病人很可能因为巨大的副作用而死亡。第二,它对于实体肿瘤的效果会大打折扣,一个比较形象的说法,它治疗血液癌症,那是打游击战,但治疗实体肿瘤,那是打攻坚战,难。那是因为实体肿瘤的肿瘤细胞都聚集成块,CAR-T只能一层一层地去杀灭,所以说是攻坚战;而血液中的癌细胞都四处游走,很容易就被CAR-T逮到了,这是游击战。第三,因为病人基因不同,癌症种类也不同,所以目前的CAR-T是一种定制疗法,这特别定制的东西都贵,为你改造好的CAR-T细胞别人就不能用,所以还是得有钱才行啊! 好,我们总结一下,作为细胞疗法的CAR-T确实能够治疗癌症,治愈率上那是传统方法没得比的;但治愈率是群体的,放到个人身上只有生和死。并不是所有癌症都适用于CAR-T,而因为定制疗法的缘故,治疗费用可能会让很多符合治疗条件的病人头疼,要下放到真正的消费级市场,可能还需时日,但前途是光明的。 基因技术的两面性 科技相对论,凡事都有两面性,前面我们都在讲,基因技术怎么好怎么牛逼,但事实上,基因技术的发展,也可能给我们带来很多新的,很可怕的问题。 第一个就是,你可能整天活在提心吊胆中。什么意思,就拿基因检测来说吧,首先,现阶段的消费级基因组测序,不能说是完全准确。这里边有技术上的原因,也有基因本身运行方式的原因,它的结果充满了不确定性。它可能让你苦不堪言。你想想,基因测序的结果告诉你,你有百分之二十的机会得肝癌,百分之八十的机会得前列腺癌,百分之十的机会,晚期牙癌,就算你知道它不一定准,你心里是不是也挺堵得慌。而且,你有没有想过,如果这个结果被人捅出去,保险公司还愿意为你提供保险服务吗?天下没有赔本的生意,我想大部分保险公司会选择no,即使是yes,保价肯定也不是平均价格。保险本来就是用来规避未来可能的风险,而现在不幸的人反而要为风险承担更多代价,细思极恐。这不是危言耸听,尽管美国加拿大都已经出台了《反基因歧视法》,但在测序成本下降到如此之低的现在,许多保险公司已将基因检测报告列为在参保前必须出示的材料,以商业逻辑来看,一点毛病没有,到那时候你还想知道自己的基因报告吗? 第二个,就是基因歧视。你想想,没有基因测序之前,我们还整天开地图炮,给人贴标签呢,东北的,开大众的,泛黄区的人,素质都有问题,是吧,没有英文名就做不成朋友,是吧。做了基因测序以后,你身体里30亿个碱基的最终解释权可就落到别人手里了,说你有神经病,你就有神经病。你现在找工作,找对象,可能只需要拿个体检报告,以后呢,可能就得做个基因测序了,你想想这多可怕。你找对象,除了房子车子要齐全,丈母娘可能还要看你的基因检测报告!!!粗暴一点说,基因上的屌丝可能连繁衍后代的机会都没有,而且再努力也没用,无助的你会不会觉得当初要是没被生下来就好了?这逻辑没错吧! 其实,有脑子的人,千万不要没事儿搞这种歧视。有个旅游网站Momondo(视频在此https://www.youtube.com/watch?v=7mqWYuKvbXY)做过一个有意思的测试,邀请了67名测试者问问他们觉得自己是哪个国家哪个种族,其中有相当一部分似乎很确定,甚至还会带点种族歧视和国家地区歧视。但DNA测试的结果下来,真是男人看了会沉默,女人看了会流泪。他们竟然人人有带有他们最看不上那群人的基因,打脸吧。 那最后一个问题,可能想得远一点了,基因技术可能会影响我们整个社会的运行机制,有个97年的科幻电影,叫《千钧一发》,它就描述了这么一个图景,一个基因决定命运的社会,只有基因精英,才能从事精英的工作,而基因不好的劣等人,只能去干社会最底层的工作,比如清洁工,这不是我职业歧视哈,是影片中的设定。这种社会运行模式,是高效但无情的,你生活的终极意义是什么呢,可能不只是为了成为一个社会机器吧。 结 论 好,时间差不多了,我们还是三句话总结一下今天的内容:第一,基因技术(基因测序和基因编辑的发展),让人类可以掌握自己的命运;第二,基因细胞疗法有可能治愈癌症,不是野鸡疗法;第三,要让基因技术更好地为人类服务,社会还要做好相关的伦理准备;
Sunday, April 23, 2017
ifc
Hi,我正在使用百度网盘,给大家分享"ihc-cn.com.broadlink.econtrol.plus-1.3.1.3088-7.apk",快来看看吧~http://pan.baidu.com/share/link?shareid=1619729695&uk=1493980954
another link
https://www.dropbox.com/s/ecusiqw42ikoges/ihc-cn.com.broadlink.econtrol.plus-1.3.1.3088-7.apk?dl=0
afr