前往顾页
以后地位: 主页 > 精通Office > 其他教程 >

若何实现一个定制的智能合约地点

时候:2018-11-05 22:30来源:知行网www.zhixing123.cn 编辑:麦田守望者

我学习智能合约的一个首要路子就是在 DappRadar 看各个热点利用的源代码,前些天我在看  dice2win 的时候发明一个风趣的征象:固然它自从上线以来已多次摆设过智能合约,不过让人猎奇的是这些地点有一个特性,都有一个和名字很像的 「D1CE」前缀(因为的地点是十六进制的,所以字母 I 被改成了数字 1)。

 

若何实现呢,其实 ethereum 源代码里已给出答案:

func CreateAddress(b common.Address, nonce uint64) common.Address {
data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
return common.BytesToAddress(Keccak256(data)[12:])
}

也就是说,合约地点美满是由 address 和 nonce 决定的,如果我们希望用一个全新的账户来摆设合约,那么当它第一次摆设的时候,nonce 必定是 0,因而乎可以推断合约地点美满是由 address 决定的,顺着这个思路,我们只需不竭天生新的 address,然后判定它们第一次摆设的合约地点是不是满足定制的 pattern 便可,附上 golang 源代码:

编译后,当履行号令行的时候,指定你想要的 pattern 便可,一旦婚配成功,我们便可以经由过程天生的账户来摆设合约了,不过在摆设前你需求确保账户里有充足的以太来付出摆设用度。我在 ropsten 测试收集摆设了一个地点前缀定制为 ABCD 开首的合约:

 

import (
"encoding/hex"
"flag"
"fmt"
"regexp"
"sync"
"sync/atomic"

"github.com/ethereum/go-ethereum/crypto"
)

var (
concurrency = flag.Int("c", 10, "concurrency")
number = flag.Int64("n", 1, "number")
pattern = flag.String("p", "", "pattern")
)

func init() {
flag.Parse()
}

func main() {
var wg sync.WaitGroup

wg.Add(*concurrency)

reg := regexp.MustCompile("^0x" + *pattern)
nonce := uint64(0)

for i := 0; i < *concurrency; i++ {
go func() {
defer wg.Done()
run(reg, nonce)
}()
}

wg.Wait()
}

func run(reg *regexp.Regexp, nonce uint64) {
for *number > 0 {
key, _ := crypto.GenerateKey()
address := crypto.PubkeyToAddress(key.PublicKey)
contract := crypto.CreateAddress(address, nonce).Hex()

if !reg.MatchString(contract) {
continue
}

if atomic.AddInt64(number, -1) < 0 {
break
}

privateKey := hex.EncodeToString(key.D.Bytes())

fmt.Printf("Contract:\t%s\nAddress:\t%s\nPrivateKey:\t%s\n\n",
contract,
address.Hex(),
privateKey,
)
}
}


需求申明的是,源代码婚配的时候利用了正则,这可能有点慢,如果寻求更高的效力,可以捐躯一下婚配的矫捷度,经由过程「strings.HasPrefix」来按字符串婚配。

 
 
 

package main

------分开线----------------------------
标签(Tag):智能合约地点
------分开线----------------------------
保举内容
猜你感兴趣